본문 바로가기
aws

SAM으로 API Gateway - Lambda - DynamoDB 구성하기

by 초특급하품 2020. 8. 26.

AWS 서버리스 서비스로 인프라를 구성할 때 자주 사용되는 패턴이 있다.

API Gateway - Lambda - DynamoDB로 구성하는 것인데 특히 Lambda와 DynamoDB는 무기한 프리티어를 제공하기 때문에 토이 프로젝트로 사용하기에도 제격이다.

 

API Gateway

주의할 점은 앞단에 API Gateway로 프록시를 하기 때문에 람다의 응답으로 단순히 값만 넘길 게 아니라 API Gateway response에 맞게 적절한 포맷을 맞춰주어야 한다.

 

SAM template에는 람다의 Properties아래 Events 속성을 추가한다.

Resources:
  SimpleDynamoCRUD:
    Properties:
      Events:
        SimpleDynamoCRUDAPI:
          Type: Api
          Properties:
            Path: /users
            Method: GET

 

 

Lambda

DynamoDB 클라이언트를 사용해서 테이블의 모든 내용을 스캔한다. 

const AWS = require('aws-sdk')
AWS.config.update({region: process.env.AWS_REGION})

const ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'})
const TABLE_NAME = process.env.TABLE_NAME

response = (data) => ({
  statusCode: 200,
  body: JSON.stringify(data),
  headers: {
    'Content-Type': 'application/json'
  }
})

exports.handler = async (event) => {
  const result = await ddb.scan({ TableName: TABLE_NAME }).promise()
  return Promise.resolve(response(result))
};

 

람다 코드에서 리전과 테이블 이름을 환경변수에서 가져온다. 이 속성들은 다시 SAM template에 추가해줘야 한다.

 

 

DynamoDB

테이블 이름을 가져오기 위해 먼저 SAM template으로 DynamoDB 테이블을 생성부터 한다.

Resources:
  User:
    Type: AWS::Serverless::SimpleTable
    Properties:
      PrimaryKey:
        Name: id
        Type: String
      ProvisionedThroughput:
        ReadCapacityUnits: 2
        WriteCapacityUnits: 2

 

AWS::Serverless::SimpleTable 타입이 DynamoDB이다. 이렇게 생성된 테이블을 환경변수로 참조하려면 !Ref를 사용한다.

Globals
  Function:
    Environment:
      Variables:
        TABLE_NAME: !Ref User

 

이렇게 DynamoDB를 추가했으면 람다에서 접근할 수 있도록 권한도 부여해야 한다.

권한은 policy_templates.json에서 확인한 후 적용하면 된다. 필요한 권한만 추가해주면 기본 람다에서 필요한 AWSLambdaBasicExecutionRole을 포함한 새로운 Role이 생성된다.

Resources:
  SimpleDynamoCRUD:
    Properties:
      Policies:
        - DynamoDBCrudPolicy:
            TableName: !Ref User

 

 

'aws' 카테고리의 다른 글

AWS amplify로 GraphQL 추가하기  (0) 2020.12.10
AWS amplify로 어플리케이션 배포하기  (0) 2020.11.29
Serverless Application Model(SAM) 기본  (0) 2020.08.25
AWS CodePipeline으로 CI/CD 구축하기  (0) 2020.05.12
AWS fargate 사용법  (0) 2020.05.12

댓글