

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

# AppSpec 'hooks' 섹션
<a name="reference-appspec-file-structure-hooks"></a>

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

**Topics**
+ [Amazon ECS 배포를 위한 AppSpec 'hooks' 섹션](#appspec-hooks-ecs)
+ [AWS Lambda 배포를 위한 AppSpec 'hooks' 섹션](#appspec-hooks-lambda)
+ [EC2/온프레미스 배포를 위한 AppSpec 'hooks' 섹션](#appspec-hooks-server)

## Amazon ECS 배포를 위한 AppSpec 'hooks' 섹션
<a name="appspec-hooks-ecs"></a>

**Topics**
+ [Amazon ECS 배포를 위한 수명 주기 이벤트 후크 목록](#reference-appspec-file-structure-hooks-list-ecs)
+ [Amazon ECS 배포 시 후크의 실행 순서입니다.](#reference-appspec-file-structure-hooks-run-order-ecs)
+ ['hooks' 섹션의 구조](#reference-appspec-file-structure-hooks-section-structure-ecs)
+ [샘플 Lambda 'hooks' 함수](#reference-appspec-file-structure-hooks-section-structure-ecs-sample-function)

### Amazon ECS 배포를 위한 수명 주기 이벤트 후크 목록
<a name="reference-appspec-file-structure-hooks-list-ecs"></a>

 AWS Lambda 후크는 수명 주기 이벤트 이름 뒤의 새 줄에 문자열로 지정된 하나의 Lambda 함수입니다. 각 후크는 배포별로 한 번 실행됩니다. 다음은 Amazon ECS 배포 중에 후크를 실행할 수 있는 수명 주기 이벤트에 대한 설명입니다.
+  `BeforeInstall` – 대체 작업 세트가 생성되기 전에 작업을 실행하려면 이 항목을 사용합니다. 대상 그룹 하나가 원래 작업 세트와 연결됩니다. 테스트 리스너(선택 사항)가 지정된 경우 원래 작업 세트와 연결됩니다. 이 시점에서는 롤백이 불가능합니다.
+  `AfterInstall` – 대체 작업 세트가 생성되고 대상 그룹 중 하나가 연결된 후 작업을 실행하면 이 항목을 사용합니다. 테스트 리스너(선택 사항)가 지정된 경우 원래 작업 세트와 연결됩니다. 이 수명 주기 이벤트에서 후크 함수의 결과는 롤백을 트리거할 수 있습니다.
+  `AfterAllowTestTraffic` – 테스트 리스너가 대체 작업 세트에 트래픽을 제공한 후 작업을 실행하려면 이 항목을 사용합니다. 이 시점에서 후크 함수의 결과는 롤백을 트리거할 수 있습니다.
+  `BeforeAllowTraffic` – 두 번째 대상 그룹이 대체 작업 세트와 연결된 후 트래픽이 대체 작업 세트로 전환되기 전에 작업을 실행하려면 이 항목을 사용합니다. 이 수명 주기 이벤트에서 후크 함수의 결과는 롤백을 트리거할 수 있습니다.
+  `AfterAllowTraffic` – 두 번째 대상 그룹이 대체 작업 세트에 트래픽을 제공한 후 작업을 실행하려면 이 항목을 사용합니다. 이 수명 주기 이벤트에서 후크 함수의 결과는 롤백을 트리거할 수 있습니다.

자세한 내용은 [Amazon ECS 배포 중에 발생하는 일](deployment-steps-ecs.md#deployment-steps-what-happens) 및 [튜토리얼: Amazon ECS 서비스 배포 및 확인 테스트](tutorial-ecs-deployment-with-hooks.md) 섹션을 참조하세요.

### Amazon ECS 배포 시 후크의 실행 순서입니다.
<a name="reference-appspec-file-structure-hooks-run-order-ecs"></a>

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

![\[Amazon ECS 배포 시 이벤트 후크의 실행 순서입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/lifecycle-event-order-ecs.png)


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

### 'hooks' 섹션의 구조
<a name="reference-appspec-file-structure-hooks-section-structure-ecs"></a>

다음은 `'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"
		}
	]
}
```

### 샘플 Lambda 'hooks' 함수
<a name="reference-appspec-file-structure-hooks-section-structure-ecs-sample-function"></a>

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

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

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

 다음은 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');
        }
    });
};
```

## AWS Lambda 배포를 위한 AppSpec 'hooks' 섹션
<a name="appspec-hooks-lambda"></a>

**Topics**
+ [AWS Lambda 배포를 위한 수명 주기 이벤트 후크 목록](#reference-appspec-file-structure-hooks-list-lambda)
+ [Lambda 함수 버전 배포에서 후크 실행 순서](#reference-appspec-file-structure-hooks-run-order-lambda)
+ ['hooks' 섹션의 구조](#reference-appspec-file-structure-hooks-section-structure-lambda)
+ [샘플 Lambda 'hooks' 함수](#reference-appspec-file-structure-hooks-section-structure-lambda-sample-function)

### AWS Lambda 배포를 위한 수명 주기 이벤트 후크 목록
<a name="reference-appspec-file-structure-hooks-list-lambda"></a>

 AWS Lambda 후크는 수명 주기 이벤트 이름 뒤의 새 줄에 문자열로 지정된 하나의 Lambda 함수입니다. 각 후크는 배포별로 한 번 실행됩니다. 다음은 AppSpec 파일에서 사용할 수 있는 후크에 대한 설명입니다.
+ **BeforeAllowTraffic** – 배포된 Lambda 함수 버전으로 트래픽을 전환하기 전에 작업을 실행하려면 이 항목을 사용합니다.
+ **AfterAllowTraffic** – 배포된 Lambda 함수 버전으로 모든 트래픽이 전환된 후에 작업을 실행하려면 이 항목을 사용합니다.

### Lambda 함수 버전 배포에서 후크 실행 순서
<a name="reference-appspec-file-structure-hooks-run-order-lambda"></a>

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

![\[Lambda 배포의 이벤트 후크 순서입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/lifecycle-event-order-lambda.png)


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

### 'hooks' 섹션의 구조
<a name="reference-appspec-file-structure-hooks-section-structure-lambda"></a>

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

YAML 사용:

```
hooks:
   - BeforeAllowTraffic: BeforeAllowTrafficHookFunctionName
   - AfterAllowTraffic: AfterAllowTrafficHookFunctionName
```

JSON 사용:

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

### 샘플 Lambda 'hooks' 함수
<a name="reference-appspec-file-structure-hooks-section-structure-lambda-sample-function"></a>

'hooks' 섹션을 사용하여 CodeDeploy가 Lambda 배포를 확인하기 위해 호출할 수 있는 Lambda 함수를 지정합니다. `BeforeAllowTraffic` 및 `AfterAllowTraffic` 배포 수명 주기 이벤트에 동일한 함수 또는 다른 함수를 사용할 수 있습니다. 검증 테스트가 완료되면 Lambda 확인 함수는 CodeDeploy를 다시 호출하고 `Succeeded` 또는 `Failed` 결과를 전달합니다.

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

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

 다음은 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 'hooks' 섹션
<a name="appspec-hooks-server"></a>

**Topics**
+ [수명 주기 이벤트 후크 목록](#reference-appspec-file-structure-hooks-list)
+ [수명 주기 이벤트 후크 가용성](#reference-appspec-file-structure-hooks-availability)
+ [배포 시 후크의 실행 순서](#reference-appspec-file-structure-hooks-run-order)
+ ['hooks' 섹션의 구조](#reference-appspec-file-structure-hooks-section-structure)
+ [후크 스크립트에서 파일 참조](#codedeploy-agent-working-directory)
+ [후크의 환경 변수 가용성](#reference-appspec-file-structure-environment-variable-availability)
+ [후크 예제](#reference-appspec-file-structure-hooks-example)

### 수명 주기 이벤트 후크 목록
<a name="reference-appspec-file-structure-hooks-list"></a>

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

어떤 수명 주기 이벤트 후크가 어떤 배포 및 롤백 유형에 유효한지는 [수명 주기 이벤트 후크 가용성](#reference-appspec-file-structure-hooks-availability) 단원을 참조하세요.
+ `ApplicationStop` – 이 배포 수명 주기 이벤트는 애플리케이션 수정이 다운로드되기 전에도 발생합니다. 이 이벤트에 대해서는 애플리케이션을 안전하게 종료하거나 배포 준비 중에 현재 설치된 패키지를 제거하도록 스크립트를 지정할 수 있습니다. 이 배포 수명 주기 이벤트에 사용되는 AppSpec 파일 및 스크립트는 이전에 성공적으로 배포된 애플리케이션 수정에서 가져옵니다.
**참고**  
AppSpec 파일은 인스턴스에 배포하기 전에는 인스턴스에 존재하지 않습니다. 이러한 이유로, 인스턴스에 처음으로 배포할 때는 `ApplicationStop` 후크가 실행되지 않습니다. 인스턴스에 두 번째로 배포할 때는 `ApplicationStop` 후크를 사용할 수 있습니다.

   가장 마지막으로 배포가 완료된 애플리케이션 수정의 위치를 확인하기 위해 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 배포 수명 주기 이벤트 문제 해결](troubleshooting-deployments.md#troubleshooting-deployments-lifecycle-event-failures) 단원을 참조하세요.
+ `DownloadBundle` – 이 배포 수명 주기 이벤트 중 에이전트는 애플리케이션 수정 파일을 다음 임시 위치로 복사합니다.

  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` 폴더.

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

  `DownloadBundle` 배포 수명 주기 이벤트 중 실패하는 배포 문제를 해결하려면 [실패하고 UnknownError: not opened for reading이 표시되는 DownloadBundle 배포 수명 주기 이벤트 문제 해결](troubleshooting-deployments.md#troubleshooting-deployments-downloadbundle) 단원을 참조하세요.
+ `BeforeInstall` – 파일 암호화 해제 및 현재 버전의 백업 만들기와 같은 사전 설치 작업에 이 배포 수명 주기 이벤트를 사용할 수 있습니다.
+ `Install` – 이 배포 수명 주기 이벤트 중에 CodeDeploy 에이전트는 수정 파일을 임시 위치에서 최종 대상 폴더로 복사합니다. 이 이벤트는 CodeDeploy 에이전트에 예약되어 있으므로 스크립트 실행에 사용할 수 없습니다.
+ `AfterInstall` – 애플리케이션 구성 또는 파일 권한 변경과 같은 작업에 이 배포 수명 주기 이벤트를 사용할 수 있습니다.
+ `ApplicationStart` - `ApplicationStop` 중에 중지된 서비스를 다시 시작하려면 일반적으로 이 배포 수명 주기 이벤트를 사용합니다.
+ `ValidateService` – 마지막 배포 수명 주기 이벤트입니다. 배포가 성공적으로 완료되었는지 확인하는 데 사용됩니다.
+ `BeforeBlockTraffic` – 로드 밸런서에서 작업이 등록 취소되기 전에 인스턴스에서 작업을 실행하려면 이 배포 수명 주기 이벤트를 사용할 수 있습니다.

  `BeforeBlockTraffic` 배포 수명 주기 이벤트 중 실패하는 배포 문제를 해결하려면 [실패한 ApplicationStop, BeforeBlockTraffic 또는 AfterBlockTraffic 배포 수명 주기 이벤트 문제 해결](troubleshooting-deployments.md#troubleshooting-deployments-lifecycle-event-failures) 단원을 참조하세요.
+ `BlockTraffic` – 이 배포 수명 주기 이벤트 중에는 트래픽을 현재 제공하고 있는 인스턴스에 액세스할 수 없도록 인터넷 트래픽이 차단됩니다. 이 이벤트는 CodeDeploy 에이전트에 예약되어 있으므로 스크립트 실행에 사용할 수 없습니다.
+ `AfterBlockTraffic` – 각 로드 밸런서에서 작업이 등록 취소된 후 인스턴스에서 작업을 실행하려면 이 배포 수명 주기 이벤트를 사용할 수 있습니다.

  `AfterBlockTraffic` 배포 수명 주기 이벤트 중 실패하는 배포 문제를 해결하려면 [실패한 ApplicationStop, BeforeBlockTraffic 또는 AfterBlockTraffic 배포 수명 주기 이벤트 문제 해결](troubleshooting-deployments.md#troubleshooting-deployments-lifecycle-event-failures) 단원을 참조하세요.
+ `BeforeAllowTraffic` – 로드 밸런서에 작업이 등록되기 전에 인스턴스에서 작업을 실행하려면 이 배포 수명 주기 이벤트를 사용할 수 있습니다.
+ `AllowTraffic` – 이 배포 수명 주기 이벤트 중에는 배포 후 인터넷 트래픽이 인스턴스에 액세스할 수 있도록 허용됩니다. 이 이벤트는 CodeDeploy 에이전트에 예약되어 있으므로 스크립트 실행에 사용할 수 없습니다.
+ `AfterAllowTraffic` – 로드 밸런서에 작업이 등록된 후 인스턴스에서 작업을 실행하려면 이 배포 수명 주기 이벤트를 사용할 수 있습니다.

### 수명 주기 이벤트 후크 가용성
<a name="reference-appspec-file-structure-hooks-availability"></a>

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


| 수명 주기 이벤트 이름 | Auto Scaling 시작 배포¹ | Auto Scaling 종료 배포¹ | 현재 위치 배포¹ | 블루/그린 배포: 원본 인스턴스 | 블루/그린 배포: 대체 인스턴스 | 블루/그린 배포 롤백: 원본 인스턴스 | 블루/그린 배포 롤백: 대체 인스턴스 | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
| ApplicationStop | ✓ | ✓ | ✓ |  | ✓ |  |  | 
| DownloadBundle³ | ✓ |  | ✓ |  | ✓ |  |  | 
| BeforeInstall | ✓ |  | ✓ |  | ✓ |  |  | 
| Install³ | ✓ |  | ✓ |  | ✓ |  |  | 
| AfterInstall | ✓ |  | ✓ |  | ✓ |  |  | 
| ApplicationStart | ✓ |  | ✓ |  | ✓ |  |  | 
| ValidateService | ✓ |  | ✓ |  | ✓ |  |  | 
| BeforeBlockTraffic |  | ✓ | ✓ | ✓ |  |  | ✓ | 
| BlockTraffic³ |  | ✓ | ✓ | ✓ |  |  | ✓ | 
| AfterBlockTraffic |  | ✓ | ✓ | ✓ |  |  | ✓ | 
| BeforeAllowTraffic | ✓ |  | ✓ |  | ✓ | ✓ |  | 
| AllowTraffic³ | ✓ |  | ✓ |  | ✓ | ✓ |  | 
| AfterAllowTraffic | ✓ |  | ✓ |  | ✓ | ✓ |  | 
|  ¹ Amazon EC2 Auto Scaling 배포에 대한 자세한 내용은 [Amazon EC2 Auto Scaling에서 CodeDeploy를 사용하는 방식](integrations-aws-auto-scaling.md#integrations-aws-auto-scaling-behaviors) 단원을 참조하세요. ² 현재 위치 배포의 롤백에도 적용됩니다. ³ CodeDeploy 작업을 위해 예약되어 있습니다. 스크립트를 실행하는 데 사용할 수 없습니다.  | 

### 배포 시 후크의 실행 순서
<a name="reference-appspec-file-structure-hooks-run-order"></a>

**Auto Scaling 시작 배포**

Auto Scaling 시작 배포 중에 CodeDeploy는 다음 순서로 이벤트 후크를 실행합니다.

Amazon EC2 Auto Scaling 시작 배포에 대한 자세한 내용은 [Amazon EC2 Auto Scaling에서 CodeDeploy를 사용하는 방식](integrations-aws-auto-scaling.md#integrations-aws-auto-scaling-behaviors) 단원을 참조하세요.

![\[Auto Scaling 시작 배포 중에 이벤트 후크의 실행 순서입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/lifecycle-event-order-scale-out.png)


**참고**  
배포의 **Start**, **Install**, **TestTraffic**, **AllowTraffic** 및 **End** 이벤트는 스크립트화할 수 없으므로 이 다이어그램에서 회색으로 표시됩니다. 그러나 AppSpec 파일의 `'files'` 섹션을 편집하여 **Install** 이벤트 중 설치되는 항목을 지정할 수 있습니다.

**Auto Scaling 종료 배포**

Auto Scaling 종료 배포 중에 CodeDeploy는 다음 순서로 이벤트 후크를 실행합니다.

Amazon EC2 Auto Scaling 종료 배포에 대한 자세한 내용은 [Auto Scaling 확장 이벤트 중 종료 배포 활성화](integrations-aws-auto-scaling.md#integrations-aws-auto-scaling-behaviors-hook-enable) 단원을 참조하세요.

![\[Auto Scaling 종료 배포 중에 이벤트 후크의 실행 순서입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/lifecycle-event-order-scale-in.png)


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

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

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

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

![\[인플레이스 배포 롤백 중 이벤트 후크의 순서입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/lifecycle-event-order-in-place.png)


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

**블루/그린 배포**

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

![\[블루/그린 배포에서 이벤트 후크의 실행 순서입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/lifecycle-event-order-blue-green.png)


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

### 'hooks' 섹션의 구조
<a name="reference-appspec-file-structure-hooks-section-structure"></a>

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

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

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

** location **  
필수 사항입니다. 수정의 스크립트 파일 번들 위치 `hooks` 섹션에서 지정한 스크립트 위치는 애플리케이션 수정 번들의 루트를 기준으로 합니다. 자세한 내용은 [CodeDeploy의 개정 계획](application-revisions-plan.md) 단원을 참조하십시오.

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

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

### 후크 스크립트에서 파일 참조
<a name="codedeploy-agent-working-directory"></a>

AppSpec [AppSpec 'hooks' 섹션](#reference-appspec-file-structure-hooks) 섹션에 설명된 대로 스크립트를 CodeDeploy 수명 주기 이벤트에 연결하고 스크립트에서 파일(예: `helper.sh`)을 참조하려는 경우 다음을 사용하여 `helper.sh`를 지정해야 합니다.
+ (권장) 절대 경로. [절대 경로 사용](#codedeploy-agent-working-dir-absolute)을(를) 참조하세요.
+ 상대 경로. [상대 경로 사용](#codedeploy-agent-working-dir-relative)을(를) 참조하세요.

#### 절대 경로 사용
<a name="codedeploy-agent-working-dir-absolute"></a>

*절대* 경로를 사용하여 파일을 참조하려면 다음 중 하나를 사용할 수 있습니다.
+ AppSpec 파일의 `files` 섹션의 `destination` 속성에서 절대 경로를 지정합니다. 그런 다음 후크 스크립트에서 동일한 절대 경로를 지정합니다. 자세한 내용은 [AppSpec 'files' 섹션(EC2/온프레미스 배포만 해당)](reference-appspec-file-structure-files.md) 단원을 참조하십시오.
+ 후크 스크립트에서 동적 절대 경로를 지정합니다. 자세한 내용은 [배포 아카이브 위치](#codedeploy-agent-working-dir-archive)를 참조하세요.

**배포 아카이브 위치**

[DownloadBundle](#reference-appspec-file-structure-hooks-list) 수명 주기 이벤트 중에 CodeDeploy 에이전트는 배포를 위한 [개정 버전](application-revisions.md)을 다음 형식의 디렉터리로 추출합니다.

`root-directory/deployment-group-id/deployment-id/deployment-archive`

경로의 *root-directory* 부분은 항상 다음 표에 표시된 기본값으로 설정되거나 `:root_dir` 구성 설정으로 제어됩니다. 구성 설정에 대한 자세한 내용은 [CodeDeploy 에이전트 구성 참조](reference-agent-configuration.md) 단원을 참조하세요.


| 에이전트 플랫폼 | 기본 루트 디렉터리 | 
| --- | --- | 
| Linux – 모든 RPM 분포 |  /opt/codedeploy-agent/deployment-root  | 
| Ubuntu 서버 – 모든 Debian 분포 |  /opt/codedeploy-agent/deployment-root  | 
| Windows Server |  %ProgramData%\$1Amazon\$1CodeDeploy  | 

후크 스크립트에서 루트 디렉터리 경로와 `DEPLOYMENT_ID` 및 `DEPLOYMENT_GROUP_ID` 환경 변수를 사용하여 현재 배포 아카이브에 액세스할 수 있습니다. 사용할 수 있는 변수에 대한 자세한 내용은 [후크의 환경 변수 가용성](#reference-appspec-file-structure-environment-variable-availability) 섹션을 참조하세요.

예를 들어 Linux에서 개정 버전의 루트에 있는 `data.json` 파일에 액세스하는 방법은 다음과 같습니다.

```
#!/bin/bash

rootDirectory="/opt/codedeploy-agent/deployment-root" # note: this will be different if you
                                                      # customize the :root_dir configuration
dataFile="$rootDirectory/$DEPLOYMENT_GROUP_ID/$DEPLOYMENT_ID/deployment-archive/data.json"
data=$(cat dataFile)
```

다른 예로, 다음은 Windows에서 Powershell을 사용하여 개정 버전의 루트에 있는 `data.json` 파일에 액세스하는 방법입니다.

```
$rootDirectory="$env:ProgramData\Amazon\CodeDeploy" # note: this will be different if you
                                                    # customize the :root_dir configuration
$dataFile="$rootDirectory\$env:DEPLOYMENT_GROUP_ID\$env:DEPLOYMENT_ID\deployment-archive\data.json"
$data=(Get-Content $dataFile)
```

#### 상대 경로 사용
<a name="codedeploy-agent-working-dir-relative"></a>

*상대* 경로를 사용하여 파일을 참조하려면 CodeDeploy 에이전트의 작업 디렉터리를 알아야 합니다. 파일 경로는 이 디렉터리를 기준으로 합니다.

다음 표는 CodeDeploy 에이전트의 지원되는 각 플랫폼에 대한 작업 디렉터리를 보여줍니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html)

### 후크의 환경 변수 가용성
<a name="reference-appspec-file-structure-environment-variable-availability"></a>

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

** APPLICATION\$1NAME **  
현재 배포의 일부인 CodeDeploy의 애플리케이션 이름(예: `WordPress_App`)

** DEPLOYMENT\$1ID **  
ID CodeDeploy가 현재 배포에 할당됩니다(예: `d-AB1CDEF23`).

** DEPLOYMENT\$1GROUP\$1NAME **  
현재 배포의 일부인 CodeDeploy의 배포 그룹 이름(예: `WordPress_DepGroup`)

** DEPLOYMENT\$1GROUP\$1ID **  
현재 배포의 일부인 CodeDeploy의 배포 그룹 ID(예: `b1a2189b-dd90-4ef5-8f40-4c1c5EXAMPLE`)

** LIFECYCLE\$1EVENT **  
현재 배포 수명 주기 이벤트의 이름(예: `AfterInstall`)

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

 배포 번들의 소스에 따라 후크 스크립트에 사용할 수 있는 추가 환경 변수가 있습니다.

**Amazon S3의 번들**
+ **BUNDLE\$1BUCKET**

  배포 번들을 다운로드할 수 있는 Amazon S3 버킷의 이름입니다(예: `my-s3-bucket`).
+ **BUNDLE\$1KEY**

  Amazon S3 버킷에서 다운로드한 번들의 객체 키입니다(예: `WordPress_App.zip`).
+ **BUNDLE\$1VERSION**

  번들의 객체 버전입니다(예: `3sL4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY+MTRCxf3vjVBH40Nr8X8gdRQBpUMLUo`). 이 변수는 Amazon S3 버킷에 [객체 버전 관리](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)가 활성화된 경우에만 설정됩니다.
+ **BUNDLE\$1ETAG**

  번들의 객체 etag입니다(예: `b10a8db164e0754105b7a99be72e3fe5-4`).

**GitHub에서 제공하는 번들**
+ **BUNDLE\$1COMMIT**

  Git에서 생성한 번들의 SHA256 커밋 해시입니다(예: `d2a84f4b8b650937ec8f73cd8be2c74add5a911ba64df27458ed8229da804a26`).

다음 스크립트는 **DEPLOYMENT\$1GROUP\$1NAME**의 값이 `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\$1GROUP\$1NAME** 환경 변수의 값이 `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()
```

### 후크 예제
<a name="reference-appspec-file-structure-hooks-example"></a>

`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` 디렉터리는 번들의 루트 수준에 있습니다. 자세한 내용은 [CodeDeploy의 개정 계획](application-revisions-plan.md) 단원을 참조하십시오.