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 |
댓글