본문 바로가기
aws

Serverless Application Model(SAM) 기본

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

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이 만들어지고 진행된다.

 

stack changeset

 

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

댓글