ステータスコールバックを待っている間にデプロイがタイムアウトしたときに AWS CodeDeploy で表示されるエラーを解決するにはどうすればよいですか?

最終更新日: 2020 年 12 月 28 日

AWS CodeDeploy で「ステータスコールバックを待っている間にデプロイがタイムアウトしました。CodeDeploy は、デプロイフックが呼び出されてから 1 時間以内にステータスコールバックがあることを想定しています」というエラーを解決したいと考えています。

簡単な説明

通常、Amazon Elastic Container Service (Amazon ECS) デプロイで、複数のライフサイクルイベントフック (BeforeInstallAfterInstallBeforeAllowTrafficAfterAllowTraffic など) に対して AWS Lambda 検証テスト関数を作成します。その後に、検証テストから成功または失敗の応答があります。

しかし、AWS Lambda 関数が、デフォルトの制限時間である 60 分以内に CodeDeploy に成功または失敗の実行ステータスを返さない場合、このエラーが表示されます。

解決方法

1.    AWS CloudWatch Logs のログデータを確認し、Lambda 関数の実行時間が 60 分を超えていることを確認します。

2.    Lambda 実行ロールPutLifecycleEventHookExecutionStatus アクセス許可をアタッチします。例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "codedeploy:PutLifecycleEventHookExecutionStatus",
            "Resource": "*"
        }
    ]
}

注: PutLifecycleEventHookExecutionStatus アクセス許可は、AWS によって管理される CodeDeployFullAccess AWS Identity and Access Management (IAM) ポリシーにデフォルトで含まれません。ポリシーは手動でアタッチする必要があります。

3.    CodeDeploy に応答するための putLifecycleEventHookExecutionStatus メソッドが Lambda 関数にあることを確認します。例:

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");
 		}