앞서 #1편에서 프로덕션 레벨에서 구동하게끔 만들었던 CD(Continuous Deployment) 파이프라인을 만들었습니다.
여기서는 안전하게 변화시키는 예제에 대해서 설명합니다.
SAM(Serverless Application Model)이라는 것을 통해서 진행합니다.
SAM은 매크로 혹은 Cloud Formation 상의 리소스들을 변형할 수 있습니다.
- S3, Amazon Kinesis, AWS Step Function 등의 리소스들을 SAM 템플릿 안에 포함하여 변경할 수 있습니다.
AWS SAM은 변수 / 매핑 / 아웃풋 등을 지원합니다.
또한, AWS SAM은 Cloud Formation에서처럼 내장함수를 사용합니다.
- Join / Git / Ref / GetAttr 등
- Fn::Join / git / Ref / Fn::GetAtt
자세한 Cloudformation 함수는 다음 블로그를 참고해 주세요.
참조 링크 : https://dev.classmethod.jp/articles/lim-cloudformation-function-kr-2/
SAM에서는 다른 함수 스택의 출력값을 호출할 수 있습니다.
(다만, RestApiId, Policies, StageName 특성과 같은 것들에는 예외)
- Fn::ImportValue
이 20줄의 코드를 통해서 제한된 IAM 롤과 응답하는 하나의 람다 함수를 구성할 수 있습니다.
또한 API Gateway, DynamoDB 테이블을 만들 수 있습니다.
결국 이 하나의 코드가 온전한 서버리스 애플리케이션이 된다는 얘기입니다.
SAM을 사용하면 SAM의 Safe Deployment의 이점 역시 가져갈 수 있습니다.
이를 통해서 점진적으로 배포가 가능한데, 두 가지 타입의 배포 방식이 존재합니다.
참조 링크 : https://github.com/aws/serverless-application-model/blob/master/docs/safe_lambda_deployments.rst
- 카나리 배포 : 일부 기간 동안 전체 코드 중 일부 코드만 배포 적용하는 방법으로,
만약 배포된 기간동안 업데이트가 정상적이라면 신규 버전으로 전체 코드를 업데이트하는 방식입니다.
- 선형 배포 : 제한된 시간에 신규 기능의 배포를 단계적으로 진행하는 배포 방식입니다.
AWS 람다 alias 트래픽 이동(Traffic Shifting) / 안전 배포
두 기능을 사용하기 위해서는 단순히 AutoPulishAlias 속성을 추가하고,
alias 명을 명시하면, AWS SAM이 알아서 다음의 내용을 진행합니다.
- S3 URI의 람다 함수에 변화를 감지하여 새로운 람다 함수가 배포되는지를 탐지
- 신규 코드로 함수를 업데이트 및 퍼블리시
- 제공한 이름으로 Alias 생성하기 및 람다 함수의 새로운 버전으로 alias 지정하기
앞서 설명한 내용에 대한 SAM 템플릿입니다.
Ref 함수를 사용하는 예제로 배포 시에 명시한 ENVIRONMENT 파라미터를 가져오기 위한 예제입니다.
Canary10Percent15Minutes가 의미하는 내용은 새로운 함수가 배포되어 트래픽의 10%를 15분간 핸들링하게 된다는 의미입니다.
만약, 해당하는 15분간 명시된 Alarm의 트리거 된 내용이 없다면,
90%의 트래픽은 신규 함수 버전으로 이전됩니다.
사전 트래픽 / 사후 트래픽 후크
CodeDeploy를 사용하면 트래픽 이동이 실제로 시작되기 전(PreTraffic Hook)과 완료된 후(PostTraffic Hook) 임의의 Lambda 함수를 실행할 수 있습니다.
후크를 사용하면 배포의 성공 또는 실패 여부를 결정하는 논리를 실행할 수 있습니다.
예를 들어 PreTraffic 후크를 사용하면 새로 생성된 Lambda 버전에 대해 통합 테스트를 실행할 수 있습니다
PostTraffic 후크를 사용하면 종단 간 유효성 검사를 실행할 수 있습니다.
# 3편 예고
'IT > AWS' 카테고리의 다른 글
서버리스 애플리케이션을 위한 CI/CD 워크플로우 만들기 #4 (2) | 2023.01.16 |
---|---|
서버리스 애플리케이션을 위한 CI/CD 워크플로우 만들기 #3 (0) | 2023.01.15 |
SES 메일 보내기 (0) | 2023.01.13 |
서버리스 애플리케이션을 위한 CI/CD 워크플로우 만들기 #1 (0) | 2023.01.11 |
AWS EBS 스토리지 비용이 많이 발생하는 경우 팁 (0) | 2022.12.28 |