AWS CodeDeploy
사용 설명서 (API 버전 2014-10-06)

이 설명서의 절차는 새 콘솔 디자인을 지원합니다. 이전 버전의 콘솔을 사용하도록 선택할 경우 이 설명서의 여러 가지 개념과 기본 절차가 계속 적용되는 것을 확인할 수 있습니다. 새 콘솔에서 도움말에 액세스하려면 정보 아이콘을 선택하십시오.

AppSpec 'hooks' 섹션

AppSpec file의 'hooks' 섹션 내용은 해당 배포의 컴퓨팅 플랫폼에 따라 다릅니다. EC2/온프레미스 배포에 대한 'hooks' 섹션에는 배포 수명 주기 이벤트 후크를 하나 이상의 스크립트에 연결하는 매핑이 포함되어 있습니다. Lambda 배포에 대한 'hooks' 섹션은 배포 수명 주기 이벤트 중 실행하는 Lambda 확인 함수를 지정합니다. 이벤트 후크가 없는 경우 해당 이벤트에 대해 작업이 실행되지 않습니다. 이 섹션은 배포의 일부로 스크립트 또는 Lambda 확인 함수를 실행하는 경우에만 필요합니다.

AWS Lambda 배포를 위한 AppSpec 'hooks' 섹션

AWS Lambda 배포를 위한 수명 주기 이벤트 후크 목록

AWS Lambda 후크는 수명 주기 이벤트의 이름 뒤에 있는 새로운 줄에서 문자열로 지정된 Lambda 함수 중 하나입니다. 각 후크는 배포별로 한 번 실행됩니다. 다음은 AppSpec 파일에 사용할 수 있는 후크에 대한 설명입니다.

  • BeforeAllowTraffic – 배포된 Lambda 함수 버전으로 트래픽을 전환하기 전에 작업을 실행하려면 이 항목을 사용합니다.

  • AfterAllowTraffic – 배포된 Lambda 함수 버전으로 모든 트래픽이 전환된 후에 작업을 실행하려면 이 항목을 사용합니다.

Lambda 함수 버전 배포에서 후크 실행 순서

서버리스 Lambda 함수 버전 배포에서 이벤트 후크는 다음 순서로 실행됩니다.

참고

배포의 Start, AllowTraffic, End 이벤트는 스크립팅할 수 없기 때문에 이 다이어그램에서 회색으로 표시됩니다.

'hooks' 섹션의 구조

다음은 'hooks' 섹션 구조의 예입니다.

YAML 사용:

hooks: - BeforeAllowTraffic: BeforeAllowTrafficHookFunctionName - AfterAllowTraffic: AfterAllowTrafficHookFunctionName

JSON 사용:

"hooks": [{ "BeforeAllowTraffic": "BeforeAllowTrafficHookFunctionName" }, { "AfterAllowTraffic": "AfterAllowTrafficHookFunctionName" }]

샘플 Lambda 'hooks' 함수

'hooks' 섹션을 사용하여 AWS CodeDeploy가 Lambda 배포를 확인하기 위해 호출할 수 있는 Lambda 함수를 지정합니다. BeforeAllowTraffic, AfterAllowTraffic 배포 수명 주기 이벤트에 대해 동일한 함수를 사용하거나 다른 함수를 사용할 수 있습니다. 확인 텍스트가 완료되면 Lambda 확인 함수가 AWS CodeDeploy를 호출하여 'Succeeded' 또는 'Failed' 결과를 전송합니다.

중요

AWS CodeDeploy가 1시간 이내에 Lambda 확인 함수를 통해 알림을 받지 못하면 배포가 실패한 것으로 가정합니다.

Lambda 후크 함수 호출 전에 서버는 배포 ID와 수명 주기 이벤트 후크 실행 ID를 통지받아야 합니다.

aws deploy put-lifecycle-event-hook-execution-status --deployment-id <deployment-id> --status Succeeded --lifecycle-event-hook-execution-id <execution-id> --region <region>

다음은 Node.js로 작성된 샘플 Lambda 후크 함수입니다.

'use strict'; const aws = require('aws-sdk'); const codedeploy = new aws.CodeDeploy({apiVersion: '2014-10-06'}); exports.handler = (event, context, callback) => { //Read the DeploymentId from the event payload. var deploymentId = event.DeploymentId; //Read the LifecycleEventHookExecutionId from the event payload var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId; /* Enter validation tests here. */ // Prepare the validation test results with the deploymentId and // the lifecycleEventHookExecutionId for AWS CodeDeploy. var params = { deploymentId: deploymentId, lifecycleEventHookExecutionId: lifecycleEventHookExecutionId, status: 'Succeeded' // status can be 'Succeeded' or 'Failed' }; // Pass AWS CodeDeploy the prepared validation test results. codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) { if (err) { // Validation failed. callback('Validation test failed'); } else { // Validation succeeded. callback(null, 'Validation test succeeded'); } }); };

EC2/온프레미스 배포를 위한 AppSpec 'hooks' 섹션

수명 주기 이벤트 후크 목록

EC2/온프레미스 배포 후크는 인스턴스에 대한 배포별로 한 번 실행됩니다. 후크에서 실행할 하나 이상의 스크립트를 지정할 수 있습니다. 수명 주기 이벤트에 대한 각 후크는 별도의 줄에서 문자열로 지정됩니다. 다음은 AppSpec 파일에 사용할 수 있는 후크에 대한 설명입니다.

어떤 수명 주기 이벤트 후크가 어떤 배포 및 롤백 유형에 유효한지는 수명 주기 이벤트 후크 가용성 단원을 참조하십시오.

  • ApplicationStop – 이 배포 수명 주기 이벤트는 애플리케이션 개정 다운로드 이전에도 발생합니다. 이 이벤트에 대해서는 애플리케이션을 안전하게 종료하거나 배포 준비 시 현재 설치된 패키지를 제거하도록 지정할 수 있습니다. 이 배포 수명 주기 이벤트에 사용되는 AppSpec file 및 스크립트는 이전에 성공적으로 배포된 애플리케이션 개정에서 가져옵니다.

    참고

    AppSpec file은 인스턴스에 배포하기 전에는 인스턴스에 존재하지 않습니다. 때문에 인스턴스에 처음으로 배포하면 ApplicationStop 후크는 실행되지 않습니다. 인스턴스에 두 번째 배포하면 ApplicationStop 후크를 사용할 수 있습니다.

    가장 마지막으로 배포가 완료된 애플리케이션 개정의 위치를 확인하기 위해 AWS CodeDeploy 에이전트는 deployment-group-id_last_successful_install 파일에 나와 있는 위치를 찾습니다. 이 파일의 위치는 다음과 같습니다.

    Amazon Linux, Ubuntu Server 및 RHEL Amazon EC2 인스턴스의 /opt/codedeploy-agent/deployment-root/deployment-instructions 폴더

    Windows Server Amazon EC2 인스턴스의 C:\ProgramData\Amazon\CodeDeploy\deployment-instructions 폴더

    ApplicationStop 배포 수명 주기 이벤트 중 실패하는 배포 문제를 해결하려면 실패한 ApplicationStop, BeforeBlockTraffic 및 AfterBlockTraffic 배포 수명 주기 이벤트 문제 해결 단원을 참조하십시오.

  • DownloadBundle – 이 배포 수명 주기 이벤트 중 AWS CodeDeploy 에이전트는 애플리케이션 개정 파일을 다음 임시 위치로 복사합니다.

    Amazon Linux, Ubuntu Server 및 RHEL Amazon EC2 인스턴스의 /opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive 폴더

    Windows Server Amazon EC2 인스턴스의 C:\ProgramData\Amazon\CodeDeploy\deployment-group-id\deployment-id\deployment-archive 폴더

    이 이벤트는 AWS CodeDeploy 에이전트에 예약되어 있으므로 스크립트 실행에 사용할 수 없습니다.

    DownloadBundle 배포 수명 주기 이벤트 중 실패하는 배포 문제를 해결하려면 실패하고 "UnknownError: not opened for reading"이 표시되는 DownloadBundle 배포 수명 주기 이벤트 문제 해결 단원을 참조하십시오.

  • BeforeInstall – 이 배포 수명 주기 이벤트는 파일 암호 해독 및 현재 버전의 백업 만들기 등 사전 설치 작업에 사용할 수 있습니다.

  • Install – 이 배포 수명 주기 이벤트 중 AWS CodeDeploy 에이전트는 임시 위치의 개정 파일을 최종 대상 폴더로 복사합니다. 이 이벤트는 AWS CodeDeploy 에이전트에 예약되어 있으므로 스크립트 실행에 사용할 수 없습니다.

  • AfterInstall – 이 배포 수명 주기 이벤트는 애플리케이션 구성 또는 파일 권한 변경 등의 작업에 사용할 수 있습니다.

  • ApplicationStart – 이 배포 수명 주기 이벤트는 일반적으로 ApplicationStop 중 중지된 서비스를 다시 시작하는 데 사용됩니다.

  • ValidateService – 마지막 배포 수명 주기 이벤트입니다. 배포가 성공적으로 완료되었는지 확인하는 데 사용됩니다.

  • BeforeBlockTraffic – 이 배포 수명 주기 이벤트는 로드 밸런서에서 작업이 등록 취소되기 전에 인스턴스에서 작업을 실행하는 데 사용할 수 있습니다.

    BeforeBlockTraffic 배포 수명 주기 이벤트 중 실패하는 배포 문제를 해결하려면 실패한 ApplicationStop, BeforeBlockTraffic 및 AfterBlockTraffic 배포 수명 주기 이벤트 문제 해결 단원을 참조하십시오.

  • BlockTraffic – 이 배포 수명 주기 이벤트 중에는 현재 트래픽을 제공하는 인스턴스에 액세스할 수 없도록 인터넷 트래픽이 차단됩니다. 이 이벤트는 AWS CodeDeploy 에이전트에 예약되어 있으므로 스크립트 실행에 사용할 수 없습니다.

  • AfterBlockTraffic – 이 배포 수명 주기 이벤트는 로드 밸런서에서 작업이 등록 취소된 후 인스턴스에서 작업을 실행하는 데 사용할 수 있습니다.

    AfterBlockTraffic 배포 수명 주기 이벤트 중 실패하는 배포 문제를 해결하려면 실패한 ApplicationStop, BeforeBlockTraffic 및 AfterBlockTraffic 배포 수명 주기 이벤트 문제 해결 단원을 참조하십시오.

  • BeforeAllowTraffic – 이 배포 수명 주기 이벤트는 로드 밸런서에 작업이 등록되기 전에 인스턴스에서 작업을 실행하는 데 사용할 수 있습니다.

  • AllowTraffic – 이 배포 수명 주기 이벤트 중에는 배포 후 인터넷 트래픽이 인스턴스에 액세스할 수 있도록 허용됩니다. 이 이벤트는 AWS CodeDeploy 에이전트에 예약되어 있으므로 스크립트 실행에 사용할 수 없습니다.

  • AfterAllowTraffic – 이 배포 수명 주기 이벤트는 로드 밸런서에 작업이 등록된 후 인스턴스에서 작업을 실행하는 데 사용할 수 있습니다.

수명 주기 이벤트 후크 가용성

다음 표에는 각 배포 및 롤백 시나리오에 사용할 수 있는 수명 주기 이벤트 후크가 나와 있습니다.

수명 주기 이벤트 이름 인 플레이스 배포¹ 블루/그린 배포: 원본 인스턴스 블루/그린 배포: 대체 인스턴스 블루/그린 배포 롤백: 원본 인스턴스 블루/그린 배포 롤백: 대체 인스턴스
ApplicationStop
DownloadBundle²
BeforeInstall
설치 ²
AfterInstall
ApplicationStart
ValidateService
BeforeBlockTraffic
BlockTraffic²
AfterBlockTraffic
BeforeAllowTraffic
AllowTraffic²
AfterAllowTraffic

¹인 플레이스 배포의 롤백에도 적용됩니다.

² AWS CodeDeploy 작업에 대해 예약되어 있습니다. 스크립트를 실행하는 데 사용할 수 없습니다.

배포 시 후크의 실행 순서

인 플레이스(in-place) 배포

인 플레이스(in-place) 배포 시(인 플레이스(in-place) 배포의 롤백 포함) 이벤트 후크는 다음 순서로 실행됩니다.

참고

인 플레이스 배포의 경우 배포 그룹의 Elastic Load Balancing에서 Classic Load Balancer, Application Load Balancer 또는 Network Load Balancer를 지정한 경우에만 트래픽 차단 및 허용과 관련된 후크 6개가 적용됩니다.

참고

배포의 Start, DownloadBundle, InstallEnd 이벤트는 스크립팅할 수 없기 때문에 이 다이어그램에서 회색으로 표시됩니다. 그러나 AppSpec file의 'files' 섹션을 편집하여 Install 이벤트 중 설치되는 항목을 지정할 수 있습니다.

블루/그린 배포

블루/그림 배포에서 이벤트 후크는 다음 순서대로 실행됩니다.

참고

배포의 Start, DownloadBundle, Install, BlockTraffic, AllowTrafficEnd 이벤트는 스크립팅할 수 없기 때문에 이 다이어그램에서 회색으로 표시됩니다. 그러나 AppSpec file의 'files' 섹션을 편집하여 Install 이벤트 중 설치되는 항목을 지정할 수 있습니다.

'hooks' 섹션의 구조

'hooks' 섹션의 구조는 다음과 같습니다.

hooks: deployment-lifecycle-event-name: - location: script-location timeout: timeout-in-seconds runas: user-name

배포 수명 주기 이벤트 이름 뒤의 hook 항목에 다음 요소를 포함할 수 있습니다.

location

필수. 개정의 스크립트 파일 번들 위치

timeout

선택. 스크립트가 실패로 간주되기 전에 실행할 수 있는 기간(초). 기본값은 3600초(1시간)입니다.

참고

3600초(1시간)은 각 배포 수명 주기 이벤트에 대한 스크립트 실행에 허용되는 최대 시간입니다. 스크립트가 이 한도를 초과하면 배포가 중지되고 인스턴스에 대한 배포가 실패합니다. 각 배포 수명 주기 이벤트의 모든 스크립트에 대해 timeout에 지정된 총 시간(초)이 이 한도를 초과하지 않아야 합니다.

runas

선택. 스크립트 실행 시 가장하는 사용자. 기본적으로 인스턴스에서 실행 중인 AWS CodeDeploy 에이전트입니다. AWS CodeDeploy에서는 암호를 저장하지 않기 때문에 runas 사용자가 암호를 필요로 하는 경우 사용자를 가장할 수 없습니다. 이 요소는 Amazon Linux 및 Ubuntu Server 인스턴스에만 적용됩니다.

후크의 환경 변수 가용성

각 배포 수명 주기 이벤트 중 후크 스크립트는 다음 환경 변수에 액세스할 수 있습니다.

APPLICATION_NAME

현재 배포의 일부인 AWS CodeDeploy의 애플리케이션 이름(예: WordPress_App)

DEPLOYMENT_ID

ID AWS CodeDeploy가 현재 배포에 할당됩니다(예: d-AB1CDEF23).

DEPLOYMENT_GROUP_NAME

현재 배포의 일부인 AWS CodeDeploy의 배포 그룹 이름(예: WordPress_DepGroup)

DEPLOYMENT_GROUP_ID

현재 배포의 일부인 AWS CodeDeploy의 배포 그룹 ID(예: b1a2189b-dd90-4ef5-8f40-4c1c5EXAMPLE)

LIFECYCLE_EVENT

현재 배포 수명 주기 이벤트의 이름(예: AfterInstall)

이러한 환경 변수는 각 배포 수명 주기 이벤트에 대해 로컬에서 적용됩니다.

다음 스크립트는 DEPLOYMENT_GROUP_NAME의 값이 Staging과 동일하면 Apache HTTP 서버의 수신 포트를 80이 아니라 9090으로 변경합니다. 이 스크립트는 BeforeInstall 배포 수명 주기 이벤트 중 호출해야 합니다.

if [ "$DEPLOYMENT_GROUP_NAME" == "Staging" ] then sed -i -e 's/Listen 80/Listen 9090/g' /etc/httpd/conf/httpd.conf fi

다음 스크립트 예제는 DEPLOYMENT_GROUP_NAME 환경 변수의 값이 Staging과 동일하면 오류 로그에 기록되는 메시지의 세부 수준을 경고에서 디버그로 변경합니다. 이 스크립트는 BeforeInstall 배포 수명 주기 이벤트 중 호출해야 합니다.

if [ "$DEPLOYMENT_GROUP_NAME" == "Staging" ] then sed -i -e 's/LogLevel warn/LogLevel debug/g' /etc/httpd/conf/httpd.conf fi

다음 스크립트 예제는 지정된 웹 페이지의 텍스트를 이러한 환경 변수의 값을 표시하는 텍스트로 바꿉니다. 이 스크립트는 AfterInstall 배포 수명 주기 이벤트 중 호출해야 합니다.

#!/usr/bin/python import os strToSearch="<h2>This application was deployed using AWS CodeDeploy.</h2>" strToReplace="<h2>This page for "+os.environ['APPLICATION_NAME']+" application and "+os.environ['DEPLOYMENT_GROUP_NAME']+" deployment group with "+os.environ['DEPLOYMENT_GROUP_ID']+" deployment group ID was generated by a "+os.environ['LIFECYCLE_EVENT']+" script during "+os.environ['DEPLOYMENT_ID']+" deployment.</h2>" fp=open("/var/www/html/index.html","r") buffer=fp.read() fp.close() fp=open("/var/www/html/index.html","w") fp.write(buffer.replace(strToSearch,strToReplace)) fp.close()

후크 예제

다음은 AfterInstall 수명 주기 이벤트에 대해 두 개의 후크를 지정하는 hooks 항목의 예입니다.

hooks: AfterInstall: - location: Scripts/RunResourceTests.sh timeout: 180 - location: Scripts/PostDeploy.sh timeout: 180

Scripts/RunResourceTests.sh 스크립트는 배포 프로세스의 AfterInstall 단계 중 실행됩니다. 스크립트 실행 시간이 180초(3분)를 넘어가면 배포에 성공하지 못합니다.

'hooks' 섹션에서 지정한 스크립트 위치는 애플리케이션 개정 번들의 루트를 기준으로 합니다. 위의 예제에서 RunResourceTests.sh 파일은 Scripts 디렉터리에 있습니다. Scripts 디렉터리는 번들의 루트 수준에 있습니다. 자세한 내용은 AWS CodeDeploy에 대한 개정 계획 단원을 참조하십시오.