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

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

Amazon EC2 Auto Scaling 问题排查

常规 Amazon EC2 Auto Scaling 故障排查

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

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

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

  • CodeDeploy 代理没有响应。如果 EC2 实例启动或开始后立即运行的初始化脚本(例如,cloud-init 脚本)需要 1 个小时以上的时间才能运行,则 CodeDeploy 代理可能无法安装。CodeDeploy 具有 1 个小时的超时时间,以便 CodeDeploy 代理响应挂起的部署。要解决此问题,请将您的初始化脚本移至 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 代理,请将代理安装脚本置于 Amazon CloudFormation 模板的 cfn-init 部分的末尾。

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

“CodeDeployRole 未授予您在以下 Amazon 服务中执行操作的权限:AmazonAutoScaling”错误

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

  • EC2:RunInstances

  • EC2:CreateTags

  • iam:PassRole

如果您缺少这些权限,则可能就会收到此错误。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的教程:使用CodeDeploy将应用程序部署到 Auto Scaling 组为 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 组中未来的实例。

注意

确认部署成功后,您可以删除所创建的实例,避免 Amazon 账户中继续产生相应费用。

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

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

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

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

解决此问题:

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

  • 如果您为 Amazon EC2 Auto Scaling 配置指定 Windows Server 基础亚马逊机器映像 (AMI),并使用 EC2Config 服务设置实例的计算机名称,则部署会失败。要修复此问题,请在 Windows Server 基础 AMI 中,在 EC2 服务属性常规选项卡上,清除设置计算机名称。清除此复选框后,将对使用该 Windows Server 基础 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 向上扩展一个具有与多个部署组关联的钩子的实例,它将一次性为所有挂钩发送通知。这会导致针对每个实例的多个部署同时开始。当多个部署同时向 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 实例。对每个新实例的 RecordLifecycleActionHeartbeatCompleteLifecycleAction 的 API 调用进行了节流。

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

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

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

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

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

    • 调用 delete-deployment-group 命令以删除与导致心跳超时的 Auto Scaling 组关联的部署组。

    • 使用非 null 的空 Auto Scaling 组名称列表调用 update-deployment-group 命令,以分离 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

      再举一个例子,如果您通过 Java 使用 CodeDeploy API,请调用 UpdateDeploymentGroup 并将 autoScalingGroups 设置为 new ArrayList<String>()。这会将 autoScalingGroups 设置为空列表并删除现有列表。不要使用 null,这是默认设置,因为这会将 autoScalingGroups 保持原样,这不是您想要的。

    检查调用的输出。如果输出包含一个 hooksNotCleanedUp 结构和一个 Amazon EC2 Auto Scaling 生命周期挂钩列表,则存在剩余的生命周期挂钩。

  2. 调用 describe-lifecycle-hooks 命令,并指定与无法启动的 EC2 实例关联的 Amazon EC2 Auto Scaling 组的名称。在输出中,查找以下任何内容:

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

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

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

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

    重要

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

  4. 使用所需的 Auto Scaling 组名调用 update-deployment-groupcreate-deployment-group 命令。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. 调用 describe-lifecycle-hooks 命令(在 CodeDeploy 中指定与部署组关联的 Amazon EC2 Auto Scaling 组的名称)。在输出中,在 LifecycleHooks 列表中,记下每个 LifecycleHookName 值。

  2. 调用 get-deployment-group 命令,并指定与 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. 调用 update-deployment-group 命令,但不指定原始 Amazon EC2 Auto Scaling 组的名称。CodeDeploy 会在 Amazon EC2 Auto Scaling 组中创建新的替代生命周期挂钩,并将生命周期挂钩与部署组关联。现在,自动部署应恢复,因为新的实例已添加到 Amazon EC2 Auto Scaling 组。

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

    1. 调用 update-deployment-group 命令,但不指定原始 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,这意味着部署成功。您已解决此问题,可以跳过此故障排除过程的其余步骤。有关设置所需容量设置的信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的为 Auto Scaling 组设置容量限制

  2. 如果 Auto Scaling 一直尝试启动新的 EC2 实例以满足所需容量,但永远无法实现横向扩展,则通常是由于 Auto Scaling 生命周期挂钩失败所致。按如下方式排查此问题:

    1. 要检查哪个 Auto Scaling 生命周期挂钩事件失败,请参阅《Amazon EC2 Auto Scaling 用户指南》中的验证 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 Scaling DesiredCapacity 设置:

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

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

  3. 将 Auto Scaling DesiredCapacity 设置为 1。如果您的所需容量大于起始容量 1,则这是可选的。通过将其降至 1,可以缩短实例的配置和部署时间,从而加快故障排除速度。如果您的 Auto Scaling 的所需容量最初设置为 0,则必须将其增加到 1。这是强制性的。

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

    注意

    此过程的其余步骤假设您已将 DesiredCapacity 设置为 1

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

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

    警告

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

    重要

    使用下面显示的 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 修订创建实例集范围的部署。

    例如,如果修订是名为 my-revision-bucket 的 Amazon S3 存储桶中的 .zip 文件,对象键为 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}"

    由于 Auto Scaling 组中现在有一个 InService 实例,因此此部署应该可以正常工作,而且您不应再看到错误:由于未找到您的部署组的实例,部署失败

  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. 访问 https://console.aws.amazon.com/ec2/,打开 Amazon EC2 控制台,然后从导航窗格中选择 Auto Scaling Groups(Auto Scaling 组)。

    2. 选择适当的区域。

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

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

    5. 所需容量设置为 1

    6. 选择更新

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

    警告

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

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

    2. 选择适当的区域。

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

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

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

    6. 选择编辑

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

      注意

      如果未定义环境配置,则控制台不允许您保存配置。要绕过检查,请临时添加一个您知道不会解析为任何主机的标签 EC2On-premises。要添加标签,请选择 Amazon EC2 实例本地实例,然后添加标签 EC2On-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. 实例下,确保生命周期列在实例旁边显示正在使用

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

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

    2. 选择适当的区域。

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

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

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

    6. 选择编辑

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

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

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

    10. 选择保存更改

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

  7. 使用您知道运行状况良好且想要使用的 Amazon S3 或 GitHub 修订创建实例集范围的部署。

    例如,如果修订是名为 my-revision-bucket 的 Amazon S3 存储桶中的 .zip 文件,对象键为 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 (创建部署)

    由于 Auto Scaling 组中现在有一个 InService 实例,因此此部署应该可以正常工作,而且您不应再看到错误:由于未找到您的部署组的实例,部署失败

  8. 如果您之前缩减了 Auto Scaling 组的容量,则在部署成功后,将其扩展回原始容量:

    1. 访问 https://console.aws.amazon.com/ec2/,打开 Amazon EC2 控制台,然后从导航窗格中选择 Auto Scaling Groups(Auto Scaling 组)。

    2. 选择适当的区域。

    3. 转到您的 Auto Scaling 组。

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

    5. 所需容量设置回其原始值。

    6. 选择更新