CodePipeline에서 Lambda Action 구현 (Node.js)
이 글은 AI가 작성했습니다.
개요
AWS CodePipeline에서는 Lambda 함수를 Custom Action으로 실행할 수 있다. 이 방식은 배포 파이프라인 중간 단계에서 사용자 정의 로직을 실행할 때 사용된다.
예를 들어 다음과 같은 작업을 수행할 수 있다.
- 배포 식별자 생성
- 외부 API 호출
- 환경 설정 업데이트
- 배포 검증 로직 실행
CodePipeline에서 Lambda가 실행될 때는 일반적인 Lambda 이벤트와 다른 이벤트 구조가 전달된다.
CodePipeline 이벤트 구조
Lambda Action이 실행되면 다음과 같은 이벤트가 전달된다.
{
"CodePipeline.job": {
"id": "example-job-id",
"data": {
"actionConfiguration": {
"configuration": {
"FunctionName": "example-function",
"UserParameters": "example-params"
}
}
}
}
}
여기서 중요한 값은 다음과 같다.
- CodePipeline.job.id : CodePipeline 작업 식별자
- UserParameters : Action 설정에서 전달한 사용자 파라미터
Lambda는 이 정보를 사용하여 작업을 수행하고 결과를 CodePipeline에 전달해야 한다.
Lambda 구현 예시 (Node.js)
다음 코드는 CodePipeline에서 실행되는 Lambda Action의 기본 구조다.
import {
CodePipelineClient,
PutJobSuccessResultCommand,
PutJobFailureResultCommand
} from "@aws-sdk/client-codepipeline";
const cp = new CodePipelineClient({});
export const handler = async (event) => {
const job = event?.["CodePipeline.job"];
const jobId = job?.id;
const configuration = job?.data?.actionConfiguration?.configuration ?? {};
const { UserParameters, FunctionName } = configuration;
try {
console.log("Pipeline Job:", jobId ?? "Unknown");
console.log("Parameters:", UserParameters);
if (jobId) {
await cp.send(new PutJobSuccessResultCommand({ jobId }));
}
return {
statusCode: 200,
body: JSON.stringify("Pipeline action completed"),
status: "Succeeded"
};
} catch (error) {
console.error("Pipeline action failed:", error);
if (jobId) {
await cp.send(
new PutJobFailureResultCommand({
jobId,
failureDetails: {
message: error.message,
type: "JobFailed"
}
})
);
}
return {
statusCode: 500,
body: JSON.stringify("Pipeline action failed"),
status: "Failed"
};
}
};
CodePipelineClient를 사용하는 이유
CodePipeline에서 실행되는 Lambda는 실행 결과를 CodePipeline에 직접 보고해야 한다.
Lambda가 정상적으로 실행되더라도 결과를 보고하지 않으면 CodePipeline은 해당 Action을 InProgress 상태로 유지한다.
따라서 Lambda 내부에서 다음 API를 호출해야 한다.
PutJobSuccessResultPutJobFailureResult
이 API는 CodePipeline 서비스에 작업 결과를 전달하는 역할을 한다.
Node.js에서는 AWS SDK v3의 CodePipelineClient를 사용하여 해당 API를 호출한다.
const cp = new CodePipelineClient({});
작업 성공 보고
await cp.send(new PutJobSuccessResultCommand({ jobId }));
작업 실패 보고
await cp.send(
new PutJobFailureResultCommand({
jobId,
failureDetails: {
message: error.message,
type: "JobFailed"
}
})
);
이 호출이 있어야 CodePipeline이 다음 단계로 진행할 수 있다.
동작 흐름
CodePipeline Lambda Action의 전체 흐름은 다음과 같다.
- CodePipeline이 Lambda 실행
- Lambda에
CodePipeline.job이벤트 전달 - Lambda가 jobId 및 설정 파싱
- 사용자 로직 실행
- CodePipeline API로 작업 결과 보고
- 파이프라인 다음 단계 진행
정리
CodePipeline에서 Lambda를 사용할 때는 다음 사항이 중요하다.
- CodePipeline 전용 이벤트 구조 파싱
jobId추출- 작업 결과를 CodePipeline API로 보고
이를 위해 AWS SDK의 CodePipelineClient를 사용하여 PutJobSuccessResult 또는 PutJobFailureResult API를 호출해야 한다.