AppSpec '섹션 - AWS CodeDeploy

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AppSpec '섹션

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

Amazon ECS 배포를 위한 AppSpec '섹션'

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

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

  • BeforeInstall— 대체 작업 세트가 생성되기 전에 작업을 실행할 때 사용합니다. 대상 그룹 하나가 원래 작업 세트와 연결됩니다. 테스트 리스너(선택 사항)가 지정된 경우 원래 작업 세트와 연결됩니다. 이 시점에서는 롤백이 불가능합니다.

  • AfterInstall— 대체 작업 세트가 생성되었고 대상 그룹 중 하나가 연결된 후 작업을 실행할 때 사용합니다. 테스트 리스너(선택 사항)가 지정된 경우 원래 작업 세트와 연결됩니다. 이 수명 주기 이벤트에서 후크 함수의 결과는 롤백을 트리거할 수 있습니다.

  • AfterAllowTestTraffic테스트 리스너가 대체 작업 세트에 트래픽을 제공한 후 작업을 실행할 때 사용합니다. 이 시점에서 후크 함수의 결과는 롤백을 트리거할 수 있습니다.

  • BeforeAllowTraffic— 두 번째 대상 그룹이 대체 작업 세트와 연결된 후이지만 트래픽이 대체 작업 세트로 전환되기 전에 작업을 실행할 때 사용합니다. 이 수명 주기 이벤트에서 후크 함수의 결과는 롤백을 트리거할 수 있습니다.

  • AfterAllowTraffic— 두 번째 대상 그룹이 대체 작업 세트에 트래픽을 제공한 후 작업을 실행할 때 사용합니다. 이 수명 주기 이벤트에서 후크 함수의 결과는 롤백을 트리거할 수 있습니다.

자세한 내용은 Amazon ECS 배포 중 발생하는 상황자습서: 확인 테스트를 포함한 Amazon ECS 서비스 배포 섹션을 참조하세요.

Amazon ECS 배포 시 후크의 실행 순서

Amazon ECS 배포에서 이벤트 후크는 다음 순서대로 실행됩니다.

참고

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

'hooks' 섹션의 구조

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

YAML 사용:

Hooks: - BeforeInstall: "BeforeInstallHookFunctionName" - AfterInstall: "AfterInstallHookFunctionName" - AfterAllowTestTraffic: "AfterAllowTestTrafficHookFunctionName" - BeforeAllowTraffic: "BeforeAllowTrafficHookFunctionName" - AfterAllowTraffic: "AfterAllowTrafficHookFunctionName"

JSON 사용:

"Hooks": [ { "BeforeInstall": "BeforeInstallHookFunctionName" }, { "AfterInstall": "AfterInstallHookFunctionName" }, { "AfterAllowTestTraffic": "AfterAllowTestTrafficHookFunctionName" }, { "BeforeAllowTraffic": "BeforeAllowTrafficHookFunctionName" }, { "AfterAllowTraffic": "AfterAllowTrafficHookFunctionName" } ] }

샘플 '함수

사용'hooks'섹션을 사용하여 CodeDCodeDeploy 가 Lambda 배포를 확인하기 위해 호출할 수 있는 Lambda 함수를 지정합니다. BeforeInstall, AfterInstall, AfterAllowTestTraffic, BeforeAllowTrafficAfterAllowTraffic 배포 수명 주기 이벤트에 동일한 함수 또는 다른 함수를 사용할 수 있습니다. 검증 테스트가 완료되면 LambdaAfterAllowTraffic함수는 CodeDeploy 를 다시 호출하고Succeeded또는Failed.

중요

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

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

다음은 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 CodeDeploy. var params = { deploymentId: deploymentId, lifecycleEventHookExecutionId: lifecycleEventHookExecutionId, status: 'Succeeded' // status can be 'Succeeded' or 'Failed' }; // Pass 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'); } }); };

에 대한 AppSpec '섹션'AWSLambda 배포

에 대한 수명 주기 이벤트 후크 목록AWSLambda 배포

한AWSLambda 후크는 수명 주기 이벤트의 이름 뒤에 있는 새로운 줄에서 문자열로 지정된 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" }]

샘플 '함수

'hooks' 섹션을 사용하여 CodeDCodeDeploy 가 Lambda 배포의 유효성을 확인하기 위해 호출할 수 있는 Lambda 함수를 지정합니다. BeforeAllowTrafficAfterAllowTraffic 배포 수명 주기 이벤트에 동일한 함수 또는 다른 함수를 사용할 수 있습니다. 확인 텍스트가 완료된 후 Lambda 확인 함수는 CodeDCodeDeploy 를 다시 호출하고Succeeded또는Failed.

중요

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

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

다음은 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 CodeDeploy. var params = { deploymentId: deploymentId, lifecycleEventHookExecutionId: lifecycleEventHookExecutionId, status: 'Succeeded' // status can be 'Succeeded' or 'Failed' }; // Pass 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 '섹션

수명 주기 이벤트 후크 목록

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

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

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

    참고

    AppSpec 파일은 배포하기 전에 인스턴스에 존재하지 않습니다. 이러한 이유로, 인스턴스에 처음으로 배포할 때는 ApplicationStop 후크가 실행되지 않습니다. 인스턴스에 두 번째로 배포할 때는 ApplicationStop 후크를 사용할 수 있습니다.

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

    /opt/codedeploy-agent/deployment-root/deployment-instructions폴더는 Amazon 리눅스, 우분투 서버 및 RHEL Amazon EC2 인스턴스에 있습니다.

    C:\ProgramData\Amazon\CodeDeploy\deployment-instructionsWindows Server Amazon EC2 인스턴스에 연결합니다.

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

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

    /opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive폴더는 Amazon 리눅스, 우분투 서버 및 RHEL Amazon EC2 인스턴스에 있습니다.

    C:\ProgramData\Amazon\CodeDeploy\deployment-group-id\deployment-id\deployment-archiveWindows Server Amazon EC2 인스턴스에 연결합니다.

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

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

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

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

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

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

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

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

    BeforeBlockTraffic 배포 수명 주기 이벤트 중 실패하는 배포 문제를 해결하려면 실패한 애플리케이션 문제 해결Stop, BeforeBlockTraffic 또는 AfterBlockTraffic 배포 수명 주기 이벤트 배포 단원을 참조하십시오.

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

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

    AfterBlockTraffic 배포 수명 주기 이벤트 중 실패하는 배포 문제를 해결하려면 실패한 애플리케이션 문제 해결Stop, BeforeBlockTraffic 또는 AfterBlockTraffic 배포 수명 주기 이벤트 배포 단원을 참조하십시오.

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

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

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

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

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

수명 주기 이벤트 이름 [In-place deployment] 블루/그린 배포: [Original instances] 블루/그린 배포: 대체 인스턴스 블루/그린 배포 롤백: [Original instances] 블루/그린 배포 롤백: 대체 인스턴스
ApplicationStop
DownloadBundle²
BeforeInstall
설치²
AfterInstall
ApplicationStart
ValidateService
BeforeBlockTraffic
BlockTraffic²
AfterBlockTraffic
BeforeAllowTraffic
AllowTraffic²
AfterAllowTraffic

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

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

배포에서 후크 순서 실행

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

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

참고

현재 위치 배포의 경우 트래픽 차단 및 허용과 관련된 6개의 후크는 배포 그룹의 Elastic Load Balancer에서 Classic Load Balancer, Application Load Balancer 또는 네트워크 로드 밸런서를 지정한 경우에만 적용됩니다.

참고

배포의 Start, DownloadBundle, InstallEnd 이벤트는 스크립팅할 수 없기 때문에 이 다이어그램에서 회색으로 표시됩니다. 그러나 편집할 수 있는'files'이 섹션에서는 AppSpec 파일의설치이벤트를 트리거합니다.

블루/그린 배포

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

참고

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

'hooks' 섹션의 구조

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

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

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

location

필수. 개정의 스크립트 파일 번들 위치 스크립트에서 지정하는 스크립트의 위치hooks섹션은 애플리케이션 개정 번들의 루트를 기준으로 합니다. 자세한 내용은 CodeDeploy 에 대한 수정 버전 계획 섹션을 참조하세요.

timeout

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

참고

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

runas

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

후크에 대한 환경 변수 가용성

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

APPLICATION_NAME

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

DEPLOYMENT_ID

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

DEPLOYMENT_GROUP_NAME

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

DEPLOYMENT_GROUP_ID

현재 배포의 일부인 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 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()

후크 예제

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

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 디렉터리는 번들의 루트 수준에 있습니다. 자세한 내용은 CodeDeploy 에 대한 수정 버전 계획 섹션을 참조하세요.