如何解决等待状态回调期间部署超时情况下在 AWS CodeDeploy 中收到的错误?

上次更新时间:2020 年 12 月 28 日

我想解决 AWS CodeDeploy 中的以下错误:“The deployment timed out while waiting for a status callbackCodeDeploy expects a status callback within one hour after a deployment hook is invoked.”(等待状态回调时部署超时。CodeDeploy 预计在调用部署挂钩后的一小时内进行状态回调。)

简短描述

通常,您可以在您的 Amazon Elastic Container Service (Amazon ECS) 部署中为多个生命周期事件挂钩(例如 BeforeInstallAfterInstallBeforeAllowTrafficAfterAllowTraffic)创建 AWS Lambda 验证测试函数。然后,通过验证测试,您预计会得到 Succeeded(成功)或 Failed(失败)响应。

但是,如果您的 AWS Lambda 函数在 60 分钟的默认时间限制内没有返回 CodeDeploy Succeeded(成功)或 Failed(失败)的执行状态,则会收到此错误。

解决方法

1.    检查 AWS CloudWatch Logs 中的日志数据,以验证 Lambda 函数的执行时间是否超过 60 分钟。

2.    将 PutLifecycleEventHookExecutionStatus 权限附加到您的 Lambda 执行角色。例如:

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

注意:PutLifecycleEventHookExecutionStatus 权限默认情况下不包含在 AWS 托管的 CodeDeployFullAcces AWS Identity and Access Management (IAM) 策略中。您必须手动附加策略。

3.    验证您的 Lambda 函数是否拥有 putLifecycleEventHookExecutionStatus 方法来返回对 CodeDeploy 的响应。例如:

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