gony-dev 님의 블로그

Section 25. AWS Serverless: SAM - Serverless Application Model 본문

AWS

Section 25. AWS Serverless: SAM - Serverless Application Model

minarinamu 2024. 11. 28. 18:00

AWS SAM

SAM은 Serverless Application Model의 약자로
서버리스 어플리케이션을 개발하고 배포하기 위한 프레임워크이다.
코드를 작성하고 SAM 프레임워크와 호환되는 YAML 형식의 구성 파일을 사용하게 된다.

YAML 파일은 CloudFormation의 모든 항목을 지원하기에 SAM YAML
코드에서 출력, 매핑, 파라미터 리소스 등을 계속 사용할 수가 있다.

SAM은 내부적으로 CodeDeploy를 사용하여 람다 함수를 배포할 수 있으며, API 게이트웨이, DynamoDB를 로컬에서 실행하는 데 도움을 준다.

 

Recipe

  • SAM은 레시피로 구성되며, 이는 템플릿 맨 위에 SAM 템플릿임을 나타내는 변환 헤더를 추가한다.
  • 그런 다음 코드를 작성하는데 CloudFormation을 사용하는 대신 SAM Construct를 사용한다.(ex. lambda function, api..)
  • 다음 단계로 이 어플리케이션을 AWS에 패키지화하여 배포하기 위해 동일한 배포 명령을 사용해야 한다.
    예전에는 2개의 명령어로 "sam package"였고, 나중에 "sam deploy"가 되었다.
    현재는 "sam deploy" 하나만으로 package 기능까지 수행할 수 있다.

Deep Dive into SAM Deployment

  • 아래의 그림을 보면 어플리케이션 코드와 SAM 템플릿이 YAML 형식으로 되어있다.
    그런 다음 sam build를 사용하여 로컬 어플리케이션을 구축한다.
    이는 CloudFormation과 어플리케이션 코드로 변환되며, 그런 다음 sam deploy를 사용하여 배포한다.

SAM Accelerate (sam sync)

  • SAM Accelerate는 AWS에 리소스를 배포하는 동안 지연 시간을 줄이는 데 사용되는 일련의 기능이다.
  • "sam sync"로 SAM 템플릿으로 선언한 프로젝트를 AWS에 배포하는데 사용된다.
    실제로 CloudFormation을 우회하게 되며, 서비스 API를 사용하여 인프라를 업데이트하지 않고 코드 변경만 하면 된다!
    이미 몇 가지 템플릿과 어플리케이션 코드, 람다 함수가 배포되어 있다.
  • 만일 어플리케이션 코드를 수정한다면 SAM은 이를 인식하고 자동으로 람다 함수와 동기화한다.


SAM Policy Templates

  • 실습을 통해 보았던 SAM 정책 템플릿을 알아보자.
  • 정책 템플릿이란 람다 함수에 권한을 설정할 수 있는 템플릿의 목록을 의미한다.
    아주 간단한 템플릿으로 권한을 다시 그룹화하는 템플릿을 기반으로 람다 함수를 통해 할 수 있는 작업을 알려준다.
  • 몇 가지 예시를 알아보자.
    1. S3ReadPolicy | S3의 객체에 읽을 수 있는 허가를 부여한다.
    2. SQSPollerPolicy | SQS 큐에서 폴링할 수 있도록 한다.
    3. DynamoDBCrudPolicy | CRUD에 대한 정책으로 람다 함수에서 DynamoDB의 테이블에 대한 작업을 수행할 수 있다.

SAM and CodeDeploy

  • SAM은 CodeDeploy를 사용하여 람다 함수를 업데이트할 수 있다.
  • 방법은 Traffic Shifting feature을 활용하고,
    Pre와 Post 트래픽 훅 람다 함수를 정의해서 배포물을 검증할 수 있다.
  • CloudWatch Alarm을 사용하여 자동 롤백도 진행할 수 있다.

배포가 완료되고 트래픽 이전이 완료되면 Post 트래픽 훅 람다 함수를 실행하고, v1 함수는 종료된다.

정책들 알아보기

  • AutoPublishAlias
    • 새로운 코드 배포시 SAM이 탐지하도록 한다.
    • 최신 코드로 된 새로운 버전으로서 새로움 람다 함수가 배포된다.
  • DeploymentPreference
    • AutoPublishAlias의 과정이 얼마나 빨리 이루어지는지 DeploymentPreference에 의해 통제된다.
    • Canary, Linear, AllAtOnce 등의 유형이 존재한다.
  • Alarms
    • 배포물의 롤백을 트리거할 수 있다.
  • Hooks
    • 트래픽 이전이나 이후에 실행될 람다 함수를 적는다.
    • 배포물을 테스트하고 사용자 지정 코드를 실행하는데 도움이 된다.

SAM Policy의 예시


SAM - Local Capabilities

  • 로컬에서 AWS Lambda를 시작할 수 있는 서비스이다.
  • "sam local start-lambda"를 입력하면 내 컴퓨터에서 lambda 함수를 lambda 프레임워크를 모방하는
    로컬 엔드포인트로 사용할 수 있게 된다.
  • 람다 함수 로컬에서 호출하기
    • "sam local invoke"를 입력하면 페이로드를 람다 함수에 실어서 호출한다.
    • 한 번 호출 후 호출이 완료되면 중단한다.
    • 테스트 케이스 생성 시 람다 함수가 AWS와 상호작용하는 경우에 유용하다.
      이 때 로컬 함수를 시작하거나 알맞은 -profile 옵션으로 호출해야 한다.

Local Capabilities

  • 로컬 API Endpoint로 시작할 수도 있다.
    • "sam local start-api"를 입력하면 모든 함수를 담당하는 로컬 HTTP 서버를 시작한다.
      그리고 함수가 업데이트 될 시, 자동으로 재로딩되고 API가 업데이트 된다.
  • 람다 함수의 이벤트를 생성하는 방법은 다음과 같다.
    • "sam local generate-event"를 입력하면 이벤트 소스용 샘플 페이로드를 생성할 수 있다.


SAM - Multiple Environments

  • SAM을 사용하면 개발 스택 내의 여러 환경을 쉽게 관리할 수 있다.
  • SAM 템플림을 때로는 개발 환경에 배포하고, 때로는 운영 환경에 배포할 때가 있다.
    개발자로서 SAM 템플릿을 가지고 있지만, Smaconfig.toml라는 이름의 다른 파일을 만들고자 한다.

  • TOML 형식은 오른쪽과 같으며 스택마다 다른 파라미터가 있다.
    초록색 박스 안에 개발 스택이 있고 배포 파라미터를 정의한다.
    S3 버킷에 접두사와 리전, 일부 기능과 파라미터 재정의를 설정하여 환경을 개발이라고 설정한다.
  • 동기화 파라미터도 설정하는데, 이 작업을 수행하는 이유는 HTML 파일에서 초기 설정을 완료한 후 배포를 일부 진행한 다음 --config dev를 사용할 수 있기 때문이다.
  • 올바른 파라미터를 선택하여 리소스를 올바른 환경과 위치에 자동으로 배포한다.

 

 

 


추가 정보!

  • SAM을 사용하여 서버리스 어플리케이션 패키지를 AWS SAR(Serverless Application Repository)를
    통해 다른 AWS 계정과도 공유할 수 있다!
  • SAM CLI + AWS 도구 키트를 사용하여 람다 함수를 로컬에서 디버그하고, 변수를 검사하고, 코드를 한 줄씩 실행하는 것이 가능하다!