CodeDeploy For Lambda
Lambda 플랫폼에서의 CodeDeploy는 놀랍게도 트래픽을 전환하는 용도입니다. 설정한 버전에서 버전으로 트래픽을 전환하고, 검증하는 것입니다. CodeBuild에서 Lambda로 코드를 배포하고 새 버전을 생성하면, CodeDeploy에서 구 버전과 신 버전의 테스트와 트래픽을 전환을 담당합니다. Deploy 어디?
Lambda Function 설정하기
먼저 다음과 같이 AWS 콘솔에서 Lambda -> Functions로 들어가 Create Function을 눌러줍니다.
Runtime에 Node.js 16.x를 선택하고 함수를 만들어줍니다. 이름은 내키는 데로 하시면 됩니다.
그리고 생성한 함수로 들어가 하단 Aliases를 클릭해 alias를 만들어줍니다. CodeDeploy에서는 이 Alias버전을 바꾸어 트래픽을 바꾸어줍니다.
그리고 위 사진에서 보이는 Aliases바로 오른쪽 Versions를 만들어 두 가지 버전을 만들어 줍니다. 다음은 두 개의 버전 코드입니다.
Version 1
exports.handler = async (event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
Version 2
exports.handler = async (event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda! V2'),
};
return response;
};
Code 부분에서 코드를 바꾸고 Versions로 돌아와 다음과 같이 Publish new version을 클릭해 만들어주면 됩니다.
그렇게 두개의 버전을 생성하면 아래와 같이 버전 1, 2가 보일 것입니다.
Aliases는 아직 지정하기 않았기 때문에, 없는 것이 정상입니다. 그럼 이제 Aliases에 버전을 넣어보겠습니다.
다음과 같이 생성한 Aliases를 지정하고, Edit버튼을 눌러 편집해주겠습니다.
다음과 같이 1 버전을 지정해줍니다.
CodeDeploy Application 만들기
AWS 콘솔로 들어가 다음과 같이 Developer Tools -> CodeDeploy -< Applications로 들어가 Create application를 눌러 애플리케이션을 만들어줍니다.
Application name은 임의로 설정해주고, Computing platform으로 AWS Lambda를 선택하여줍니다.
생성한 application으로 들어가 Create deployment group을 클릭해 deployment group을 생성해줍니다.
세부사항은 따로 설정할 것이 없으니 임의로 설정하면 됩니다.
그리고 생성한 애플리케이션으로 들어가 Create deployment를 클릭해 배포를 생성합니다.
생성한 Deployment Group을 선택해주고, Revision type에 Use AppSpec editor, Appspec language에 YAML을 선택하여 아래 코드를 넣어줍니다.
version: 0.0
Resources:
- { 생성한 람다 함수 이름 }:
Type: AWS::Lambda::Function
Properties:
Name: "{ 생성한 람다 함수 이름 }"
Alias: "{ 생성한 alias 이름 }"
CurrentVersion: "{ 기존 선택된 alias 버전 }"
TargetVersion: "{ 트래픽을 바꿀 alias 버전 ( 2 )"
Hooks:
- BeforeAllowTraffic: "{ 람다 검증 함수 이름 }"
- AfterAllowTraffic: "{ 람다 검증 함수 이름 }"
중괄호 ( { } ) 안에 값들은 사용자가 설정해둔 값으로 바꾸면 되고, 람다 검증 함수 같은 경우에는 임의로 Lambda Function을 만들고 아래 코드를 붙여 넣어주면 됩니다.
'use strict';
const aws = require('aws-sdk');
const codedeploy = new aws.CodeDeploy({
apiVersion: '2014-10-06'
});
exports.handler = async (event) => {
var params = {
deploymentId: event.deploymentId,
lifecycleEventHookExecutionId: event.lifecycleEventHookExecutionId,
status: 'Succeeded'
};
try {
await codedeploy.putLifecycleEventHookExecutionStatus(params).promise();
return "succeced"
} catch (e) {
return "error"
}
};
이에 대한 자세한 설명이 써진 글은 아래 글에 올려두었습니다.
AWS Lambda배포를 위한 CodeDeploy 알아보기
CodeDeploy 간단히 알아보기 CodeDeploy는 AWS에서 제공하는 배포를 위한 서비스이고, AWS에서 CI/CD 파이프라인을 구축할 때 필요한 서비스입니다. CodeDeploy는 세 가지 요소로 구성된다고 생각하는데 Appli
awlhdla.tistory.com
그리고 Create deployment를 누르면 배포가 시작되는데 다음과 같은 콘솔 창이 보이면 성공입니다.
테스트하기
이를 테스트하기 위해 위에서 생성한 람다 함수의 alias로 들어가 test를 진행해줍니다. aliases -> 생성한 alias로 들어가 test를 눌러보면
다음과 같이 리턴 값에 기존 version 1의 리턴 값이 아닌 version 2의 리턴값이 찍히는 사실을 알 수 있습니다.
생성한 함수의 Versions부분에서 보이기도 합니다.
이렇게 CodeDeploy를 통해 Lambda 함수의 검증 ( 위에서 만든 람다 함수 )과 버전 관리의 이점이 있습니다. 그런데 제가 알아본 바로는 CodePipe라인에 CodeDeploy가 아니고 Codebuild만 두 개 쓰는 아키텍처도 있습니다. 람다 Alias의 version관리를 따로 해주어야 한다는 점을 생각하면 조금 복잡하더라고 Codebuild를 두개 돌리는 것도 괜찮을 것 같습니다. 물론 이는 코드 관리의 중요성과 개인 성향에 따라 선택하시면 될 것 같습니다.