解决 Amazon EC2 Auto Scaling 问题 - Amazon CodeDeploy
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

解决 Amazon EC2 Auto Scaling 问题

Amazon EC2 Auto Scaling 常规故障排除

到 Amazon EC2 Auto Scaling 组中的 EC2 实例的部署可能因以下原因而失败:

  • Amazon EC2 Auto Scaling 实例会持续启动和终止。如果 CodeDeploy 无法自动部署应用程序修订,Amazon EC2 Auto Scaling 将持续启动和终止 EC2 实例。

    解除 Amazon EC2 Auto Scaling 组与 CodeDeploy 部署组的关联或更改 Amazon EC2 Auto Scaling 组的配置,使所需的实例数量与当前实例数量匹配(从而防止 Amazon EC2 Auto Scaling 启动任何 EC2 实例)。有关更多信息,请参阅 。使用 CodeDeploy 更改部署组设置或者Amazon EC2 Auto Scaling 的手动扩展.

  • CodeDeploy 代理没有响应。如果 EC2 实例启动或启动后立即运行的初始化脚本(例如,cloud-init 脚本)需要 1 个小时以上的时间才能运行,则可能无 CodeDeploy 安装。CodeDeploy 代理有 1 小时的超时以便代理响应挂起的部署。要解决此问题,请将您的初始化脚本移至 CodeDeploy 应用程序修订中。

  • 在部署期间,Amazon EC2 Auto Scaling 组中的 EC2 实例会重启。如果 EC2 实例在部署期间重启或 CodeDeploy 代理在处理部署命令时关闭,则部署可能会失败。有关更多信息,请参阅终止或重启 Amazon EC2 Auto Scaling 实例可能会导致部署失败

  • 同时向 Amazon EC2 Auto Scaling 组中的相同 EC2 实例部署多个应用程序修订。同时将多个应用程序修订部署到 Amazon EC2 Auto Scaling 组中的同一个 EC2 实例,如果其中一个部署具有运行几分钟以上的脚本,则部署多个应用程序修订可能会失败。请勿将多个应用程序修订部署到 Amazon EC2 Auto Scaling 组中的相同 EC2 实例。

  • 对于作为 Amazon EC2 Auto Scaling 组的一部分启动的新 EC2 实例,部署将失败。这种情况下,在部署中运行脚本可能会阻止 Amazon EC2 Auto Scaling 组中启动 EC2 实例。(Amazon EC2 Auto Scaling 组中的其他 EC2 实例可能看起来运行正常。) 要解决此问题,请确保先完成所有其他脚本:

    • 您的 AMI 中不包含 CodeDeploy 代理:如果您将cfn-init请将代理安装脚本置于启动新实例时安装 CodeDeploy 代理,请将代理安装脚本置于cfn-init你的部分Amazon CloudFormation模板。

    • 您的 AMI 中包含 CodeDeploy 代理:配置 AMI 以便代理位于Stopped在创建实例时进行状态,然后在您的最后一步中包括一个将启动代理作为最后一步的脚本。cfn-init脚本库。

“CodeDeploRole 没有授予您执行以下操作的权限:Amazon服务:AmazonAutoScaling” 错误消息

使用启动模板创建的 Auto Scaling 组的部署需要以下权限。这些是除了 AWSCodeDeployRole Amazon 托管策略授予的权限之外的权限。

  • EC2:RunInstances

  • EC2:CreateTags

  • iam:PassRole

如果您缺少这些权限,则可能就会收到此错误。有关更多信息,请参阅 。教程:使用 CodeDeploy 将应用程序部署到 Amazon EC2 Auto Scaling 组为 Auto Scaling 组创建启动模板, 和启动模板支持中的Amazon EC2 Auto Scaling 用户指南.

在部署修订之前,Amazon EC2 Auto Scaling 组中的实例不断被预置和终止

有时,一个错误可能导致无法在 Amazon EC2 Auto Scaling 组中成功部署新预置的实例。结果是没有运行正常的实例,部署失败。由于无法运行部署或无法成功完成部署,实例在创建之后很快即被终止。Amazon EC2 Auto Scaling 组配置将预置另一组实例,试图达到正常运行的主机数的最低要求。这批实例也会被终止,并不断进行这一循环。

可能的原因包括:

  • Amazon EC2 Auto Scaling 组运行状况检查失败。

  • 应用程序修订中有错误

要解决这一问题,请遵循以下步骤:

  1. 手动创建不属于 Amazon EC2 Auto Scaling 组的 EC2 实例。用唯一的 EC2 实例标签标记该实例。

  2. 将这个新实例添加到受影响的部署组。

  3. 将没有错误的新应用程序修订部署到部署组。

这会提示 Amazon EC2 Auto Scaling 组将此应用程序修订部署到 Amazon EC2 Auto Scaling 组中将来的实例。

注意

确认部署成功后,请删除所创建的实例,避免继续向您收取相应费用。Amazonaccount.

终止或重启 Amazon EC2 Auto Scaling 实例可能会导致部署失败

如果通过 Amazon EC2 Auto Scaling 启动了 EC2 实例,然后终止或重启该实例,则至该实例的部署可能会因以下原因而失败:

  • 在部署正在进行时,缩小事件或任何其他终止事件将导致实例与 Amazon EC2 Auto Scaling 组分离并终止。由于无法完成部署,因此它将失败。

  • 实例已重启,但需要 5 分钟以上的时间才能启动。CodeDeploy 将此视为超时。该服务将针对该实例的所有当前和将来部署失败。

解决此问题:

  • 一般来说,请确保实例终止或重启之前完成所有部署。确保所有部署在实例启动或重启后开始。

  • 如果您为 Amazon EC2 Auto Scaling 配置指定基于 Windows 服务器的亚马逊系统映像 (AMI),并使用 EC2Config 服务设置实例的计算机名称,则部署可能会失败。要修复此问题,请在 Windows 服务器基础 AMI 中的常规的选项卡EC2 服务属性,清除Set Computer Name. 清除此复选框后,将对使用该 Windows 服务器基础 AMI 启动的所有新的 Windows Server Amazon EC2 Auto Scaling 实例禁用此行为。对于已启用此行为的 Windows Server Amazon EC2 Auto Scaling 实例,无需清除此复选框。仅在重启实例后对其重新部署失败的部署。

避免将多个部署组与一个 Amazon EC2 Auto Scaling 组关联

作为最佳实践,应仅为每个 Amazon EC2 Auto Scaling 组关联每个 Amazon EC2 Auto Scaling 组。

这是因为,如果 Amazon EC2 Auto Scaling 向上扩展一个具有与多个部署组关联的钩子的实例,它将一次性为所有钩子发送通知。这会导致针对每个实例的多个部署同时开始。当多个部署同时向 CodeDeploy 代理发送命令时,可能会达到生命周期事件与部署开始或前一个生命周期事件结束之间的五分钟超时值。如果发生这种情况,即使部署过程按预期运行,部署也会失败。

注意

在生命周期事件中,脚本的默认超时时间为 30 分钟。您可以在 AppSpec 文件中将超时更改为其他值。有关更多信息,请参阅为 EC2/本地部署部署添加AppSpec 文件

如果尝试同时运行多个部署,则无法控制部署发生的顺序。

最后,如果至任一实例的部署失败,Amazon EC2 Auto Scaling 将立即终止该实例。当第一个实例关闭时,正在运行的其他部署将开始失败。由于 CodeDeploy 具有 1 个小时的超时时间,以便 CodeDeploy 代理响应挂起的部署,因此每个实例的最长超时时间为 60 分钟。

有关 Amazon EC2 Auto Scaling 的更多信息,请参阅在引擎盖下:CodeDeploy 和 Auto Scaling 集成.

Amazon EC2 Auto Scaling 组中的 EC2 实例无法启动,收到错误 “心跳超时”

Amazon EC2 Auto Scaling 组可能无法启动新的 EC2 实例,并生成类似于以下内容的消息:

Launching a new EC2 instance <instance-Id>. Status Reason: Instance failed to complete user's Lifecycle Action: Lifecycle Action with token<token-Id> was abandoned: Heartbeat Timeout.

此消息通常提示出现以下问题:

  • 与一个关联的最大并发部署数量Amazon已到达账户。有关部署限制的更多信息,请参阅CodeDeploy 限制

  • Auto Scaling 组试图太快启动太多 EC2 实例。将 API 调用到RecordLifecycleActionHeartbeat或者CompleteLifecycleAction对于每个新实例都受到限制。

  • CodeDeploy 中的一个应用程序已在其关联的部署组更新或删除之前被删除。

    当您删除某个应用程序或部署组时,CodeDeploy 将尝试清除与其关联的任何 Amazon EC2 Auto Scaling 挂钩,但某些挂钩可能会保留。如果您运行命令来删除部署组,则剩余的挂钩将在输出中返回。但是,如果您运行命令来删除应用程序,则剩余的挂钩将不会出现在输出中。

    因此,作为最佳实践,在删除某个应用程序之前,您应删除与该应用程序关联的所有部署组。您可以使用命令输出来标识必须手动删除的生命周期挂钩。

如果您收到了“Heartbeat Timeout (检测信号超时)”错误消息,则可通过执行以下操作来确定剩余的生命周期挂钩是否为导致出现错误的原因并解决问题:

  1. 请执行下列操作之一:

    • 调用删除部署组命令可删除与 Auto Scaling 组关联的部署部署,导致检测信号超时。

    • 调用更新部署组命令带有 Auto Scaling 组名称的非空列表,以分离所有 CodeDeploy 管理的 Auto Scaling 生命周期挂钩。

      例如,输入以下命令Amazon CLI命令:

      aws deploy update-deployment-group --application-name my-example-app --current-deployment-group-name my-deployment-group --auto-scaling-groups

      作为另一个例子,如果你将 CodeDeploy API 与 Java 结合使用,请调用UpdateDeploymentGroup并设置autoScalingGroupsnew ArrayList<String>(). 这套autoScalingGroups转换为空列表,然后删除现有列表。请勿使用null,这是默认设置,因为这会离开autoScalingGroups原样,这不是你想要的。

    检查调用的输出。如果输出包含hooksNotCleanedUp结构包含 Amazon EC2 Auto Scaling 生命周期钩子列表,有剩余的生命周期钩子。

  2. 调用描述生命周期挂钩命令,指定与启动失败的 EC2 实例关联的 Amazon EC2 Auto Scaling 组的名称。在输出中,查找以下内容之一:

    • 对应的 Amazon EC2 Auto Scaling 生命周期挂钩名称。hooksNotCleanedUp您在步骤 1 中确定的结构。

    • Amazon EC2 Auto Scaling 生命周期挂钩名称,其中包含与失败的 Auto Scaling 组关联的部署组的名称。

    • Amazon EC2 Auto Scaling 生命周期挂钩名称可能导致 CodeDeploy 部署的心跳超时。

  3. 如果挂钩属于步骤 2 中列出的其中一个类别,请调用删除生命周期挂钩命令删除它。在调用中指定 Amazon EC2 Auto Scaling 组和生命周期挂钩。

    重要

    如步骤 2 所述,只删除导致问题的钩子。如果删除可行的挂钩,部署可能会失败,或者 CodeDeploy 可能无法部署应用程序修订以扩展 EC2 实例。

  4. 打电话给更新部署组或者创建部署组带有所需的 Auto Scaling 组名称的命令。CodeDeploy 使用新的 UUID 重新安装 Auto Scaling 挂钩。

注意

如果您将 Auto Scaling 组与 CodeDeploy 部署组分离,则对 Auto Scaling 组的任何正在进行的部署都可能会失败,并且 Auto Scaling 组扩展的新 EC2 实例将不会从 CodeDeploy 收到您的应用程序修订版本。要使 Auto Scaling 再次与 CodeDeploy 一起工作,您需要将 Auto Scaling 组重新附加到部署组并调用一个新的CreateDeployment开始整个车队的部署。

不匹配的 Amazon EC2 Auto Scaling 生命周期挂钩可能导致至 Amazon EC2 Auto Scaling 组的自动部署停止或失败。

Amazon EC2 Auto Scaling 和 CodeDeploy 使用生命周期挂钩确定应将哪些应用程序修订部署到哪些已在 Amazon EC2 Auto Scaling 组中启动的 EC2 实例。如果 Amazon EC2 Auto Scaling 和 CodeDeploy 中的生命周期挂钩及其相关信息未准确匹配,则自动部署可能会停止或失败。

如果至 Amazon EC2 Auto Scaling 组的部署失败,请检查 Amazon EC2 Auto Scaling 和 CodeDeploy 中的生命周期挂钩名称是否匹配。如果不匹配,请使用这些 Amazon CLI 命令调用。

首先,获取 Amazon EC2 Auto Scaling 组和部署组的生命周期挂钩名称的列表:

  1. 调用描述生命周期挂钩命令中指定与 CodeDeploy 中的部署组关联的部署 Amazon EC2 Auto Scaling 组的名称。在输出中,在 LifecycleHooks 列表中,记下每个 LifecycleHookName 值。

  2. 调用获取部署组命令中指定与 Amazon EC2 Auto Scaling 组关联的部署部署部署部署部署部署组的名称。在输出中,在autoScalingGroups列表中,查找名称值与 Amazon EC2 Auto Scaling 组名称匹配的每个项目,然后记下相应的hook值。

现在比较两组生命周期挂钩的名称。如果它们完全匹配(字符对字符),则它不是问题。您可能需要尝试本部分中的其他位置描述的其他 Amazon EC2 Auto Scaling 排查步骤。

但是,如果两组生命周期挂钩的名称未完全匹配(字符对字符),请执行以下操作:

  1. 如果 describe-lifecycle-hooks 命令输出中包含 get-deployment-group 命令输出中未包含的生命周期挂钩名称,则执行以下操作:

    1. 对于 describe-lifecycle-hooks 命令输出中的每个生命周期挂钩名称,请调用 delete-lifecycle-hook 命令。

    2. 调用更新部署组命令,指定原始 Amazon EC2 Auto Scaling 组的名称。CodeDeploy 在 Amazon EC2 Auto Scaling 组中创建新的替代生命周期挂钩,并将这些生命周期挂钩与部署组关联。现在,自动部署应恢复,因为新的实例已添加到 Amazon EC2 Auto Scaling 组。

  2. 如果 get-deployment-group 命令输出中包含 describe-lifecycle-hooks 命令输出中未包含的生命周期挂钩名称,则执行以下操作:

    1. 调用更新部署组命令,但不指定原始 Amazon EC2 Auto Scaling 组的名称。

    2. 调用update-deployment-group再次指定原始 Amazon EC2 Auto Scaling 组的名称。CodeDeploy 在 Amazon EC2 Auto Scaling 组中重新创建缺失的生命周期挂钩。现在,自动部署应恢复,因为新的实例已添加到 Amazon EC2 Auto Scaling 组。

在您将两组生命周期挂钩名称完全匹配后(字符对字符)后,应用程序修订应重新部署,但仅重新部署到新的实例,因为它们已添加到 Amazon EC2 Auto Scaling 组。部署不会在 Amazon EC2 Auto Scaling 组中已存在的实例上自动进行。

“部署失败是因为没有为您的部署组找到实例” 错误

如果你看到以下 CodeDeploy 错误,请阅读本节:

The deployment failed because no instances were found for your deployment group. Check your deployment group settings to make sure the tags for your EC2 instances or Auto Scaling groups correctly identify the instances you want to deploy to, and then try again.

导致此错误的可能原因是:

  1. 您的部署组设置包括不正确的 EC2 实例、本地实例或 Auto Scaling 组的标签。要修复此问题,请检查标签是否正确,然后重新部署应用程序。

  2. 部署开始后,您的车队已扩展。在这种情况下,您将在InService你的车队中的状态,但你也会看到上面的错误。要解决此问题,请重新部署您的应用程序。

  3. 您的 Auto Scaling 组不包括InService状态。在这种情况下,当您尝试在队列范围内进行部署时,部署将失败并显示上面的错误消息,因为 CodeDeploy 至少需要一个实例才能在InService状态。你可能没有实例的原因有很多InService状态。其中一些包括:

    • 您已计划(或手动配置)Auto Scaling 组大小为0.

    • Auto Scaling 检测到坏的 EC2 实例(例如,EC2 实例出现硬件故障),因此全部取消了它们,在InService状态。

    • 在扩展活动期间01,CodeDeploy 部署了之前成功的修订版(称为上次成功修订)自上次部署以来,这已经变得不健康。这导致扩展实例上的部署失败,这反过来又导致 Auto Scaling 取消该实例,在InService状态。

      如果你发现自己在InService状态,请按照以下过程中的描述对问题进行故障排除,To troubleshoot the error if there are no instances in the InService state.

如果没有实例处于 inService 状态,请对错误进行故障排除

  1. 在 Amazon EC2 控制台中,验证所需容量设置设置。如果为零,请将其设置为正数。等待实例InService,这意味着部署成功。您已修复了此问题,可以跳过此故障排除过程的剩余步骤。有关设置所需容量设置,请参阅为 Auto Scaling 组设置容量限制中的Amazon EC2 Auto Scaling 用户指南.

  2. 如果 Auto Scaling 继续尝试启动新的 EC2 实例以满足所需容量,但无法实现扩展,则通常是由于 Auto Scaling 生命周期挂钩失败造成的。如下所示解决此问题:

    1. 要检查哪个 Auto Scaling 生命周期挂钩事件失败,请参阅验证 Auto Scaling 组的扩展活动在 Amazon EC2 Auto Scaling 用户指南中。

    2. 如果失败的挂钩的名字是CodeDeploy-managed-automatic-launch-deployment-hook-DEPLOYMENT_GROUP_NAME,转到 CodeDeploy,找到部署组,然后找到由 Auto Scaling 启动的失败部署。然后,调查部署失败的原因。

    3. 如果您了解部署失败的原因(例如,发生了 CloudWatch 警报),并且可以在不更改修订版的情况下修复问题,那么现在就这样做。

    4. 如果经过调查,你可以确定 CodeDeploy上次成功修订不再运行正常,您的 Auto Scaling 组中没有运行状况良好的实例,因此您处于部署死锁状态。要解决此问题,必须通过从 Auto Scaling 组中临时删除 CodeDeploy 的生命周期钩子,然后重新安装挂接并重新部署新的(好)修订版来修复(坏)CodeDeploy 修订版本。有关说明,请参阅:

修复部署死锁问题 (CLI)

  1. (可选)阻止导致 CodeDeploy 错误的 CI/CD 管道,以便在修复此问题时不会发生意外部署。

  2. 记下您当前的 Auto ScalingDesiredCapacity设置设置:

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name ASG_NAME

    在此过程结束时,您可能需要缩减为此数字。

  3. 设置 Auto ScalingDesiredCapacity将设置为1. 如果您想要的容量大于,则这是可选的1以开头。通过将其减少到1,稍后预配和部署实例所需的时间减少,从而加快了故障排除速度。如果您的 Auto Scaling 所需容量最初设置为0,你必须将其增加到1. 这是强制要求的。

    aws 自动扩展集所需容量 — 自动扩展组名称ASG_NAME— 所需容量 1

    注意

    此过程的剩余步骤假设你已经设置了DesiredCapacity1.

    此时,Auto Scaling 尝试扩展到一个实例。然后,由于 CodeDeploy 添加的钩子仍然存在,因此 CodeDeploy 会尝试部署,部署失败,Auto Scaling 会取消实例,Auto Scaling 尝试重新启动实例以达到所需容量的实例,这再次失败。你正处于取消重新启动循环中。

  4. 从部署组中取消注册 Auto Scaling 组:

    警告

    以下命令将启动一个没有软件的新 EC2 实例。在运行命令之前,请确保 Auto ScalingInService可以接受运行任何软件的实例。例如,确保负载均衡器没有软件不会向此主机发送流量。

    重要

    使用下面显示的 CodeDeploy 命令删除挂接。不要通过 Auto Scaling 服务删除挂钩,因为 CodeDeploy 无法识别删除操作。

    aws deploy update-deployment-group --application-name APPLICATION_NAME --current-deployment-group-name DEPLOYMENT_GROUP_NAME --auto-scaling-groups

    运行此命令后,会出现以下情况:

    1. CodeDeploy 从部署组中注销 Auto Scaling 组的注册。

    2. CodeDeploy 将 Auto Scaling 组中删除 Auto Scaling 生命周期挂钩。

    3. 由于导致部署失败的挂钩不再存在,因此 Auto Scaling 将取消现有的 EC2 实例,并立即启动一个新实例以扩展到所需容量。新的实例应该很快移动到InService状态。新实例不包括软件。

  5. 等待 EC2 实例进入InService状态。要验证其状态,请使用以下命令:

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names ASG_NAME --query AutoScalingGroups[0].Instances[*].LifecycleState

  6. 将挂钩添加回 EC2 实例:

    重要

    使用下面显示的 CodeDeploy 命令添加挂接。不要使用 Auto Scaling 服务添加挂接,因为 CodeDeploy 无法识别添加该挂钩。

    aws deploy update-deployment-group --application-name APPLICATION_NAME --current-deployment-group-name DEPLOYMENT_GROUP_NAME --auto-scaling-groups ASG_NAME

    运行此命令后,会出现以下情况:

    1. CodeDeploy 将 Auto Scaling 生命周期钩子重新安装到 EC2 实例

    2. CodeDeploy 将 Auto Scaling 组重新注册到部署组。

  7. 使用您知道健康且想要使用的 Amazon S3 或 GitHub 修订版创建队列范围内的部署。

    例如,如果修订是 Amazon S3 存储桶中的 .zip 文件,名为my-revision-bucket使用对象密钥httpd_app.zip中,输入以下命令:

    aws deploy create-deployment --application-name APPLICATION_NAME --deployment-group-name DEPLOYMENT_GROUP_NAME --revision "revisionType=S3,s3Location={bucket=my-revision-bucket,bundleType=zip,key=httpd_app.zip}"

    因为现在有一个InService实例在 Auto Scaling 组中,此部署应该起作用,您应该不再看到错误部署失败,原因是没有为您的部署组找到实例.

  8. 部署成功后,如果您之前将 Auto Scaling 组扩展到原始容量,如果您之前将其扩展到原始容量:

    aws autoscaling set-desired-capacity --auto-scaling-group-name ASG_NAME --desired-capacity ORIGINAL_CAPACITY

修复部署死锁问题(控制台)

  1. (可选)阻止导致 CodeDeploy 错误的 CI/CD 管道,以便在修复此问题时不会发生意外部署。

  2. 转到 Amazon EC2 控制台,然后记下您的 Auto Scaling所需容量设置设置。在此过程结束时,您可能需要缩减为此数字。有关查找此设置的信息,请参阅为 Auto Scaling 组设置容量限制.

  3. 将所需的 EC2 实例数设置为1

    如果您想要的容量大于,则这是可选的1以开头。通过将其减少到1,稍后预配和部署实例所需的时间减少,从而加快了故障排除速度。如果您的 Auto Scaling所需容量最初设定为0,你必须将其增加到1. 这是强制要求的。

    注意

    此过程的剩余步骤假设你已经设置了所需容量1.

    1. 在以下网址打开 Amazon EC2 Auto Scaling 控制https://console.aws.amazon.com/ec2autoscaling/.

    2. 选择适当的区域。

    3. 转到有问题的 Auto Scaling 组。

    4. In组详细信息,选择编辑.

    5. Set所需容量1.

    6. 选择 Update

  4. 从部署组中取消注册 Auto Scaling 组:

    警告

    以下子步骤将启动一个没有软件的新 EC2 实例。在运行命令之前,请确保 Auto ScalingInService可以接受运行任何软件的实例。例如,确保负载均衡器没有软件不会向此主机发送流量。

    1. https://console.aws.amazon.com/codedeploy/ 打开 CodeDeploy 控制台。

    2. 选择适当的区域。

    3. 在导航窗格中,选择 Applications (应用程序)

    4. 选择 CodeDeploy 应用程序的名称。

    5. 选择 CodeDeploy 部署组的名称。

    6. 选择 Edit

    7. In环境配置,取消选择Amazon EC2 Auto Scaling 组.

      注意

      如果没有定义环境配置,控制台不允许您保存配置。要绕过支票,请临时添加EC2或者On-premises你知道不会解决任何房东。要添加标签,请选择Amazon EC2 实例或者本地实例,然后添加标签密钥EC2或者On-premises. 你可以留下标签空。

    8. 选择保存更改

      完成这些子步骤后,将出现以下情况:

      1. CodeDeploy 从部署组中注销 Auto Scaling 组的注册。

      2. CodeDeploy 将 Auto Scaling 组中删除 Auto Scaling 生命周期挂钩。

      3. 由于导致部署失败的挂钩不再存在,因此 Auto Scaling 将取消现有的 EC2 实例,并立即启动一个新实例以扩展到所需容量。新的实例应该很快移动到InService状态。新实例不包括软件。

  5. 等待 EC2 实例进入InService状态。要验证其状态:

    1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

    2. 在导航窗格中,选择 Auto Scaling Groups

    3. 选择 Auto Scaling 组。

    4. 在内容窗格中,选择实例管理选项卡。

    5. 实例,请确保生命周期列表示InService在实例旁边。

  6. 使用与删除 Auto Scaling 组相同的方法将 Auto Scaling 组重新注册到 CodeDeploy 部署组:

    1. https://console.aws.amazon.com/codedeploy/ 打开 CodeDeploy 控制台。

    2. 选择适当的区域。

    3. 在导航窗格中,选择 Applications (应用程序)

    4. 选择 CodeDeploy 应用程序的名称。

    5. 选择 CodeDeploy 部署组的名称。

    6. 选择 Edit

    7. In环境配置,选择Amazon EC2 Auto Scaling 组然后从列表中选择您的 Auto Scaling 组。

    8. Amazon EC2 实例或者本地实例,找到你添加的标签并将其删除。

    9. 取消选中旁边的复选框Amazon EC2 实例或者本地实例.

    10. 选择保存更改

    此配置将生命周期挂钩重新安装到 Auto Scaling 组中。

  7. 使用您知道健康且想要使用的 Amazon s3or GitHub 修订版创建队列范围内的部署。

    例如,如果修订是 Amazon S3 存储桶中的 .zip 文件,名为my-revision-bucket使用对象密钥httpd_app.zip中,执行以下操作:

    1. 在 CodeDeploy 控制台中,在部署组页面上,选择创建部署.

    2. 对于 Revision type (修订类型),选择 My application is stored in Amazon S3 (我的应用程序存储在 Amazon S3 中)

    3. 适用于修订位置,选择s3://my-revision-bucket/httpd_app.zip.

    4. 适用于修订文件类型,选择.zip.

    5. 选择 Create deployment (创建部署)

    因为现在有一个InService实例在 Auto Scaling 组中,此部署应该起作用,您应该不再看到错误部署失败,原因是没有为您的部署组找到实例.

  8. 部署成功后,如果您之前将 Auto Scaling 组扩展到原始容量,如果您之前将其扩展到原始容量:

    1. 在以下网址打开 Amazon EC2 Auto Scaling 控制https://console.aws.amazon.com/ec2autoscaling/.

    2. 选择适当的区域。

    3. 转到 Auto Scaling 组。

    4. In组详细信息,选择编辑.

    5. Set所需容量回到其原始值。

    6. 选择 Update