JD의 블로그

SAM (Serverless Application Model) 본문

클라우드/AWS

SAM (Serverless Application Model)

GDong 2021. 10. 13. 10:32

SAM(Serverless Application Model)이란?

AWS 서버리스 애플리케이션 모델(SAM)은 서버리스 애플리케이션을 구축하기 위한 오픈 소스 프레임워크다. 함수, API, 데이터 베이스 같은 리소스를 생성하기 위해 YAML 형태의 약식 구문을 제공한다. 리소스 몇 줄만으로도 애플리케이션을 정의하고 모델링 할 수 있다. 배포 중에 SAM은 SAM 구문을 CloudFormation 구문으로 변환 및 확장하므로 서버리스 애플리케이션을 더 빠르게 구축할 수 있다.

 

샘플 AWS SAM 애플리케이션

sam init

sam init을 하면 애플리케이션 이름, 런타임, 디펜던시, 애플리케이션 템플릿 등을 선택할 수 있다.

 

선택을 하고 나면 기본적인 프로젝트 디렉토리를 생성한다.

 sam-app/
   ├── README.md
   ├── events/
   │   └── event.json
   ├── hello_world/
   │   ├── __init__.py
   │   ├── app.py            #Contains your AWS Lambda handler logic.
   │   └── requirements.txt  #Contains any Python dependencies the application requires, used for sam build
   ├── template.yaml         #Contains the AWS SAM template defining your application's AWS resources.
   └── tests/
       └── unit/
           ├── __init__.py
           └── test_handler.py
  • template.yaml : 애플리케이션의 AWS 리소스를 정의하는 AWS SAM 템플릿을 포함한다.
  • hello_world/app.py : 실제 Lambda 핸들러 로직을 포함한다.
  • hello_world/requirements.txt : 애플리케이션에 필요한 모든 Python 종속성을 포함하고 "sam build"를 위해 사용된다.

"sam build" 명령어를 입력하면 yaml 형태의 템플릿과 코드를 생성

 

sam deploy 명령어는 패키지를 S3로 옮겨서 CloudFormation을 통해 애플리케이션을 생성한다.

 

 

SAM은 크게 두 가지 파트로 나뉜다.

1. SAM templates

리소스와 이벤트 소스 맵핑을 나타내기 위해 약어를 사용함으로써 서버리스 애플리케이션을 위한 infrastructure as code를 가능하게 한다.

7가지 SAM Serverless 리소스 타입

  • AWS::Serverless::Function
    • Policy는 이 Lambda 함수에 어떤 권한을 줄 것인지
    • Event는 어떻게 이 Lambda 함수를 호출할 것인가 하는 부분
      • Lambda 함수를 트리거 하기 위한 이벤트 소스는 15가지
        • S3, SNS, Kinesis, DynamoDB, SQS, Api, HttpApi, Schedule, CloudWatchEvent, CloudWatchLogs, IoTRule, AlexaSkill, Cognito, EventBridgeRule, MSK(Managed Streaming for Apache Kafka) 
        • IAM을 위한 관리형 정책은 70개 이상 제공
    • Metadata는 빌드 방법과 관련된 런타임을 알려주는데 기본적으로는 공백으로 남겨둔다. 
  • AWS::Serverless:Api
  • AWS::Serverless::HttpApi
  • AWS::Serverless:SimpleTable
  • AWS:Serverless:LayerVersion
    • Layer는 Lambda에서 공통된 코드를 공유할 수 있게 도와주는 역할을 한다.  
  • AWS::Serverless::Application
  • AWS::Serverless:StateMachine
    •  

SAM Globals

SAM 템플릿 내용 중 중복되는 내용을 전역 변수처럼 사용하는 것 

템플릿을 재사용하기

  

Pseudo 파라미터

  • AWS::AccountId
  • AWS::NotificationARNs
  • AWS::NoValue
  • AWS::Partition
  • AWS::Region
  • AWS::StackId
  • AWS::StackName
  • AWS::URLSuffix

Intrinsic functions

  • Fn::Base64
  • Fn::Cidr
  • Condition functions
    • Fn::And
    • Fn::Equals
    • Fn:If
    • Fn::Not
    • Fn::Or
  • Fn::FindInMap
  • Fn::GetAtt
  • Fn::GetAZs
  • Fn::ImportValue
  • Fn::Join
  • Fn::Select
  • Fn::Split
  • Fn::Sub
  • Fn::Transform
  • Ref

사용법

!Sub는 $모양 안에 있는 변수를 치환시켜주는 역할을 함.

 

 

 

2. SAM CLI

서버리스 애플리케이션을 위해 로컬 개발, 디버깅, 빌드, 패키징, 그리고 배포를 가능하게 하는 도구를 제공한다.

 

로컬에서 테스트하기 위해서 오픈 소스 형태의 도커-람다 이미지를 사용해서 로컬에서 람다 함수를 흉내낼 수 있는 실행 환경을 만든다. 

 

"sam init"

  • 새로운 서버리스 애플리케이션을 만든다.
  • 옵션
    • 런타임 : nodejs, dotnet, go, python, java, ruby
    • 디펜던시 매니저 : Maven 또는 Gradle
    • 출력 디렉토리 : 애플리케이션에 대한 경로
    • 이름 : 애플리케이션 이름
    • 위치 : 사용자 정의 템플릿의 위치

"sam build"

람다 실행 환경과 관련된 배포 아티펙트를 생성한다. 

 

SAM Package

  • SAM 애플리케이션을 패키징한다.
  • 아티펙트를 S3 버킷에 복사한다.
  • CodeUri 주소를 업데이트하고 YAML 파일을 출력한다.

 

SAM deploy

  • AWS 클라우드 상에 서버리스 애플리케이션을 배포하거나 업데이트하는 것
  • 아티펙트 배포를 위해 S3 버킷을 배포하거나 관리하는 것
  • config 파일에 배포 옵션을 저장하는 것

 

SAM local

  • 서버리스 애플리케이션 개발을 위한 로컬 도구 
  • 도커 컨테이너에 의존함