

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AppSpec の「hooks」セクション
<a name="reference-appspec-file-structure-hooks"></a>

AppSpec ファイルの `'hooks'` セクションの内容は、デプロイのコンピューティングプラットフォームによって異なります。EC2/オンプレミスのデプロイの `'hooks'` セクションには、デプロイライフサイクルイベントフックを 1 つ以上のスクリプトにリンクするマッピングが含まれます。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 の「フック」関数のサンプル](#reference-appspec-file-structure-hooks-section-structure-ecs-sample-function)

### Amazon ECS のデプロイ向けのライフサイクルイベントフックのリスト
<a name="reference-appspec-file-structure-hooks-list-ecs"></a>

 AWS Lambda フックは、ライフサイクルイベントの名前の後に新しい行に文字列で指定された 1 つの Lambda 関数です。各フックはデプロイごとに 1 回実行されます。以下は、Amazon ECS デプロイ中にフックを実行できるライフサイクルイベントの説明です。
+  `BeforeInstall` 置き換えタスクセットが作成される前にタスクを実行するために使用します。1 つのターゲットグループが元のタスクセットに関連付けられています。オプションのテストリスナーが指定されている場合、それは元のタスクセットに関連付けられます。この時点で、ロールバックはできません。
+  `AfterInstall` 置き換えタスクセットが作成され、ターゲットグループの 1 つがそれに関連付けられた後、タスクを実行するために使用します。オプションのテストリスナーが指定されている場合、それは元のタスクセットに関連付けられます。このライフサイクルイベントでのフック関数の結果により、ロールバックをトリガーできます。
+  `AfterAllowTestTraffic` テストリスナーが置き換えタスクセットにトラフィックを提供した後、タスクを実行するために使用します。この時点でのフック関数の結果により、ロールバックをトリガーできます。
+  `BeforeAllowTraffic` 2 番目のターゲットグループが置き換えタスクセットに関連付けられた後、かつ、トラフィックが置き換えタスクセットに移行される前に、タスクを実行するために使用します。このライフサイクルイベントでのフック関数の結果により、ロールバックをトリガーできます。
+  `AfterAllowTraffic` 2 番目のターゲットグループが置き換えタスクセットにトラフィックを提供した後、タスクを実行するために使用します。このライフサイクルイベントでのフック関数の結果により、ロールバックをトリガーできます。

詳細については、「[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/ja_jp/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 の「フック」関数のサンプル
<a name="reference-appspec-file-structure-hooks-section-structure-ecs-sample-function"></a>

`'hooks'` セクションを使用して、Amazon ECS のデプロイを検証するために CodeDeploy が呼び出すことができる Lambda 関数を指定します。`BeforeInstall`、`AfterInstall`、`AfterAllowTestTraffic`、`BeforeAllowTraffic`、および `AfterAllowTraffic` のデプロイライフサイクルイベントに対して、同じ関数または異なる関数を使用できます。検証テストが完了すると、Lambda `AfterAllowTraffic` 関数は CodeDeploy を呼び戻し、`Succeeded` または `Failed` の結果を配信します。

**重要**  
1 時間以内に CodeDeploy が 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 の「フック」関数のサンプル](#reference-appspec-file-structure-hooks-section-structure-lambda-sample-function)

### AWS Lambda デプロイのライフサイクルイベントフックのリスト
<a name="reference-appspec-file-structure-hooks-list-lambda"></a>

 AWS Lambda フックは、ライフサイクルイベントの名前の後に新しい行に文字列で指定された 1 つの Lambda 関数です。各フックはデプロイごとに 1 回実行されます。以下は、AppSpec ファイルに使用できるフックの説明です。
+ **BeforeAllowTraffic** – これを使用して、トラフィックがデプロイされた Lambda 関数のバージョンに移行する前にタスクを実行します。
+ **AfterAllowTraffic** – これを使用して、トラフィックがデプロイされた Lambda 関数のバージョンに移行した後でタスクを実行します。

### Lambda 関数のバージョンのデプロイでのフックの実行順
<a name="reference-appspec-file-structure-hooks-run-order-lambda"></a>

サーバーレスの Lambda 関数のバージョンのデプロイでは、イベントフックは次の順序で実行されます。

![\[Lambda デプロイのイベントフックの順序。\]](http://docs.aws.amazon.com/ja_jp/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 の「フック」関数のサンプル
<a name="reference-appspec-file-structure-hooks-section-structure-lambda-sample-function"></a>

「hooks」セクションを使用して、Lambda のデプロイを検証するために CodeDeploy が呼び出すことができる Lambda 関数を指定します。`BeforeAllowTraffic` および `AfterAllowTraffic` デプロイライフサイクルイベントには、同じ関数または異なる関数を使用できます。検証テストが完了すると、Lambda 検証関数は CodeDeploy を呼び戻し、`Succeeded` または `Failed` の結果を配信します。

**重要**  
1 時間以内に CodeDeploy が 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)
+ [hooks の例](#reference-appspec-file-structure-hooks-example)

### ライフサイクルイベントフックのリスト
<a name="reference-appspec-file-structure-hooks-list"></a>

EC2/オンプレミスのデプロイのフックは、デプロイごとに 1 回インスタンスに対して実行されます。フックには実行するスクリプトを 1 つまたは複数指定することができます。ライフサイクルイベントの各フックは、文字列で個別の行に指定します。以下は、AppSpec ファイルに使用できるフックの説明です。

デプロイおよびロールバックの種類別の有効なライフサイクルフックの詳細については、「[ライフサイクルイベントフックの可用性](#reference-appspec-file-structure-hooks-availability)」を参照してください。
+ `ApplicationStop` このデプロイライフサイクルイベントは、アプリケーションリビジョンがダウンロードされる前でも発生します。アプリケーションを適切に中止するか、現在インストールされているパッケージを削除してデプロイの準備をする場合は、このイベントのスクリプトを指定できます。このデプロイライフサイクルイベントに使用される AppSpec ファイルとスクリプトは、前回正常にデプロイされたアプリケーションリビジョンのものです。
**注記**  
AppSpec ファイルは、デプロイする前にはインスタンスに存在しません。したがって、`ApplicationStop` フックは、初めてインスタンスにデプロイするときは実行されません。インスタンスに 2 回目にデプロイするときは、`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` このデプロイライフサイクルイベント中に、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` フォルダ。

  このイベントは CodeDeploy エージェント用に予約されていて、スクリプトを実行するために使用することはできません。

  `DownloadBundle` デプロイライフサイクルイベント中に失敗するデプロイをトラブルシューティングするには、「[「不明なエラー: 読み取り用に開いていません」で失敗した 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 終了デプロイ¹ | インプレースデプロイ¹ | Blue/Green デプロイ: 元のインスタンス | Blue/Green デプロイ: 代替インスタンス | Blue/Green デプロイのロールバック: 元のインスタンス | Blue/Green デプロイのロールバック: 代替インスタンス | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
| 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 は次の順序でイベントフックを実行します。

Auto Scaling 起動デプロイの詳細については、「[Amazon EC2 Auto Scaling と CodeDeploy の連携](integrations-aws-auto-scaling.md#integrations-aws-auto-scaling-behaviors)」を参照してください。

![\[Auto Scaling 起動デプロイ時のイベントフックの順序。\]](http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/images/lifecycle-event-order-scale-out.png)


**注記**  
デプロイの **Start**、**DownloadBundle**、**Install**、**AllowTraffic**、**End** の各イベントはスクリプト化できないため、この図ではグレーで表示されています。ただし、AppSpec ファイルの `'files'` セクションを編集して、**Install** イベント中にインストールされるものを指定できます。

**Auto Scaling 終了デプロイ**

Auto Scaling 終了デプロイ中に、CodeDeploy は次の順序でイベントフックを実行します。

Auto Scaling 終了デプロイの詳細については、「[Auto Scaling スケールインイベント中の終了デプロイの有効化](integrations-aws-auto-scaling.md#integrations-aws-auto-scaling-behaviors-hook-enable)」を参照してください。

![\[Auto Scaling 終了デプロイ時のイベントフックの順序。\]](http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/images/lifecycle-event-order-scale-in.png)


**注記**  
デプロイの **Start**、**BlockTraffic**、**End** の各イベントはスクリプト化できないため、この図ではグレーで表示されています。

**インプレースデプロイ**

インプレースデプロイのロールバックを含むインプレースデプロイで、イベントフックは次の順序で実行されます。

**注記**  
インプレースデプロイの場合、トラフィックのブロックと許可に関する 6 つのフックは、 デプロイグループに Elastic Load Balancing から Classic Load Balancer、Application Load Balancer、または Network Load Balancer を指定した場合のみ適用されます。

![\[インプレースデプロイのロールバック時のイベントフックの順序。\]](http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/images/lifecycle-event-order-in-place.png)


**注記**  
デプロイの **Start**、**DownloadBundle**、**Install**、および **End** イベントはスクリプト化できないため、この図ではグレーで表示されています。ただし、AppSpec ファイルの `'files'` セクションを編集して、**Install** イベント中にインストールされるものを指定できます。

**Blue/Green デプロイ**

Blue/Green デプロイでは、イベントフックは次の順序で実行されます。

![\[ブルー/グリーンデプロイのイベントフックの順序。\]](http://docs.aws.amazon.com/ja_jp/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 の「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 の「ファイル」セクション (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 サーバー — すべての deb ディストリビューション |  /opt/codedeploy-agent/deployment-root  | 
| Windows サーバー |  %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/ja_jp/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 **  
CodeDeploy が、現在のデプロイに割り当てられた ID (例えば、`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()
```

### hooks の例
<a name="reference-appspec-file-structure-hooks-example"></a>

**hooks** エントリの例を次に示します。`AfterInstall` ライフサイクルイベントに 2 つのフックを指定しています。

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

デプロイプロセスの `AfterInstall` ステージ中に、`Scripts/RunResourceTests.sh` スクリプトが実行されます。スクリプトの実行に 180 秒 (3 分) 以上かかる場合、デプロイは成功しません。

「hooks」セクションで指定するスクリプトの場所は、アプリケーションリビジョンバンドルのルートに相対的な位置です。前述の例では、`RunResourceTests.sh` という名前のファイルが `Scripts` という名前のディレクトリにあります。`Scripts` ディレクトリはバンドルのルートレベルにあります。詳細については、「[CodeDeploy のリビジョンを計画する](application-revisions-plan.md)」を参照してください。