Scenario (시나리오)
- 애플리케이션을 개발 중이며 개발 코드는 CodeCommit에 저장한다.
- CodeCommit에 Pull Request 생성 또는 업데이트 시 AWS CodeBuild로 Unit Test를 실행하고싶다.
- CodeBuild의 Unit Test 작업은 개발자들이 새로 만든 Lambda 함수를 통해 실행하고 싶다
아키텍쳐
Pull Request 생성 > CodeCommit (EventBridge가 Lambda를 trigger) > CodeBuild (Lambda가 Unit-Test 실행)
- CodeCommit: 소스 코드 저장소로 Pull Request 이벤트가 생기면 lambda를 trigger한다.
- EventBridge: CodeCommit 이벤트와 Lambda 함수 연계.
- Lambda: CodeCommit 이벤트를 감지하고 CodeBuild 작업을 시작하는 함수.
- CodeBuild: Unit Test 실행 환경.
참고만) CodeCommit 자체 기능의 trigger 설정하기
CodeCommit 자체 기능의 "trigger"로 Pull Request 생성 및 업데이트 이벤트 발생시 Lambda를 Trigger할 수 있다.
[AWS Management Console]
CodeCommit → Repository → Settings → Trigger → Create Trigger 클릭.
- Events로 "Push to existing branch" 선택
- Trigger target로 "Lambda" 선택
하지만 "CodeCommit 트리거"는 간단한 이벤트에 효율적으로 활용할 수 있지만 좀더 복잡한 세부적인 이벤트 제어를 하고 싶다면 "EventBridge"를 활용해야한다.
CodeCommit Trigger와 EventBridge 비교
CodeCommit Trigger | EventBridge | |
설정 위치 | CodeCommit Console 내에서 설정 | EventBridge Console에서 설정 |
이벤트 종류 | 푸시, 브랜치 생성/삭제 등 | 풀 리퀘스트, 브랜치 업데이트 등 다양한 이벤트 |
대상 | Lambda, SNS | Lambda, SQS, SNS, Step Functions 등 |
1. EventBridge를 활용해 trigger 설정하기
CodeCommit의 trigger가 아닌 EventBridge를 활용하면 보다 세부적인 이벤트를 감지하고, 다양한 AWS 리소스를 트리거할 수 있다.
[AWS Management Console]
EventBridge → Rules → Create rule
- Event source: "CodeCommit" 선택
- Event type: "CodeCommit Pull Request State Change" 선택
- Event pattern 설정:
{
"source": ["aws.codecommit"],
"detail-type": ["CodeCommit Pull Request State Change"],
"detail": {
"event": ["pullRequestCreated", "pullRequestSourceBranchUpdated"]
}
}
PullRequestCreated
새로운 Pull Request가 생성되었을 때 발생하는 이벤트이다.
(새 코드 변경 사항이 요청될 때마다 Lambda 함수가 트리거되어 CodeBuild에서 테스트를 시작할 수 있다)
PullRequestSourceBranchUpdated
Pull Request의 소스 브랜치가 업데이트되었을 때 발생하는 이벤트이다.
기존 Pull Request에 새로운 commit이 추가되었을 경우 이 이벤트가 발생한다.
(코드 변경이 있을 때마다 유닛 테스트를 다시 실행하도록 할 수 있다)
2. Lambda 함수 생성 및 설정 (CodeBuild API 호출)
Unit Test를 실행하는 Lambda 함수(AWS SDK을 활용)에서 CodeBuild API 호출한다
Lambda 함수 코드에서 startBuild
메서드를 호출하여 CodeBuild를 트리거되도록 한다.
[Lambda 함수 코드 예시] (Python - Boto3 사용)
import boto3
import json
def lambda_handler(event, context):
# 이벤트 정보 로그 출력 (디버깅용)
print("Received event: " + json.dumps(event, indent=2))
# CodeBuild 클라이언트 생성
codebuild = boto3.client('codebuild')
# CodeBuild 프로젝트 이름
project_name = 'my-codebuild-project'
try:
# CodeBuild 빌드 시작
response = codebuild.start_build(
projectName=project_name,
environmentVariablesOverride=[
{
'name': 'COMMIT_ID',
'value': event['detail']['sourceCommit'],
'type': 'PLAINTEXT'
},
{
'name': 'BRANCH_NAME',
'value': event['detail']['referenceName'],
'type': 'PLAINTEXT'
}
]
)
print(f"CodeBuild started: {response['build']['id']}")
except Exception as e:
print(f"Error starting CodeBuild: {str(e)}")
raise
return {
'statusCode': 200,
'body': json.dumps('CodeBuild triggered successfully!')
}
Lambda의 CodeBuild 권한 설정
Lambda가 CodeBuild를 호출하려면 IAM Role에 다음과 같은 권한이 필요합니다:
- codebuild:StartBuild
- codebuild:BatchGetBuilds
- codebuild:ListBuilds
[IAM Policy 예시]
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"codebuild:StartBuild",
"codebuild:BatchGetBuilds",
"codebuild:ListBuilds"
],
"Resource": "*"
}
]
}
3. CodeBuild 프로젝트 설정
CodeBuild → Create build project → 소스 리포지토리(예: CodeCommit)와 관련된 빌드 환경 설정
Lambda 함수에서 전달된 환경 변수(COMMIT_ID, BRANCH_NAME 등) 를 빌드 사양에서 활용할 수 있도록 buildspec.yml 작성하기
[buildspec.yml 예시]
version: 0.2
env:
variables:
COMMIT_ID: ""
BRANCH_NAME: ""
phases:
build:
commands:
- echo "Building commit $COMMIT_ID from branch $BRANCH_NAME"
- # 빌드 명령어 실행