

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

# チュートリアル: 検証テストを使用して Amazon ECS サービスをデプロイする
<a name="tutorial-ecs-deployment-with-hooks"></a>

 このチュートリアルでは、Lambda 関数を使用して、更新された Amazon ECS アプリケーションのデプロイの一部を検証する方法について学びます。このチュートリアルでは、CodeDeploy アプリケーション、CodeDeploy デプロイグループ、および [チュートリアル: Amazon ECS へアプリケーションをデプロイする](tutorial-ecs-deployment.md) で使用した Amazon ECS アプリケーションを使用します。そのチュートリアルを完了してからこのチュートリアルを開始してください。

 検証テストを追加するには、最初に Lambda 関数でテストを実装します。次に、デプロイ AppSpec ファイルで、テストしたい ライフサイクルフックのために Lambda 関数を指定します。検証テストが失敗した場合、デプロイは停止し、ロールバックされて、失敗とマークされます。テストが成功すると、デプロイは次のデプロイライフサイクルイベントまたはフックに進みます。

 検証テストを使用した Amazon ECS デプロイ中、CodeDeploy は 2 つのターゲットグループ (1 つの本稼働トラフィックリスナーと 1 つのテストトラフィックリスナー) で構成されたロードバランサーを使用します。次の図表は、デプロイの前に、ロードバランサー、本稼働およびテストリスナー、ターゲットグループ、および Amazon ECS アプリケーションがどのように関連しているかを示しています。このチュートリアルでは、Application Load Balancer を使用します。Network Load Balancer を使用することもできます。

![\[Application Load Balancer または Network Load Balancer、リスナー、ターゲットグループ、タスクセット、Amazon ECS サービス間の接続。\]](http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-1.png)


 Amazon ECS デプロイ中、テスト用の 5 つのライフサイクルフックがあります。このチュートリアルでは、3 番目のライフサイクルデプロイフック、`AfterAllowTestTraffic` 中に 1 つのテストを実装します。詳細については、「[Amazon ECS のデプロイ向けのライフサイクルイベントフックのリスト](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-list-ecs)」を参照してください。デプロイが成功すると、本稼働トラフィックリスナーは新しい置き換えタスクセットにトラフィックを提供し、元のタスクセットは終了します。次の図は、デプロイが成功した後にリソースがどのように関連しているかを示しています。詳細については、「[Amazon ECS デプロイ中の処理で起こっていること](deployment-steps-ecs.md#deployment-steps-what-happens)」を参照してください。

![\[デプロイ後の Application Load Balancer または Network Load Balancer、リスナー、ターゲットグループ、置換タスクセット間の接続。\]](http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-6.png)


**注記**  
このチュートリアルを完了すると、 AWS アカウントに料金が発生する可能性があります。これには、CodeDeploy、 AWS Lambda、CloudWatch に対して発生する可能性のある料金が含まれます。さらなる詳細については、[AWS CodeDeploy の料金](https://aws.amazon.com/codedeploy/pricing/)、[AWS Lambda の料金](https://aws.amazon.com/lambda/pricing/)、および [Amazon CloudWatch の料金](https://aws.amazon.com/cloudwatch/pricing/) を参照してください。

**Topics**
+ [前提条件](tutorial-ecs-with-hooks-prereqs.md)
+ [ステップ 1: テストリスナーを作成する](tutorial-ecs-with-hooks-create-second-listener.md)
+ [ステップ 2: Amazon ECS アプリケーションを更新する](tutorial-ecs-with-hooks-update-the-ecs-application.md)
+ [ステップ 3: ライフサイクルフック Lambda 関数を作成する](tutorial-ecs-with-hooks-create-hooks.md)
+ [ステップ 4: AppSpec ファイルを更新する](tutorial-ecs-with-hooks-create-appspec-file.md)
+ [ステップ 5: CodeDeploy コンソールを使用して Amazon ECS サービスをデプロイする](tutorial-ecs-with-hooks-deployment.md)
+ [ステップ 6: CloudWatch Logs で Lambda フック関数の出力を表示する](tutorial-ecs-with-hooks-view-cw-logs.md)
+ [ステップ 7: クリーンアップする](tutoria-ecs-with-hooks-clean-up.md)

# 前提条件
<a name="tutorial-ecs-with-hooks-prereqs"></a>

このチュートリアルを正常に完了するには、まず以下を行う必要があります。
+  [前提条件](tutorial-ecs-prereqs.md) にある [チュートリアル: Amazon ECS へアプリケーションをデプロイする](tutorial-ecs-deployment.md) の前提条件を完了します。
+  「[チュートリアル: Amazon ECS へアプリケーションをデプロイする](tutorial-ecs-deployment.md)」のステップを完了します。以下を書き留めます。
  +  ロードバランサーの名前。
  +  ターゲットグループの名前。
  +  ロードバランサーのリスナーが使用するポート。
  +  ロードバランサーの ARN。これを使用して新しいリスナーを作成します。
  +  いずれかのターゲットグループの ARN。これを使用して新しいリスナーを作成します。
  +  作成する CodeDeploy アプリケーションとデプロイグループ。
  +  CodeDeploy デプロイで使用されることによって作成する AppSpec ファイル このチュートリアルでは、このファイルを編集します。

# ステップ 1: テストリスナーを作成する
<a name="tutorial-ecs-with-hooks-create-second-listener"></a>

 検証テストを使用する Amazon ECS デプロイには、2 番目のリスナーが必要です。このリスナーは、置き換えタスクセット中の更新された Amazon ECS アプリケーションにテストトラフィックを提供するために使用されます。検証テストは、テストトラフィックに対して実行されます。

 テストトラフィックのリスナーは、いずれのターゲットグループも使用できます。[create-listener](https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-listener.html) AWS CLI コマンドを使用して、テストトラフィックをポート 8080 に転送するデフォルトルールを持つ 2 番目のリスナーを作成します。ロードバランサーの ARN といずれかのターゲットグループの ARN を使用します。

```
aws elbv2 create-listener --load-balancer-arn your-load-balancer-arn \
--protocol HTTP --port 8080 \
--default-actions Type=forward,TargetGroupArn=your-target-group-arn --region your-aws-region
```

# ステップ 2: Amazon ECS アプリケーションを更新する
<a name="tutorial-ecs-with-hooks-update-the-ecs-application"></a>

 このセクションでは、タスク定義の新しいリビジョンを使用するために Amazon ECS アプリケーションを更新します。新しいリビジョンを作成し、タグを追加することでマイナー更新を追加します。

**タスク定義を更新するには**

1. Amazon ECS クラシックコンソール ([https://console.aws.amazon.com/ecs/](https://console.aws.amazon.com/ecs/)) を開きます。

1.  ナビゲーションペインで、**[タスク定義]** を選択します。

1.  Amazon ECS サービスで使用されるタスク定義のチェックボックスを選択します。

1.  [**Create new revision (新しいリビジョンを作成)**] を選択します。

1.  タグを追加して、タスク定義を少し更新します。ページの下部にある [**タグ**] で、新しいキーと値のペアを入力して新しいタグを作成します。

1.  **[作成]** を選択します。タスク定義のリビジョン番号が 1 増えたことがわかります。

1.  **JSON** タブを選択します。[`taskDefinitionArn`] の値を書き留めておきます。形式は `arn:aws:ecs:aws-region: account-id:task-definition/task-definition-family: task-definition-revision` です。これは、更新されたタスク定義の ARN です。

# ステップ 3: ライフサイクルフック Lambda 関数を作成する
<a name="tutorial-ecs-with-hooks-create-hooks"></a>

このセクションでは、Amazon ECS デプロイの `AfterAllowTestTraffic` のフック用に 1 つの Lambda 関数を実装します。Lambda 関数は、更新された Amazon ECS アプリケーションがインストールされる前に検証テストを実行します。このチュートリアルでは、Lambda 関数は `Succeeded` を返します。実際のデプロイ中、検証テストの結果に応じて、検証テストは `Succeeded` または `Failed` を返します。また、実際のデプロイ中に、他の Amazon ECS デプロイライフサイクルイベントフック (`BeforeInstall`、`AfterInstall`、`BeforeAllowTraffic`、および `AfterAllowTraffic`) に 1 つ以上の Lambda テスト関数を実装することもできます。詳細については、「[Amazon ECS のデプロイ向けのライフサイクルイベントフックのリスト](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-list-ecs)」を参照してください。

 Lambda 関数を作成するには、IAM ロールが必要です。ロールは、CloudWatch Logs に書き込む Lambda 関数を許可し、CodeDeploy ライフサイクルフックのステータスを設定します。

**IAM ロールを作成するには**

1. IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) を開きます。

1. ナビゲーションペインで **[ロール]** を選択し、**[ロールを作成]** を選択します。

1.  次のプロパティでロールを作成します。
   +  **信頼されたエンティティ**]: **AWS Lambda**。
   +  [**アクセス許可**]: [**AWSLambdaBasicExecutionRole**]。これにより、CloudWatch Logs に書き込むアクセス許可が Lambda 関数に付与されます。
   +  **ロール名**]: **`lambda-cli-hook-role`**。

   詳細については、[AWS Lambda 「実行ロールの作成](https://docs.aws.amazon.com/lambda/latest/dg/with-userapp.html#with-userapp-walkthrough-custom-events-create-iam-role)」を参照してください。

1.  作成したロールにアクセス許可 `codedeploy:PutLifecycleEventHookExecutionStatus` をアタッチします。これにより、デプロイ中に CodeDeploy ライフサイクルフックのステータスを設定する Lambda 関数の許可が付与されます。詳細については、*AWS Identity and Access Management ユーザーガイド* の [Adding IAM identity permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console)、および *CodeDeploy API Reference* の [PutLifecycleEventHookExecutionStatus](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_PutLifecycleEventHookExecutionStatus.html) を参照してください。

**`AfterAllowTestTraffic` のフック Lambda 関数を作成するには**

1.  次の内容で、`AfterAllowTestTraffic.js` という名前のファイルを作成します。

   ```
   'use strict';
    
    const AWS = require('aws-sdk');
    const codedeploy = new AWS.CodeDeploy({apiVersion: '2014-10-06'});
    
    exports.handler = (event, context, callback) => {
    
    	console.log("Entering AfterAllowTestTraffic hook.");
    	
    	// Read the DeploymentId and LifecycleEventHookExecutionId from the event payload
     var deploymentId = event.DeploymentId;
    	var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId;
    	var validationTestResult = "Failed";
    	
    	// Perform AfterAllowTestTraffic validation tests here. Set the test result 
    	// to "Succeeded" for this tutorial.
    	console.log("This is where AfterAllowTestTraffic validation tests happen.")
    	validationTestResult = "Succeeded";
    	
    	// Complete the AfterAllowTestTraffic hook by sending CodeDeploy the validation status
    	var params = {
    		deploymentId: deploymentId,
    		lifecycleEventHookExecutionId: lifecycleEventHookExecutionId,
    		status: validationTestResult // status can be 'Succeeded' or 'Failed'
    	};
    	
    	// Pass CodeDeploy the prepared validation test results.
    	codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) {
    		if (err) {
    			// Validation failed.
    			console.log('AfterAllowTestTraffic validation tests failed');
    			console.log(err, err.stack);
    			callback("CodeDeploy Status update failed");
    		} else {
    			// Validation succeeded.
    			console.log("AfterAllowTestTraffic validation tests succeeded");
    			callback(null, "AfterAllowTestTraffic validation tests succeeded");
    		}
    	});
    }
   ```

1.  Lambda デプロイパッケージを作成する 

   ```
   zip AfterAllowTestTraffic.zip AfterAllowTestTraffic.js 
   ```

1.  `create-function` のコマンドを使用して、`AfterAllowTestTraffic` のフックのために Lambda 関数を作成します。

   ```
   aws lambda create-function --function-name AfterAllowTestTraffic \
          --zip-file fileb://AfterAllowTestTraffic.zip \
          --handler AfterAllowTestTraffic.handler \
          --runtime nodejs10.x \
          --role arn:aws:iam::aws-account-id:role/lambda-cli-hook-role
   ```

1.  `create-function` のレスポンスにある Lambda 関数の ARN を書き留めます。この ARN は、次のステップで CodeDeploy デプロイの AppSpec ファイルを更新するときに使用します。

# ステップ 4: AppSpec ファイルを更新する
<a name="tutorial-ecs-with-hooks-create-appspec-file"></a>

 このセクションでは、`Hooks` のセクションを使用して AppSpec ファイルを更新します。`Hooks` のセクションで、`AfterAllowTestTraffic` のライフサイクルフックのための Lambda 関数を指定します。

**AppSpec ファイルを更新するには**

1.  [ステップ 2: AppSpec ファイルを作成します。](tutorial-ecs-create-appspec-file.md) の [チュートリアル: Amazon ECS へアプリケーションをデプロイする](tutorial-ecs-deployment.md) で作成した AppSpec ファイルファイルを開きます。

1.  `TaskDefinition` プロパティを、「[ステップ 2: Amazon ECS アプリケーションを更新する](tutorial-ecs-with-hooks-update-the-ecs-application.md)」でメモしたタスク定義 ARN で更新します。

1. コピーアンドペーストして、`Hooks` のセクションを AppSpec ファイルファイルに追加します。ARN を `AfterAllowTestTraffic` でメモした Lambda 関数の ARN を用いて [ステップ 3: ライフサイクルフック Lambda 関数を作成する](tutorial-ecs-with-hooks-create-hooks.md) の後の ARN を更新します。

------
#### [ JSON AppSpec ]

   ```
   {
     "version": 0.0,
     "Resources": [
       {
         "TargetService": {
           "Type": "AWS::ECS::Service",
           "Properties": {
             "TaskDefinition": "arn:aws:ecs:aws-region-id:aws-account-id::task-definition/ecs-demo-task-definition:revision-number",
             "LoadBalancerInfo": {
               "ContainerName": "sample-website",
               "ContainerPort": 80
             }
           }
         }
       }
     ],
     "Hooks": [
       {
         "AfterAllowTestTraffic": "arn:aws:lambda:aws-region-id:aws-account-id:function:AfterAllowTestTraffic"
       }
     ]
   }
   ```

------
#### [ YAML AppSpec ]

   ```
   version: 0.0
   Resources:
     - TargetService:
         Type: AWS::ECS::Service
         Properties:
           TaskDefinition: "arn:aws:ecs:aws-region-id:aws-account-id::task-definition/ecs-demo-task-definition:revision-number"
           LoadBalancerInfo:
             ContainerName: "sample-website"
             ContainerPort: 80
   Hooks:
     - AfterAllowTestTraffic: "arn:aws:lambda:aws-region-id:aws-account-id:function:AfterAllowTestTraffic"
   ```

------

1.  AppSpec ファイルを保存し、S3 バケットにアップロードします。

# ステップ 5: CodeDeploy コンソールを使用して Amazon ECS サービスをデプロイする
<a name="tutorial-ecs-with-hooks-deployment"></a>

 このセクションでは、テストリスナーのポートを指定して、デプロイグループを更新します。これは、「[ステップ 1: テストリスナーを作成する](tutorial-ecs-with-hooks-create-second-listener.md)」で作成したリスナーです。デプロイ中、CodeDeploy は、テストリスナーを使用して置き換えタスクセットに提供されるテストトラフィックを使用して、`AfterAllowTestTraffic` のデプロイライフサイクルフックの間に、検証テストを実行します。検証テストによって結果 `Succeeded` が返されるため、デプロイは次のデプロイライフサイクルイベントに進みます。実際のシナリオでは、テスト関数は `Succeeded` または `Failed` を返します。

**デプロイグループにテストリスナーを追加するには**

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/codedeploy/) で CodeDeploy コンソールを開きます。

1. ナビゲーションペインで、[**アプリケーション**] を選択します。

1. 「[チュートリアル: Amazon ECS へアプリケーションをデプロイする](tutorial-ecs-deployment.md)」で作成したアプリケーションを選択します。提案された名前を使用した場合は、[**ecs-demo-codedeploy-app**] です。

1. [**デプロイグループ**] で、先ほど [チュートリアル: Amazon ECS へアプリケーションをデプロイする](tutorial-ecs-deployment.md) で作成したデプロイグループを選択します。推奨された名前を使用した場合は [**ecs-demo-dg**] です。​

1.  **[編集]** を選択します。

1. [**Test listener port (テストリスナーポート)**] から、このチュートリアルで前に作成したテストリスナーのポートとプロトコルを選択します。これは [**HTTP:8080**] である必要があります。

1.  **[Save changes]** (変更の保存) をクリックします。

**Amazon ECS アプリケーションをデプロイするには**

1. デプロイグループのコンソールページで、[**デプロイの作成**] を選択します。

1.  [**デプロイグループ**] で、[**ecs-demo-dg**] を選択します。

1.  [**Revision type (リビジョンのタイプ)**] の場合は、[**My application is stored in Amazon S3 (Amazon S3 に保存されているアプリケーション)**] を選択します。**リビジョンの場所** に、S3 バケットの名前と AppSpec ファイル (例: **s3://my-s3-bucket/appspec.json**) を入力します。

1.  [**リビジョンファイルの種類**] で、必要に応じて [**.json**] または [**.yaml**] を選択します。

1.  (オプション)[**デプロイの説明**] に、デプロイの説明を入力します。

1. **[デプロイの作成]** を選択します。

 [**Deployment status　(デプロイのステータス)**] で、デプロイをモニタリングできます。本稼働トラフィックの 100% が置き換えタスクセットにルーティングされた後、[**Terminate original task set (元のタスクセットの終了)**] を選択して元のタスクセットをすぐに終了できます。[**Terminate original task set (元のタスクセットの終了)**] を選択しない場合、元のタスクセットはデプロイグループの作成時に指定した期間後に終了します。

![\[CodeDeploy コンソールのデプロイステータスセクション。\]](http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/images/ecs-tutorial-deployment-status-with-test-listener.png)


# ステップ 6: CloudWatch Logs で Lambda フック関数の出力を表示する
<a name="tutorial-ecs-with-hooks-view-cw-logs"></a>

 CodeDeploy デプロイが成功すると、Lambda フック関数での検証テストも成功します。これを確認するには、CloudWatch Logs にあるフック関数のログを確認します。

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1.  ナビゲーションペインで、[**Logs (ログ)**] を選択します。AppSpec ファイル で指定した Lambda フック関数の新しいロググループが 1 つ表示されます。  
![\[CloudWatch コンソールの新しいロググループ。\]](http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/images/ecs-demo-cw-logs.png)

1.  新しいロググループを選択します。これは **/aws/lambda/AfterAllowTestTrafficHook** である必要があります。

1.  ログストリームを選択します。複数のログストリームが表示された場合は、[**最後のイベント時間**] で最新の日付と時刻のログストリームを選択します。

1.  ログストリームイベントを展開し、Lambda フック関数がログに成功メッセージを書き込んだことを確認します。以下は、 `AfterAllowTraffic` の Lambda フック関数が成功したことを示します。  
![\[AfterAllowTraffic フックを示すログストリームイベント。\]](http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/images/ecs-demo-cw-log-events.png)

# ステップ 7: クリーンアップする
<a name="tutoria-ecs-with-hooks-clean-up"></a>

 このチュートリアルが終了したら、使用していないリソースに対する料金が発生しないように、チュートリアルに関連付けられたリソースをクリーンアップします。このステップのリソース名は、このチュートリアルで提案されている名前です (例えば、CodeDeploy アプリケーションの名前のための **ecs-demo-codedeploy-app** など)。別の名前を使用した場合は、クリーンアップでそれらを使用してください。

**チュートリアルリソースをクリーンアップするには**

1. [delete-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-deployment-group.html) コマンドを使用して、CodeDeploy デプロイグループを削除します。

   ```
   aws deploy delete-deployment-group --application-name ecs-demo-deployment-group --deployment-group-name ecs-demo-dg --region aws-region-id
   ```

1. [delete-application](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-application.html) コマンドを使用して、 CodeDeploy アプリケーションを削除します。

   ```
   aws deploy delete-application --application-name ecs-demo-deployment-group --region aws-region-id
   ```

1. [delete-function](https://docs.aws.amazon.com/cli/latest/reference/lambda/delete-function.html) コマンドを使用して、Lambda フック関数を削除します。

   ```
   aws lambda delete-function --function-name AfterAllowTestTraffic
   ```

1. [delete-log-group](https://docs.aws.amazon.com/cli/latest/reference/logs/delete-log-group.html) コマンドを使用して、CloudWatch log グループを削除します。

   ```
   aws logs delete-log-group --log-group-name /aws/lambda/AfterAllowTestTraffic
   ```