AWS에 작성한 코드를 배포하고 관리하기 위한 많은 도구들이 있다.
serverless 도 흔히 사용되지만 Serverless Application Model(SAM)도 손쉽게 사용할 수 있다.
다른 도구들과 마찬가지로 SAM도 application code를 작성하고 관련 인프라 설정을 yaml으로 작성한다. 배포는 package와 deploy 두 단계로 나뉜다.
package 명령으로 코드를 s3로 업로드하고 SAM template으로 작성한 yaml은 업로드한 코드의 주소를 포함한 cloudformation으로 변환된다. 그 후에 deploy 명령으로 cloudformation stack을 생성해서 실제 인프라에 적용시킨다.
SAM cli 설치
aws repo 추가
$ brew tap aws/tap
sam 설치
$ brew install aws-sam-cli
Lambda code
람다는 간단하게 s3 bucket을 조회하는 코드로 src/index.js에 작성했다.
const AWS = require('aws-sdk')
const s3 = new AWS.S3()
exports.handler = async (event) => {
return s3.listBuckets().promise()
};
SAM template
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
listS3Buckets:
Type: 'AWS::Serverless::Function'
Properties:
Handler: index.handler
Runtime: nodejs12.x
CodeUri: src/
MemorySize: 128
Timeout: 3
SAM package
$ sam package --s3-bucket sam-hello-test --output-template-file template.package.yaml
sam
대신에 aws cloudformation
을 사용해도 된다. 옵션으로는 코드를 업로드할 s3 bucket을 넣어준다. 기본 참조하는 SAM template 파일 이름은 template.yaml 또는 template.yml라서 생략해도 된다.
생성된 파일을 열어보면 기존 SAM template 파일과 크게 바뀐 건 없고, CodeUri가 s3를 참조하게 바뀌었다.
SAM deploy
$ sam deploy --template-file template.package.yaml --stack-name sam-hello-test --capabilities CAPABILITY_IAM
deploy에서도 기본 template file 이름은 template.[yaml|yml] 이니 주의하고 방금 생성한 template을 명시해준다.
에러 없이 진행된다면 아래와 같디 stack changeset이 만들어지고 진행된다.
이렇게 배포까지 성공했지만 lambda를 실행시켜보면 s3 Access Denied 에러가 뜬다. template 파일에 s3 listObject 권한을 추가해보자.
권한은 역할(Role)로도 부여할 수 있고, 정책(Policy)으로도 부여할 수 있다. 특히 정책으로 부여할 때는 policy_templates.json를 참조해서 직관적인 이름으로 관리할 수 있다. 여기서는 s3 read를 할 수 있는 역할을 생성했다.
추가로 여러 lambda를 관리할 때 중복되는 코드들은 Globals로 따로 뺐다.
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Globals:
Function:
Runtime: nodejs12.x
Timeout: 3
MemorySize: 128
Resources:
listS3Buckets:
Type: 'AWS::Serverless::Function'
Properties:
Handler: index.handler
CodeUri: src/
Role: arn:aws:iam::************:role/s3-read-access-role
참고로 Policies
, Role
, Event
등은 Globals
로 따로 뺄 수 없다.
We made the explicit call to not support them because they either made the template hard to understand, or they might open a potential security issue
다시 package && deploy 과정을 거치면 정상적으로 s3 bucket을 조회할 수 있다.
'aws' 카테고리의 다른 글
AWS amplify로 어플리케이션 배포하기 (0) | 2020.11.29 |
---|---|
SAM으로 API Gateway - Lambda - DynamoDB 구성하기 (0) | 2020.08.26 |
AWS CodePipeline으로 CI/CD 구축하기 (0) | 2020.05.12 |
AWS fargate 사용법 (0) | 2020.05.12 |
AWS X-Ray (0) | 2020.05.05 |
댓글