์๋ฒ๋ฆฌ์ค... ๋ค์ด๋ ๋ดค์ง๋ง ๋ฐ๋ก ์ฐพ์๋ณธ ์ ์ ์์๋ค.
์ด๋ฆ๋ง ๋ค์์ ๋๋ ์๋ฒ๋ฅผ ์ฐ์ง ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์
?? ์ํคํ
์ณ?? ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
(์ด๊ฑฐ ์๋๋ค.)
์๋ฒ๋ฆฌ์ค๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์๋ฒ๋ฅผ ๋ง๋ค์ง ์๊ณ ๊ด๋ฆฌํ์ง ์๋ ๊ฒ์ ๋งํ๋ค.
์๋ฒ๋ ์ด๋๊ฐ์ ์๊ณ ์ฐ๋ฆฌ๋ ๊ทธ ์๋ฒ์์ ์คํ์ํฌ ์ฝ๋๋ง ์ฌ๋ ค์ฃผ๋ฉด ๋๋ค.
AWS๋ ์ด๋ฐ ์๋ฒ๋ฆฌ์ค ์ํคํ
์ฒ๋ฅผ ์ํด ๋ํ์ ์ผ๋ก Lambda๋ฅผ ์ง์ํ๋ค.
Lambda๋ฅผ ์ด์ฉํด์ ์๋ฒ๋ฆฌ์ค๋ฅผ ๊ฒฝํํด๋ณด์.
ํจ์๋ฅผ ์์ฑํ๋๋ฐ ์ฌ๋ฌ๊ฐ์ง ์ต์
์ ์ง์ํ๋ค. ์ฒ์์ด๋๊น ์๋ก์์ฑ
์ต์
์ผ๋ก ์์ฑํ๋ค.
๋ค์์ผ๋ก ํจ์์ด๋ฆ๊ณผ ์ฝ๋๊ฐ ์คํ๋ ํ๊ฒฝ์ ์ ํํ๋ค.
๋๋ Flask ๊ธฐ๋ฐ API๋ฅผ Lambda์์ ๋๋ ค์ผ ํ๋ฏ๋ก ํ์ด์ฌ ํ๊ฒฝ์ ์ ํํ๋ค.
์์ฑํ๋ฉด ์ฝ๋ํธ์ง๊ธฐ์ ํ์ด์ฌ ์์ ์ฝ๋๊ฐ ๋ณด์ธ๋ค.
๋ด๊ฐ ํ ๊ฒ์ Lambda์ Flask API๋ฅผ ์ฌ๋ฆฌ๊ณ ํด๋น API์ ์ ๊ทผํด๋ณด๋ ๊ฒ์ด๋ค.
API๋ ์ด๋ป๊ฒ๋ ์ฌ๋ฆฌ๋ฉด ๋ ๊ฒ ๊ฐ๊ณ ์ด๋๋ก ๋ฌด์จ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผ์ ํด์ผ ํ๋์ง๊ฐ ๋ฌธ์ ๋ค.
Lambda๋ ๋ฐ๋ก ์ ๊ทผ๊ฐ๋ฅํ ์ํธํฌ์ธํธ๋ฅผ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ ์ํธํฌ์ธํธ๋ฅผ ๋ถ์ฌ์ค์ผ ํ๋ค. ์ํธํฌ์ธํธ์ ์ญํ ์ API Gateway
๊ฐ ์ํํ๋ค.
API Gateway
๋ ํธ๋ฆฌ๊ฑฐ์์ ์ค์ ๊ฐ๋ฅํ๋ค. Lambda ํจ์๋ฅผ ๋ฐ๋? ์ํฌ ์ ์๋ ์ฌ๋ฌ ์กฐ๊ฑด์ด ์๋๋ฐ ๊ทธ ์ค API Gateway
์ ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
ํธ๋ฆฌ๊ฑฐ๋ก ๋ฑ๋ก๋ API Gateway
๋ฅผ ์์ฑํ๋ค.
์ ํ์ REST API
๋ก ํด์คฌ๊ณ ๋ฐ๋ก ์ํธํฌ์ธํธ ์ ๊ทผ์ ๋ณด์์ค์ ์ ํด์ฃผ์ง ์์๋ค.
์์ฑํ๋ฉด API Gateway
์ ์๋ํฌ์ธํธ๋ฅผ ํ์ธํ ์ ์๋ค.
์ด์ ํด๋น ์๋ํฌ์ธํธ๋ก ์ ๊ทผํ๋ฉด ์์ ์์๋ก ์์ฑ๋ ํจ์๊ฐ ์คํ๋ ๊ฒ์ด๋ค.
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด json
์ผ๋ก ์ํ์ฝ๋์ Hello from Lambda!
๋ฅผ ๋ฆฌํดํ๋ฏ๋ก ์ํธํฌ์ธํธ๋ก ์ ๊ทผํ๋ฉด Hello from Lambda!
๊ฐ ๋ณด์ฌ์ผ ํ๋ค.
์ด์ API Gateway
์ ์๋ํฌ์ธํธ ํตํด Lambda
ํจ์์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
API๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋๋๋ ๊ฒ์ ๋งค์ฐ ํ๋ฒํ๊ณ ๋น๋ฒํ ์ผ์ด๋ค.
๋๋ฌธ์ Lambda
์์ API๋ฅผ ๋๋ฆด ๊ฒฝ์ฐ ์ด๋ป๊ฒ DB๋ฅผ ์ฐ๋ํ ์ ์๋์ง ์์์ผ ํ๋ค.
์ฐ์ ์ฐ๋์ ์์ RDS
๋ฅผ ํ๋ ์์ฑํ๋ค. DB์์ง์ MySQL์ ์ฌ์ฉํ๋ค.
RDS
์์ฑ์ ์ฃผ์ํ ๊ฒ
ํ์ด์ฐธ์ ํด๋ผ์ด์ธํธ ํด๋ก ์ด์ฉํ๊ณ ํ ์คํธ๋ฅผ ์ํ ์คํค๋ง, ํ ์ด๋ธ์ ๊ตฌ์ฑํ๋ค.
[ ์คํค๋ง ์์ฑ ]
create schema test_schema DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
[ ํ
์ด๋ธ ์์ฑ ]
create table board (
id int auto_increment,
title vatchar(100) null,
content text null,
constraint board_id primary key (id)
);
์๋์ ๊ฐ์ด ํ
์คํธ API ์ฝ๋๋ฅผ ์์ฑํ๋ค.
DB ์ปค๋ฅ์
์ ๋ฐ์์ค๊ณ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ title
๊ณผ content
๋ฅผ DB์ ์ ์ฅํ๋ API์ด๋ค.
์ด ์ฝ๋๋ฅผ ๊ทธ๋๋ก Lambda
์ ์ฝ๋ํธ์ง๊ธฐ์ ์ฎ๊ฒจ์ค๋ ์คํ๋์ง ์๋๋ค.
์ง๊ธ ์ฐ๋ฆฌ ์ฝ๋๋ DB์ฐ๊ฒฐ์ ์ํด pymysql
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์๋ก ํ๋ค. ํ์ง๋ง Lambda
์๋ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํจ๊ป ์ฌ๋ ค์ค์ผ ํ๋ค.
์ฌ๋ฆฌ๋ ๋ฐฉ์์ด S3
์ ์๋ ํ์ผ์ ์ฌ๋ฆฌ๋ ๊ฒ๊ณผ zip
ํ์ผ์ ์ฌ๋ฆฌ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ๋ค. ์์ถํด์ ์ฌ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ํด๋ณด์.
import json
import pymysql
def db_ops():
try:
connection = pymysql.connect(
host='RDSํธ์คํธ',
user='ID',
password='PW',
db='DB์ด๋ฆ',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
except pymysql.MySQLError as e:
print("connection error!!")
return e
print("connection ok!!")
return connection
def lambda_handler(event, context):
body = json.loads(event['body'])
conn = db_ops()
cursor = conn.cursor()
cursor.execute("insert into board(title, content) value('" + body['title'] + "', '" + body['content'] + "')")
conn.commit()
return {
"statusCode": 200,
"body": json.dumps({
"message": "success",
}),
}
๋ณดํต์ ๊ฒฝ์ฐ ๊ฐ์ํ๊ฒฝ(venv)์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ์ง๋ง ์ด๋ฒ์๋ ๋ฐ๋ก ํด๋๋ฅผ ์ง์ ํด์ ์ค์นํด ์ค ๊ฒ์ด๋ค.
๋ฃจํธํด๋์ ๋๊ณ ์ ์ฒด๋ฅผ ์์ถํด๋ฒ๋ฆฌ๋ฉด Lambda
์ ์
๋ก๋์ ์ฉ๋์ด ๋๋ฌด ํฌ๋ค๋ ์๋ฌ๋ฅผ ๋ฐ์ ์ ์๋ค.
์ด๋ฏธ ํ์ด์ฌ ์๋ฒ๋ฅผ ๊ตฌ๋์ ํ์ํ ํ๊ฒฝ์ Lambda
์ ๊ตฌ์ถ๋์ด ์๋ ๊ฒ ๊ฐ๋ค. ์ถ๊ฐ๋ก ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์คํ์ฝ๋๋ง ์ฌ๋ ค์ฃผ๋ฉด ๋๋ค.
pip install --target ./test pymysql
ํด๋๊ฐ ํ๋ ์์ฑ๋๊ณ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค์น๋์ ๊ฒ์ด๋ค.
์ด์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋ํ์ผ๋ ์ด ํด๋ ์์ผ๋ก ์ด๋ํด์ค๋ค.
์๋์ ๊ฐ์ ๊ตฌ์กฐ๊ฐ ๋๋ค.
์ด์ test
ํด๋์ ํ์ผ๋ค์ ์์ถํ๋ค.
test
ํด๋๋ก ์ด๋ํด์ ์๋ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ค.
zip -r test.zip ./*
-r: ๋๋ ํ ๋ฆฌ๊น์ง ์์ถ
์์ถ์ ํ๋ฉด ์๋์ ๊ฐ์ด ํด๋ ์์ ์์ถ๋ณธ์ด ์์ฑ๋๋ค.
์ด์ ์ด ์์ถํ์ผ์ Lambda์ ์
๋ก๋ํ๊ณ ๋ฐฐํฌํ๋ฉด ๋๋ค.
์
๋ก๋๊ฐ ๋์ผ๋ฉด ์ด์ ํฌ์คํธ๋งจ์ ํตํด ํ
์คํธ๋ฅผ ํด๋ณด์
๊ฒฐ๊ณผ๋ success !!
์ ๋ง ์ฑ๊ณต์ด๋ผ๋ฉด DB์ ๊ฐ์ด ์ฝ์
๋ผ ์์ด์ผ ํ๋ค.
GoooooooooooD
2์ฐจ ํ๋ก์ ํธ์์ ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ ๋ก์ปฌ์์๋ ์ ๋๋ค๊ฐ EB์ ๋ฐฐํฌํ๋ฉด ๋ง์ฝ์ ๋ถ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ์์๋ค. ๊ตฌ๊ธ๋ง๊ณผ ํํฐ๋์ ๋์์ผ๋ก EB๋ ์ค์ผ์ค๋ฌ๋ฅผ ์คํ์ํค๊ธฐ ์ ํฉํ์ง ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
์?
EB๋ ๋์ ์ผ๋ก ์ธ์คํด์ค๋ฅผ ์กฐ์ ํ๋๋ฐ ์ธ์คํด์ค๊ฐ ๋์ด๋ฌ์ ๋ ์ค์ผ์ค๋ฌ๋ ์ด๋ป๊ฒ ๋์ํด์ผ ํ ๊น?? ๋ต์ด ์๊ฐ๋์ง ์๋๋ค. ์ด๊ฒ ์ด์ ๋ค .. ๋ฌผ๋ก ๋ฐฉ๋ฒ์ ์๊ฒ ์ง๋ง ๋ฐฉ๋ฒ์ ๋ถ๊ณผํ ๋ฟ ์ต์ ์ ์๋ ๊ฒ ๊ฐ๋ค.
์ด๋ฐ ๋ฌธ์ ๊ฐ ์์ ๋ ํํฐ๋์ด ๊ทธ๋ฐ๊ฑฐ๋ Lambda์ ์ฌ๋ ค์ ๊ด๋ฆฌํ๋ฉด ์ข๋ค๊ณ ํ์ จ๋ค. ๊ทธ๋๋ ํ๋ก์ ํธ ๊ธฐํ์ ๋ง์ถ๋ ๊ฒ ๊ธํด์ ๊ทธ๋ฅ EC2์ ์ฌ๋ ค์ ์ง์ ๊ด๋ฆฌํ์ง๋ง ์ด๋ฒ์ Lambda๋ฅผ ๋ฐฐ์ฐ๋ ๋ฌด์จ ๋ง์ธ์ง ์กฐ๊ธ ์ ๊ฒ ๊ฐ์๋ค.
Lambda๋ ์์ฒญ์ด ์์ ๋๋ง ๋น์ฉ์ด ๋ถ๊ณผ๋๋ค๊ณ ํ๋ค. ๋งค์ผ? ๋งค์ฃผ? ๋งค๋ฌ ์ด๋ ๊ฒ ์คํ๋๋ ์ค์ผ์ค๋ฌ์ ์์ฃผ ์ ํฉํ๋ค๋ ์๊ฐ์ด ๋ ๋ค. Lambda์์ ์กฐ๊ธ ๋ฌธ์ ๊ฐ ๋๋๊ฒ ๋์์ฑ ๋ฌธ์ ? ์ธ ๊ฒ ๊ฐ์๋ฐ ์ค์ผ์ค๋ฌ๋ ํด๋น๋์ง ์๋ ์๊ธฐ๋๊น ์ด๋ฒ์ ๊ผญ Lambda๋ก ์ค์ผ์ค๋ฌ ๋ถ๋ถ์ ์ฎ๊ฒจ์ผ๊ฒ ๋ค.
๋ค ์ข์๋ฐ ๊ทธ๋ง ๊ฐ์ ธ๊ฐ ใ
ใ
ํฌ๋ ๋ง ์ข ์ค์ ..๐ญ
AWS๊ฐ ๊ฐ์ ธ๊ฐ๋ ๋์ ๋ค์ 0์ด ๋ ๊ฐ์ฏค ๋ ๋ถ๋ ๋๋์ด๋ค..๐ฅบ