์๋ฒ๋ฆฌ์ค๋?
๊ฐ๋ฐ์๊ฐ ์๋ฒ๋ฅผ ๊ด๋ฆฌํ ํ์ ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๊ณ ์คํํ ์ ์๋๋ก ํ๋ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ๊ฐ๋ฐ ๋ชจ๋ธ
์๋ฒ์์์ AWS์์ ์ ๊ณตํด์ฃผ๊ณ ๊ฐ๋ฐ์๋ ๋น์ฆ๋์ค๋ก์ง์ ์ง๋๋ฐ๋ง ์ง์คํ ์ ์๋ ๊ตฌ์กฐ
- ์จํ๋ ๋ฏธ์ค์์ ๋ฐ์ํ ์ ์๋ ์๋ฒ๊ตฌ์ฑ, ํดํธ, ํ์ฅ์ฑ ๋ฑ์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋จ
๊ธฐ์กด์ ์๋ฒ์์ ์ฌ์ฉ์ ์๊ฐ ๊ฐ์๊ธฐ ์ฆ๊ฐํ๋ ์ํฉ์ด ๋ฐ์ํ๋ฉด?
→ ์จํ๋ ๋ฏธ์ค๋ ๊ฐ์๊ธฐ ์๋ฒ๋ฅผ ํ์ฅ์ํฌ ์ ์์ผ๋ฏ๋ก ์๋ฒ๊ฐ ํฐ์ง๊ณ ์ด๋ ๋น์ฆ๋์ค์ ์ธ ์ํด๋ก ์ด์ด์ง
→ ๋์ด๋ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ์ธ๋ ฅ๋ ํ์ํจ..
→ ํ์ง๋ง, ํญ์ ๋ง์ ์์ฒญ๊ณผ ์ธ๋ ฅ์ด ํ์ํ ๊ฒ์ ์๋..
→ ์ ์ฐํ๊ฒ ์กฐ์ ์ ํ ์ ์์ผ๋ฉด ์ข๋ค!
์๋ฒ๋ฆฌ์ค๋ ์๋น์ค ์์ฒญ๋์ ๋ฐ๋ผ ๋ณํ์ง์๊ณ ํญ์ ๊ฐ์ ํ์ง์ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ฝ๋๋ก ํจ
- AWS ๊ฒฐ์ ์๋ ์ค์ ํ๊ธฐ (๋น์ฉ ๋ฐ์ ์ ์ ๊ณ์ ์ ์๋ฆผ์ ๋ฐ์ ์ ์๋ค)
์๋ฒ๋ฆฌ์ค ์ดํ๋ฆฌ์ผ์ด์
- ์คํ์์์ง์ ์์ฒญ/๋ฐ์ดํฐ,๋ฆฌ์์ค ๋ณํ → AWS Lambda → AWS ์๋น์ค/์ธ๋ถ์๋น์ค
- Event๋ฐ์ → API Gateway → Function(Lambda) → Service(DynamoDB)
์ ์ฒด ๊ตฌ์กฐ
- DynamoDB
- [v] id๋ฅผ ๊ธฐ๋ณธํค๋ก ๊ฐ์ง๋ Cards ํ ์ด๋ธ ๋ง๋ค๊ธฐ
- [v] getCards ๋๋ค ํจ์ ๋ง๋ค๊ณ ์คํํด๋ณด๊ธฐ
- [v] DynamoDB ํ
์ด๋ธ ์์ฑ ํ ๋๋ค์์ ํธ์ถํ๊ธฐ
- getCards (lambda)
๋๋ค๋ฅผ ์คํํด๋ณด๋ฉด dynamodb์ ์ ๊ทผ ๊ถํ์ค์ ์ ๋ฐ๋กํ์ง์์์ ์ ๊ทผ ์คํจํ๋ค.var AWS = require("aws-sdk"); var documentClient = new AWS.DynamoDB.DocumentClient({ apiVersion: "2012-08-10", }); const tableName = "Cards"; exports.handler = async (event) => { console.log("Received: " + JSON.stringify(event, null, 2)); // ์ด๋ฒคํธ๋ jsonํ์ let response = ""; try { var params = { TableName: tableName, }; const cards = await documentClient.scan(params).promise(); // callback version // documentClient.scan(params, function (err, data) { // if (err) console.log(err); // else console.log(data); // }); response = { statusCode: 200, body: JSON.stringify(cards), }; } catch (exception) { console.error(exception); response = { statusCode: 500, body: JSON.stringify({ "Message: ": exception }), }; } return response; };
{
"statusCode": 500,
"body": "{\"Message: \":{\"message\":\"User: arn:aws:sts::702313069121:assumed-role/getCards-role-1esmqsch/getCards is not authorized to perform: dynamodb:Scan on resource: arn:aws:dynamodb:ap-northeast-2:702313069121:table/Cards\",\"code\":\"AccessDeniedException\",\"time\":\"2022-04-05T15:36:45.562Z\",\"requestId\":\"6OQAID000OOK9G15VTIF2K81O3VV4KQNSO5AEMVJF66Q9AS????G\",\"statusCode\":400,\"retryable\":false,\"retryDelay\":34.93873688660772}}"
}
[v] IAM์ผ๋ก CloudWatch์ DynamoDB์ ์ ๊ทผ ๊ถํ ์ค์ ํ๊ธฐ
ํจ๊ป ์ฌ์ฉํ๋ IAM ์ฌ์ฉ์AWS SAMํ์ํ ์์ ์ ์ํํ ์ ์๋ ์ถฉ๋ถํ ๊ถํ์ด ์์ด์ผ ํจ
- ์ ์ ๊ณ์ ์์ฑํ๊ธฐ
- asw-cli ์ค์นํ aws configure๋ก ๊ณ์ ์ค์ ํ๊ธฐ
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"dynamodb:PutItem",
"dynamodb:DeleteItem",
"dynamodb:Scan",
"dynamodb:UpdateItem"
],
"Resource": "arn:aws:???:table/Cards"
},
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:???:???:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:???:log-group:/aws/lambda/*"
]
}
]
}
- db์ ๊ทผ๊ณผ Cloudwatch์ ๊ทผ ๊ถํ์ ๊ดํ ์ ์ฑ
์ ์ค์ ํ๋ค
- dynamodb์ Cardsํ ์ด๋ธ์ ์ฝ์ , ์ญ์ , ์์ , ๊ฒ์ ํ์ฉ
- Cloudwatch ๋ก๊ทธ ํ์ฉ (๋๋ค์ ๋ํด)
- ์ด๋ฅผ ํฉ์ณ ํ๋์ Role(์ญํ )๋ก ๊ตฌ์ฑ
- ์ด์ ์ญํ ์ ‘์ฌ์ฉ์๊ทธ๋ฃน'์ ๋ถ์ฌํ ์ ์๋ค.
- User๊ณ์ - Group ← Policy → Role
- IAM
- [v] API ๊ฒ์ดํธ์จ์ด ๊ตฌ์ถํ๊ธฐ
- path์์ ์ฌ์ฉํ ์๋น์ค ์ ํ๊ณผ ๋ฆฌ์ , ํจ์๋ฅผ ์ ํ
- End Point๊ฐ ์ฃผ์ด์ง๊ณ Gateway๋ฅผ ๊ฑฐ์น๋ ํ ์คํธ๊ฐ ๊ฐ๋ฅํด์ง๋ค.
- /kanban/cards ๋ฉ์๋ ํ๋ฆ
-> (ํด๋ผ์ด์ธํธ -> ๋ฉ์๋ ์์ฒญ -> ํตํฉ ์์ฒญ -> ํตํฉ ์๋ต- > ๋ฉ์๋ ์๋ต -> ํด๋ผ์ด์ธํธ)
Rate ์ Burst์ ๋ํด..
Rate : 10000 (1์ด๋์ 10000๊ฐ๊น์ง ์ฒ๋ฆฌ๊ฐ๋ฅ)
Burst : 5000 (๋์์ 5000๊ฐ ๊น์ง ์์ฒญ์ ๋ฐ์๋ค์ผ ์ ์์, ์ด๋ฅผ ๋์ผ๋ฉด ๊ฑฐ๋ถ๋จ)
๋ฐ๋ผ์, Burst๋ Rate๋ณด๋ค ๋์ ์ ์๋ค. (API Gateway ์ค์ ๊ฐ๋ฅ)
์์ฒญ1 → runtime → func() 1๋ฒ
์์ฒญ2 → runtime → func() 2๋ฒ
์์ฒญ 1๋ฒ์ด ์์ง ์๋๋ฌ๋ค๋ฉด 2๋ฒ ๋ฐํ์์ ์๋ก ์คํ์ํจ๋ค.
์ด ๋๋ค ๋์์ฑ์ ์ค์ ํด์ค ์ ์๋ค. 1000๊ฐ๋ฉด ํ ๋ฆฌ์ ์ ์ต๋ 1000๊ฐ ๊น์ง ๋์ ์์ฑ
๋๋ค ๋์์ฑ์ Rate, Burst์ค์ ๊ณผ ํจ๊ป ๋ง์ถฐ์ ์ฌ์ฉํด์ผํ๋ค. ํ์ชฝ๋ง ํฌ๊ฑฐ๋ ์์ผ๋ฉด ๋ค๋ฅธ์ชฝ์ ์ค์ ์ด ๋ฌด์๋ฏธํด์ง๋ค.
AWS SAM
๋ค์ ์ค์นAWS SAMmacOS์ CLI ์ฌ์ฉ
AWS๊ฐ ์๋ ๋ก์ปฌ ํ๊ฒฝ์์ ํ ์คํธ
AWS CLI - AWS SAM CLI - DOCKER(๋ก์ปฌํ๊ฒฝ๊ตฌ์ฑํํ ์คํธ์ฉ)
SAM (Serverless Application Model)
์๋ฒ๋ฆฌ์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ API Gateway, ํจ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด YAML ํํ์ ๊ตฌ๋ฌธ์ ์ ๊ณตํ๋ ํ์ผ
- ๋จ ๋ช์ค๋ง์ผ๋ก ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ณ ๋ชจ๋ธ๋งํ ์ ์๋ค
- deploy์ CloudFormation ๊ตฌ๋ฌธ์ผ๋ก ๋ณํ๋์ด ์๋ฒ๋ฆฌ์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ ์ ์๋ค
SAM Template
template.yml ์ Lambda, IAM, API Gateway ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊น์ง ์ฝ๋ ๋ช์ค๋ก ์ ์ํด IAC๊ฐ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
์์ธํ ์ค์ ๋ฐฉ๋ฒ์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์.
AWS SAM resource and property reference
SAM CLI
์๋ฒ๋ฆฌ์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก์ปฌ ๋๋ฒ๊น , ๋น๋, ๋ฐฐํฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋๊ตฌ
- sam init
- ์ฒ์ ๋ง๋ค๊ธฐ ์ข์ Template์ ์ ๊ณตํด์ค๋ค
- sam build
- ์๋ฒ๋ฆฌ์ค ์์ฉ ํ๋ก๊ทธ๋จ์ ๋น๋
- sam deploy
- AWS ํด๋ผ์ฐ๋์ ์๋ฒ๋ฆฌ์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌ
- sam local
- ๊ฐ๋ฐ์ ์ํ ๋ก์ปฌ ํ ์คํธ ๋๊ตฌ
SAM-Lambda-CRUD example code
๋ก์ปฌ์์ lambda test๊ฐ ๊ฐ๋ฅํ๋๋ก docker๋ก dynomodb๋ฅผ ์คํ์์ผ ์ฐ๊ฒฐํ ์ฝ๋์ ๋๋ค. (docker-compose.yml ํ์ฉ)
https://github.com/Parkyunhwan/AWSLambda-crud-ex
์ค์ ํ์ ์๋ SAM lambda๋ฅผ ๋๋ฒจ๋กญ์์ผ์ typescript์ inversify๋ฅผ ์ ์ฉ์์ผ ioc์ปจํ ์ด๋ ์ญํ ์ ๋ด๋นํ๊ฒ ๊ตฌ์ฑํ์๋ค. ์คํ๋ง์์๋ง ์จ๋ดค๋ DI๋ฅผ tsํ๊ฒฝ์ ์ ์ฉ์์ผ๋ณด๋ ํฅ๋ฏธ๋ก์ ๋ค. ioc์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํด์ ์์ค ๊ตฌ์กฐ ๋ํ controller, service, repository๋ก ์ต์ํ๊ฒ ๊ตฌ์ฑํ ์ ์์๋ค.
'๐ป..Tech..๐ป' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โก๏ธ Scale Out๋ ํ๊ฒฝ์์ ์ธ์ ๊ด๋ฆฌ๋ฐฉ๋ฒ โก๏ธ (0) | 2022.06.16 |
---|