๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป..Tech..๐Ÿ’ป

์„œ๋ฒ„๋ฆฌ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

์„œ๋ฒ„๋ฆฌ์Šค๋ž€?

๊ฐœ๋ฐœ์ž๊ฐ€ ์„œ๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•  ํ•„์š” ์—†์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐœ๋ฐœ ๋ชจ๋ธ

์„œ๋ฒ„์ž์›์„ AWS์—์„œ ์ œ๊ณตํ•ด์ฃผ๊ณ  ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค๋กœ์ง์„ ์งœ๋Š”๋ฐ๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ

  • ์˜จํ”„๋ ˆ๋ฏธ์Šค์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„๊ตฌ์„ฑ, ํดํŠธ, ํ™•์žฅ์„ฑ ๋“ฑ์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋จ

๊ธฐ์กด์˜ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž ์ˆ˜๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ฆ๊ฐ€ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด?

→ ์˜จํ”„๋ ˆ๋ฏธ์Šค๋Š” ๊ฐ‘์ž๊ธฐ ์„œ๋ฒ„๋ฅผ ํ™•์žฅ์‹œํ‚ฌ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์„œ๋ฒ„๊ฐ€ ํ„ฐ์ง€๊ณ  ์ด๋Š” ๋น„์ฆˆ๋‹ˆ์Šค์ ์ธ ์†ํ•ด๋กœ ์ด์–ด์ง

→ ๋Š˜์–ด๋‚œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ธ๋ ฅ๋„ ํ•„์š”ํ•จ..

→ ํ•˜์ง€๋งŒ, ํ•ญ์ƒ ๋งŽ์€ ์š”์ฒญ๊ณผ ์ธ๋ ฅ์ด ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹˜..

→ ์œ ์—ฐํ•˜๊ฒŒ ์กฐ์ ˆ์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๋‹ค!

์„œ๋ฒ„๋ฆฌ์Šค๋Š” ์„œ๋น„์Šค ์š”์ฒญ๋Ÿ‰์— ๋”ฐ๋ผ ๋ณ€ํ•˜์ง€์•Š๊ณ  ํ•ญ์ƒ ๊ฐ™์€ ํ’ˆ์งˆ์˜ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์‰ฝ๋„๋ก ํ•จ

  • AWS ๊ฒฐ์ œ ์•Œ๋žŒ ์„ค์ •ํ•˜๊ธฐ (๋น„์šฉ ๋ฐœ์ƒ ์ „์— ๊ณ„์ •์— ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค)

https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html#turning_on_billing_metrics

 

์˜ˆ์ƒ AWS ์š”๊ธˆ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฐ์ œ ๊ฒฝ๋ณด ์ƒ์„ฑ - Amazon CloudWatch

์ด ํŽ˜์ด์ง€์— ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ ์•Œ๋ ค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค๋ง์‹œ์ผœ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ž ๊น ์‹œ๊ฐ„์„ ๋‚ด์–ด ์„ค๋ช…์„œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ง์”€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

docs.aws.amazon.com

์„œ๋ฒ„๋ฆฌ์Šค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

  • ์‹คํ–‰์ˆœ์„œ์ง์ ‘์š”์ฒญ/๋ฐ์ดํ„ฐ,๋ฆฌ์†Œ์Šค ๋ณ€ํ™” → AWS Lambda → AWS ์„œ๋น„์Šค/์™ธ๋ถ€์„œ๋น„์Šค
  • Event๋ฐœ์ƒ → API Gateway → Function(Lambda) → Service(DynamoDB)

์ „์ฒด ๊ตฌ์กฐ

  • DynamoDB
  • [v] id๋ฅผ ๊ธฐ๋ณธํ‚ค๋กœ ๊ฐ€์ง€๋Š” Cards ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ
  • [v] getCards ๋žŒ๋‹ค ํ•จ์ˆ˜ ๋งŒ๋“ค๊ณ  ์‹คํ–‰ํ•ด๋ณด๊ธฐ
  • [v] DynamoDB ํ…Œ์ด๋ธ” ์ƒ์„ฑ ํ›„ ๋žŒ๋‹ค์—์„œ ํ˜ธ์ถœํ•˜๊ธฐ
    • getCards (lambda)
    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;
    };
    
    ๋žŒ๋‹ค๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด dynamodb์— ์ ‘๊ทผ ๊ถŒํ•œ์„ค์ •์„ ๋”ฐ๋กœํ•˜์ง€์•Š์•„์„œ ์ ‘๊ทผ ์‹คํŒจํ•œ๋‹ค.
{
  "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์ ‘๊ทผ ๊ถŒํ•œ์— ๊ด€ํ•œ ์ •์ฑ…์„ ์„ค์ •ํ•œ๋‹ค
    1. dynamodb์˜ Cardsํ…Œ์ด๋ธ”์— ์‚ฝ์ž…, ์‚ญ์ œ, ์ˆ˜์ •, ๊ฒ€์ƒ‰ ํ—ˆ์šฉ
    2. 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 SAMmacOS์— CLI ์‚ฌ์šฉ - AWS Serverless Application Model

Docker๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ณ --use-container์˜ต์…˜. ์ฒ˜์Œ์— ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒฝ์šฐ ์ด ์„น์…˜์„ ๊ฑด๋„ˆ๋›ฐ๊ฑฐ๋‚˜ ๋‚˜์ค‘์— Docker๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ์ด ์„น์…˜์„ ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค.

docs.aws.amazon.com

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

 

AWS SAM resource and property reference - AWS Serverless Application Model

Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.

docs.aws.amazon.com

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

 

GitHub - Parkyunhwan/AWSLambda-crud-ex: SAM-Lambda-DynamoDB crud API example

SAM-Lambda-DynamoDB crud API example. Contribute to Parkyunhwan/AWSLambda-crud-ex development by creating an account on GitHub.

github.com

 

์‹ค์ œ ํ”Œ์ ์—๋Š” SAM lambda๋ฅผ ๋””๋ฒจ๋กญ์‹œ์ผœ์„œ typescript์— inversify๋ฅผ ์ ์šฉ์‹œ์ผœ ioc์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜์˜€๋‹ค. ์Šคํ”„๋ง์—์„œ๋งŒ ์จ๋ดค๋˜ DI๋ฅผ tsํ™˜๊ฒฝ์— ์ ์šฉ์‹œ์ผœ๋ณด๋‹ˆ ํฅ๋ฏธ๋กœ์› ๋‹ค. ioc์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์†Œ์Šค ๊ตฌ์กฐ ๋˜ํ•œ controller, service, repository๋กœ ์ต์ˆ™ํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.