1. 개요

AWS SAM에 대한 특징과 함께 사용법, 장단점에 대해 소개한다.

 

2. AWS SAM이란

AWS SAM(Serverless Application Model)은 AWS 환경에서 서버리스 애플리케이션을 구축할 때 사용할 수 있도록 AWS가 공식으로 제공하는 프레임워크이다.

SAM은 AWS CloudFormation이 확장된 형태로, 배포 과정에서 SAM Template이 CloudFormation Template으로 변환된다.

SAM을 통해 구축할 수 있는 AWS 서비스의 종류는 다음과 같다.

  • API Gateway
  • DynamoDB
  • Lambda Function/Layer/Application

특징

  • AWS SAM에서 지원하지 않는 리소스에 대해서는 CloudFormation 문법에 맞게 작성하여 함께 사용이 가능함.
  • DeploymentPreference 프로퍼티를 사용하여 서버리스 애플리케이션에 대한 Canary 배포가 가능함.
  • AWS X-Ray를 사용한 퍼포먼스 모니터링을 손쉽게 구현할 수 있음.
  • 서버리스 애플리케이션 레포지토리를 통해 다른 사람이 구현한 기능을 파라미터만 변경하여 재사용 가능.

 

3. SAM Template

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-app

  Sample SAM Template for sam-app

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs10.x
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get

SAM Template의 주요 항목은 다음과 같다.

  • Transform 선언: 'Transform: AWS::Serverless-2016-10-31'이라는 구문을 선언하여, SAM Template임을 명시해야 함.
  • Globals 섹션: 서버리스 애플리케이션에 공통적으로 적용되는 속성을 정의함.
  • Resources 섹션: CloudFormation 리소스와 SAM 리소스를 정의함.

 

4. SAM CLI

AWS에서는 SAM CLI라는 툴을 제공하고 있으며, 이 툴을 활용하여 로컬 환경에서 Lambda 함수를 실행하고, CloudFormation 코드를 검증할 수 있다.

SAM CLI 설치 및 테스트 애플리케이션 배포

sam cli는 로컬에서 함수 실행시 Docker 컨테이너를 실행시키기 때문에, 사전에 Docker가 설치되어 있어야 한다.

# sam cli 설치
$ pip install --user aws-sam-cli
$ sam --version # sam cli 버전 확인
$ node -v
v10.21.0

# nodejs 10버전의 예제 애플리케이션을 생성
$ sam init --runtime nodejs10.x

# 생성된 샘플 애플리케이션 디렉터리 구조
$ tree sam-app
sam-app
├── README.md
├── events
│   └── event.json
├── hello-world # 애플리케이션 코드
│   ├── app.js
│   ├── package.json
│   └── tests
│       └── unit
│           └── test-handler.js
└── template.yaml # SAM Template으로 작성된 Lambda 생성 코드

4 directories, 6 files

sam cli를 활용하여 애플리케이션을 빌드 및 배포한다.

# 애플리케이션 빌드
$ sam build

# 서버리스 애플리케이션(Lambda) 로컬 테스트
# local에서 접속할 수 있는 Endpoint 제공
$ sam local start-api
Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
2020-06-13 21:38:51  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
Invoking app.lambdaHandler (nodejs10.x)

Fetching lambci/lambda:nodejs10.x Docker container image......
START RequestId: cbfc9da1-89c1-1377-2a03-63420999e9b8 Version: $LATEST
END RequestId: cbfc9da1-89c1-1377-2a03-63420999e9b8
REPORT RequestId: cbfc9da1-89c1-1377-2a03-63420999e9b8  Init Duration: 197.79 ms    Duration: 8.19 ms   Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 43 MB 
No Content-Type given. Defaulting to 'application/json'.
2020-06-13 21:39:10 127.0.0.1 - - [13/Jun/2020 21:39:10] "GET /hello HTTP/1.1" 200 -
2020-06-13 21:39:11 127.0.0.1 - - [13/Jun/2020 21:39:11] "GET /favicon.ico HTTP/1.1" 403 -

# 서버리스 애플리케이션 배포
$ sam deploy --guided
...
Successfully created/updated stack - sam-app in ap-northeast-2

 

5. SAM의 장단점

장점

  • AWS에서 서버리스 시스템을 구성할 때 필요한 CloudFormation 코드가 추상화되어 있어, 좀 더 직관적으로 서버리스를 구성할 수 있음
  • 기존의 CloudFormation 코드와 함께 사용이 가능함
  • sam 명령어를 통해 Local 환경에서 Lambda 함수를 테스트해 볼 수 있어 개발에 편리함

단점

  • SAM으로 정의할 수 있는 리소스가 제한적임

    • API Gateway
    • DynamoDB
    • Lambda Function/Layer/Application
  • CloudFormation 코드에 익숙하지 않다면 러닝 커브가 있을 수 있음