

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

# 自动扩缩组
<a name="auto-scaling-groups"></a>

**注意**  
如果您不熟悉自动扩缩组，则请完成[创建您的第一个自动扩缩组](create-your-first-auto-scaling-group.md)教程中的步骤以开始使用，并了解当组中的实例终止时自动扩缩组如何响应。

*自动扩缩组*由一组 Amazon EC2 实例组成，这是实例视为一个逻辑组以实现自动扩缩和管理。另外，自动扩缩组让您能够使用 Amazon EC2 Auto Scaling 功能，如运行状况检查替换和扩展策略。保持 Auto Scaling 组中的实例数量和自动扩展都是 Amazon EC2 Auto Scaling 服务的核心功能。

Auto Scaling 组的大小取决于您设置为所需容量的实例数量。您可以通过手动方式或使用自动扩展调整其大小以满足需求。

Auto Scaling 组会首先启动足够实例以达到需要的容量。它通过对组中实例定期执行运行状况检查来保持实例数量。即使某个实例运行状况不佳，Auto Scaling 组也会继续保持固定数量的实例。如果某个实例运行状况不佳，则该组终止运行状况不佳的实例，并启动其他实例来替换它。有关更多信息，请参阅 [自动扩缩组中实例的运行状况检查](ec2-auto-scaling-health-checks.md)。

您可以使用扩展策略动态增加或减少组中的实例数量，以符合不断变化的条件。扩展策略生效时，Auto Scaling 组会在您指定的最小和最大容量值之间调整组的所需容量，并根据需要启动或终止实例。您还可以按计划进行扩展。有关更多信息，请参阅 [选择您的扩缩方法](scaling-overview.md)。

自动扩缩组可以启动按需型实例和/或竞价型实例。仅当使用launch template时，才能为自动扩缩组指定多个购买选项。有关更多信息，请参阅 [Auto Scaling 组具有多个实例类型和购买选项](ec2-auto-scaling-mixed-instances-groups.md)。

竞价型实例让您能够以相对于按需价格而言极低的折扣，获取未使用的 EC2 容量。有关更多信息，请参阅 [Amazon EC2 竞价型实例](https://aws.amazon.com/ec2/spot/pricing/)。竞价型实例和按需型实例之间存在着关键区别：
+ 竞价型实例的价格因需求而异
+ Amazon EC2 可以随着竞价型实例的可用性或价格发生变化而终止单个竞价型实例

竞价型实例终止后，Auto Scaling 组会尝试启动替代实例来保持该组的所需容量。

实例启动时，如果您指定多个可用区，会为这些可用区分配所需容量。如果执行扩展操作，Amazon EC2 Auto Scaling 会自动保持您指定的所有可用区的平衡。

**Topics**
+ [使用启动模板创建自动扩缩组](create-auto-scaling-groups-launch-template.md)
+ [使用启动配置创建自动扩缩组](create-auto-scaling-groups-launch-configuration.md)
+ [同步启动实例](launch-instances-synchronously.md)
+ [更新自动扩缩组](update-auto-scaling-group.md)
+ [为 Auto Scaling 组和实例添加标签](ec2-auto-scaling-tagging.md)
+ [实例维护策略](ec2-auto-scaling-instance-maintenance-policy.md)
+ [Amazon EC2 Auto Scaling 生命周期钩子](lifecycle-hooks.md)
+ [使用暖池减少启动时间较长的应用程序的延迟](ec2-auto-scaling-warm-pools.md)
+ [Auto Scaling 组的区域偏移](ec2-auto-scaling-zonal-shift.md)
+ [自动扩缩组可用区分配](ec2-auto-scaling-availability-zone-balanced.md)
+ [从自动扩缩组中分离或附加实例](ec2-auto-scaling-detach-attach-instances.md)
+ [临时从 Auto Scaling 组中移除实例](as-enter-exit-standby.md)
+ [删除 Auto Scaling 基础设施](as-process-shutdown.md)

# 使用启动模板创建自动扩缩组
<a name="create-auto-scaling-groups-launch-template"></a>

如果您已经创建了启动模板，则可以创建一个自动扩缩组，将启动模板用作 EC2 实例的配置模板。启动模板可以为实例指定一些信息，例如，AMI ID、实例类型、密钥对、安全组和块储存设备映射。有关创建启动模板的信息，请参阅[为 Auto Scaling 组创建启动模板](create-launch-template.md)。

您必须具有足够的权限来创建自动扩缩组。您还必须具有足够的权限来创建服务相关角色，以便 Amazon EC2 Auto Scaling 在该角色还不存在的情况下用它来代表您执行操作。有关管理员在向您授予权限时可参考的 IAM policy 示例，请参阅 [基于身份的策略示例](security_iam_id-based-policy-examples.md) 和 [控制自动扩缩组中 Amazon EC2 启动模板的使用情况](ec2-auto-scaling-launch-template-permissions.md)。

**Topics**
+ [使用启动模板创建 Auto Scaling 组](create-asg-launch-template.md)
+ [使用 Amazon EC2 启动向导创建 Auto Scaling 组](create-asg-ec2-wizard.md)
+ [Auto Scaling 组具有多个实例类型和购买选项](ec2-auto-scaling-mixed-instances-groups.md)

# 使用启动模板创建 Auto Scaling 组
<a name="create-asg-launch-template"></a>

在创建 Auto Scaling 组时，您必须指定配置 Amazon EC2 实例所需的信息、实例的可用区和 VPC 子网、所需容量以及最小和最大容量限制。

要配置通过 Auto Scaling 组启动的 Amazon EC2 实例，您可以指定启动模板或启动配置。以下过程演示如何使用启动模板创建 Auto Scaling 组。

**先决条件**
+ 你必须已创建启动模板。有关更多信息，请参阅 [为 Auto Scaling 组创建启动模板](create-launch-template.md)。

**使用启动模板创建 Auto Scaling 组（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 在屏幕顶部的导航栏上，选择与创建启动模板时相同的 AWS 区域 模板。

1. 选择 **Create an Auto Scaling group** (创建 Auto Scaling 组)。

1. 在**选择启动模板或配置**页面上，执行以下操作：

   1. 在 **Auto Scaling 组名称**中，输入 Auto Scaling 组的名称。

   1. 对于**启动模板**，请选择现有启动模板。

   1. 对于 **Launch template version（启动模板版本）**，选择自动扩缩组在扩展时使用启动模板的默认版本、最新版本还是特定版本。

   1. 验证您的启动模板是否支持您计划使用的所有选项，然后选择**下一步**。

1. 在**选择实例启动选项**页面上，如果您未使用多种实例类型，您可以跳过**实例类型要求**部分，使用在启动模板中指定的 EC2 实例类型。

   如需使用多种实例类型，参阅[Auto Scaling 组具有多个实例类型和购买选项](ec2-auto-scaling-mixed-instances-groups.md)。

1. 在 **Network** (网络) 下，对于 **VPC**，选择相应的 VPC。必须在您于启动模板中指定的安全组所在的 VPC 中创建 Auto Scaling 组。

1. 对于**可用区和子网**，选择指定 VPC 中的一个或多个子网。可以在多个可用区中使用子网以提供高可用性。有关更多信息，请参阅 [选择 VPC 子网时的注意事项](asg-in-vpc.md#as-vpc-considerations)。

1. 对于**可用区域分配**，选择一种分配策略。有关更多信息，请参阅 [自动扩缩组可用区分配](ec2-auto-scaling-availability-zone-balanced.md)。

1. 如果您创建了指定实例类型的启动模板，则可以继续下一步，创建使用启动模板中实例类型的 Auto Scaling 组。

   或者，如果在启动模板中未指定实例类型，或者您想使用多种实例类型进行自动扩展，您也可以选择 **Override launch template** (覆盖启动模板) 选项。有关更多信息，请参阅 [Auto Scaling 组具有多个实例类型和购买选项](ec2-auto-scaling-mixed-instances-groups.md)。

1. 选择 **Next** (下一步) 以继续下一步。

   或者，您可接受其余默认值，然后选择 **Skip to review** (跳到审核)。

1. （可选）在**与其他服务集成**页面上，配置以下选项，再选择**下一步**：

   1. 对于**负载平衡**，请选择是否将自动扩缩组附加至负载均衡器。有关更多信息，请参阅 [Elastic Load Balancing](autoscaling-load-balancer.md)。

   1. 要获取 **VPC Lattice 集成选项**，请选择是否使用 VPC Lattice。有关更多信息，请参阅 [使用 VPC Lattice 目标组来管理流量](ec2-auto-scaling-vpc-lattice.md)。

   1. 要使用 **Amazon 应用程序恢复控制器（ARC）可用区转移**，请选中复选框以启用可用区转移。有关更多信息，请参阅 [Auto Scaling 组的区域偏移](ec2-auto-scaling-zonal-shift.md)。

      1. 如果启用可用区转移，则对于**运行状况检查行为**，可选择“忽略运行状况不佳”或“替换运行状况不佳”。有关更多信息，请参阅 [Auto Scaling 群组的区域偏移是如何运作的](ec2-auto-scaling-zonal-shift.md#asg-zonal-shift-how-it-works)。

   1. 在**运行状况检查**下，对于**其他运行状况检查类型**，选择**开启 Amazon EBS 运行状况检查**。有关更多信息，请参阅 [使用运行状况检查监控具有受损 Amazon EBS 卷的 Auto Scaling 实例](monitor-and-replace-instances-with-impaired-ebs-volumes.md)。

   1. 对于**运行状况检查宽限期**，输入时间长短（以秒为单位）。此时间是 Amazon EC2 Auto Scaling 在实例进入 `InService` 状态后需要等待完成实例运行状况检查的时间。有关更多信息，请参阅 [设置自动扩缩组的运行状况检查宽限期](health-check-grace-period.md)。

1. （可选）在**配置组大小和扩展**页面上，配置以下选项，然后选择 **下一步**：

   1. 在**组大小**下，对于**所需容量**，请输入要启动的实例的初始数量。

   1. 在**扩展**部分的**扩展限制**下，如果**所需容量**的新值大于**所需的最小容量**和**最大所需容量**，则**所需的最大容量**将自动增加到新的所需容量值。您可以按需更改这些限制。有关更多信息，请参阅 [为自动扩缩组设置扩缩限制](asg-capacity-limits.md)。

   1. 对于**自动扩缩**，请选择是否要创建目标跟踪扩展策略。您也可以在创建自动扩缩组后再创建此策略。

      如果您选择**目标跟踪扩展策略**，请按照 [创建目标跟踪扩缩策略](policy_creating.md) 中的说明创建策略。

   1. 在**实例维护策略**下，请选择是否要创建实例维护策略。您也可以在创建自动扩缩组后再创建此策略。要创建策略，请按照[设置实例维护政策](set-instance-maintenance-policy.md)中的指导操作。

   1. 在**其他容量设置**的**容量预留首选项**下，选择是否要使用容量预留首选项。有关更多信息，请参阅 [使用容量预留在特定可用区中预留容量](use-ec2-capacity-reservations.md)。

   1. 在**其他设置**的**实例缩减保护**下，选择是否启用实例缩减保护。有关更多信息，请参阅 [使用实例横向缩减保护以控制实例终止](ec2-auto-scaling-instance-protection.md)。

   1. 对于**监控**，选择是否启用 CloudWatch 群组指标收集。这些指标提供的测量值可以指示潜在的问题，例如终止实例的数量或挂起实例的数量。有关更多信息，请参阅 [CloudWatch 监控您的 Auto Scaling 组和实例的指标](ec2-auto-scaling-cloudwatch-monitoring.md)。

   1. 对于**默认实例预热**，选择此选项并选择应用程序的预热时间。如果您正在创建具有扩展策略的 Auto Scaling 组，则默认实例预热功能会改进用于动态扩展的 Amazon CloudWatch 指标。有关更多信息，请参阅 [为 Auto Scaling 组设置原定设置实例预热](ec2-auto-scaling-default-instance-warmup.md)。

1. （可选）在**添加通知**页，配置通知，然后选择**下一步**。有关更多信息，请参阅 [Amazon EC2 Auto Scaling 的 Amazon SNS 通知选项](ec2-auto-scaling-sns-notifications.md)。

1. （可选）在**添加标签**页，请选择**添加标签**，为每个标签提供标签键和值，然后选择**下一步**。有关更多信息，请参阅 [为 Auto Scaling 组和实例添加标签](ec2-auto-scaling-tagging.md)。

1. 在 **Review（查看）**页面上，选择 **Create Auto Scaling group（创建 Auto Scaling 组）**。

**使用命令行创建 Auto Scaling 组**

您可以使用以下任一命令：
+ [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) (AWS CLI)
+ [新-ASAuto ScalingGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/New-ASAutoScalingGroup.html) (AWS Tools for Windows PowerShell)

# 使用 Amazon EC2 启动向导创建 Auto Scaling 组
<a name="create-asg-ec2-wizard"></a>

以下程序介绍了如何使用 Amazon EC2 控制台中的**启动实例**向导创建 Auto Scaling 组。该选项自动使用**启动实例**向导中的特定配置详细信息来填充启动模板。

**注意**  
该向导不会使用您指定的实例数填充 Auto Scaling 组；它只会使用 Amazon Machine Image (AMI) ID 和实例类型填充启动模板。使用**创建 Auto Scaling 组**向导以指定要启动的实例数量。  
AMI 包含配置实例所需的信息。在需要具有相同配置的多个实例时，您可以从单个 AMI 启动多个实例。我们建议使用已在其上安装应用程序的自定义 AMI，以避免在重启属于 Auto Scaling 组的实例时终止实例。要将自定义 AMI 与 Amazon EC2 Auto Scaling 结合使用，您必须首先从自定义实例创建 AMI，然后使用 AMI 为您的 Auto Scaling 组创建启动模板。

**先决条件**
+ 您必须已经在计划创建 Auto Scaling 组的 AWS 区域 位置创建了自定义 AMI。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[创建 AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html)。

## 使用自定义 AMI 作为模板
<a name="create-asg-ec2-wizard-launch-template"></a>

在本节中，您将使用 Amazon EC2 启动向导用自定义 AMI 自动填充启动模板。或者，要从头开始设置启动模板或要进一步了解可以为启动模板配置的参数，请参阅 [创建启动模板（控制台）](create-launch-template.md#create-launch-template-for-auto-scaling)。

**使用自定义 AMI 作为模板**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在屏幕顶部的导航栏上，显示 AWS 区域 当前。选择要在其中启动 Auto Scaling 组的区域。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择 **Launch instance**（启动实例），然后执行以下操作：

   1. 在 **Name and tags**（名称和标签）下，将 **Name**（名称）留空。该名称不是用于创建启动模板的数据的一部分。

   1. 在 “**应用程序和操作系统映像（Amazon 系统映像）**” 下，选择 “**浏览更多**” AMIs 以浏览完整的 AMI 目录。

   1. 选择 “**我**的” AMIs，找到您创建的 AMI，然后选择 **“选择”**。

   1. 在 **Instance type**（实例类型）下，选择一个实例类型。
**注意**  
选择创建 AMI 时使用的相同实例类型或更强大的实例类型。

   1. 在屏幕右侧的 **Summary**（摘要）下，对于 **Number of instances**（实例的数量），输入一个任意数字。此处输入的数字并不重要。在创建 Auto Scaling 组时，您将会指定要启动的实例数。

      在 **Number of instances**（实例的数量）字段下，将显示一条消息，其中说明 **When launching more than 1 instance, consider EC2 Auto Scaling**（启动多个实例时，请考虑 EC2 Auto Scaling）。

   1. 选择 **consider EC2 Auto Scaling**（考虑 EC2 Auto Scaling）超链接文本。

   1. 在 **Launch into Auto Scaling Group**（启动至 Auto Scaling 组）确认对话框中，选择 **Continue**（继续）以转至 **Create launch template**（创建启动模板）页面，其中已经填充了您在启动实例向导中选择的 AMI 和实例类型。

选择 **Continue** (继续) 之后，**Create launch template** (创建启动模板) 页面随即打开。按照此程序结束创建启动模板。

**创建启动模板**

1. 在 **Launch template name and description**（启动模板名称和说明）下，输入新启动模板的名称和描述。

1. （可选）在 **Key pair (login)** [密钥对（登录）] 下，对于 **Key pair name**（密钥对名称），选择先前创建以在连接到实例时（例如使用 SSH）使用的密钥对的名称。

1. （可选）在 **Network settings**（网络设置）下，对于 **Security groups**（安全组），选择一个或多个之前创建的[安全组](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html)。

1. （可选）在 **Configure storage**（配置存储）下，更新存储配置。默认存储配置由 AMI 和实例类型确定。

1. 配置完启动模板后，选择 **Create launch template** (创建启动模板)。

1. 在确认页面上，选择 **Create Auto Scaling group** (创建 Auto Scaling 组)。

## 创建 自动扩缩组
<a name="create-asg-ec2-wizard-auto-scaling-group"></a>

**注意**  
本主题的其余内容介绍创建 Auto Scaling 组的基本步骤。有关可以为 Auto Scaling 组配置的参数的更多说明，请参阅 [使用启动模板创建 Auto Scaling 组](create-asg-launch-template.md)。

选择 **Create Auto Scaling group** (创建 Auto Scaling 组) 之后，**Create Auto Scaling group** (创建 Auto Scaling 组) 向导随即打开。按照程序创建 Auto Scaling 组。

**创建 Auto Scaling 组**

1. 在 **Choose launch template or configuration** (选择启动模板或配置) 页面上，输入 Auto Scaling 组的名称。

1. 已经自动选择您创建的启动模板。

   对于 **Launch template version（启动模板版本）**，选择自动扩缩组在扩展时使用启动模板的默认版本、最新版本还是特定版本。

1. 选择 **Next** (下一步) 以继续下一步。

1. 在**选择实例启动选项**页面上，如果您未使用多种实例类型，您可以跳过**实例类型要求**部分，使用在启动模板中指定的 EC2 实例类型。

   如需使用多种实例类型，参阅[Auto Scaling 组具有多个实例类型和购买选项](ec2-auto-scaling-mixed-instances-groups.md)。

1. 在 **Network** (网络) 下，对于 **VPC**，选择相应的 VPC。必须在启动模板中指定的安全组所在的 VPC 中创建 Auto Scaling 组。
**提示**  
如果您没有在启动模板中指定安全组，则将使用指定 VPC 中的默认安全组启动您的实例。预设情况下，此安全组不允许来自外部网络的入站流量。

1. 对于**可用区和子网**，选择指定 VPC 中的一个或多个子网。

1. 对于**可用区域分配**，选择一种分配策略。有关更多信息，请参阅 [自动扩缩组可用区分配](ec2-auto-scaling-availability-zone-balanced.md)。

1. 选择 **Next**（下一步） 两次以转至 **Configure group size and scaling policies**（配置组大小和扩展策略）页面。

1. 在**组大小**下，指定**所需容量**（创建自动扩缩组后立即启动的初始实例数量）。

1. 在**扩展**部分的**扩展限制**下，如果**所需容量**的新值大于**所需的最小容量**和**最大所需容量**，则**所需的最大容量**将自动增加到新的所需容量值。您可以按需更改这些限制。有关更多信息，请参阅 [为自动扩缩组设置扩缩限制](asg-capacity-limits.md)。

1. 选择 **Skip to review** (跳转以查看)。

1. 在 **Review**（查看）页面上，选择 **Create Auto Scaling group**（创建 Auto Scaling 组）。

## 后续步骤
<a name="create-asg-ec2-wizard-next-steps"></a>

您可以通过查看活动历史记录来检查是否已正确创建了 Auto Scaling 组。在 **Activity** (活动) 选项卡上的 **Activity history** (活动历史记录) 下，**Status** (状态) 列显示您的 Auto Scaling 组是否已成功启动实例。如果实例无法启动，或者它们启动但随后立即终止，请参阅以下主题了解可能的原因和解决方法：
+ [Amazon EC2 Auto Scaling 问题排查：EC2 实例启动失败](ts-as-instancelaunchfailure.md)
+ [Amazon EC2 Auto Scaling 问题排查：AMI 问题](ts-as-ami.md)
+ [排查 Amazon EC2 Auto Scaling 中运行状况不佳的实例问题](ts-as-healthchecks.md)

如果需要，您现在可以在 Auto Scaling 组所在的同一区域中连接负载均衡器。有关更多信息，请参阅 [使用 Elastic Load Balancing，在自动扩缩组中分配传入的应用程序流量](autoscaling-load-balancer.md)。

# Auto Scaling 组具有多个实例类型和购买选项
<a name="ec2-auto-scaling-mixed-instances-groups"></a>

您可以启动并自动扩展单个 Auto Scaling 组中的一组按需实例和竞价型实例。除了享受使用竞价型实例的折扣外，您还可以使用预留实例或节省计划获得常规按需型实例定价的折扣。以上因素的作用是帮助您进一步节约 EC2 实例成本，同时获得应用程序所需的规模和性能。

与 EC2 按需价格相比，竞价型实例是以极大折扣提供的备用容量。如果能灵活控制应用程序的运行时间并且应用程序可以中断，竞价型实例就是经济实惠之选。这些实例可用于各种容错和灵活的应用程序。示例包括无状态 Web 服务器、API 端点、大数据和分析应用程序、容器化工作负载、 CI/CD 管道、高性能和高吞吐量计算 (HPC/HTC)、渲染工作负载以及其他灵活的工作负载。

有关更多信息，请参阅《Amazon EC2 用户指南》**中的[实例购买选项](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-purchasing-options.html)。

**Topics**
+ [创建混合实例组的设置概述](mixed-instances-groups-set-up-overview.md)
+ [多种实例类型的分配策略](allocation-strategies.md)
+ [使用基于属性的实例类型选择创建混合实例组](create-mixed-instances-group-attribute-based-instance-type-selection.md)
+ [通过手动选择实例类型来创建混合实例组](create-mixed-instances-group-manual-instance-type-selection.md)
+ [配置自动扩缩组以使用实例权重](ec2-auto-scaling-mixed-instances-groups-instance-weighting.md)
+ [使用多个启动模板](ec2-auto-scaling-mixed-instances-groups-launch-template-overrides.md)

# 创建混合实例组的设置概述
<a name="mixed-instances-groups-set-up-overview"></a>

本主题提供创建混合实例自动扩缩的概述和最佳实践。

**Topics**
+ [概述](#mixed-instances-groups-overview)
+ [实例类型灵活性](#mixed-instances-group-instance-flexibility)
+ [可用区灵活性](#mixed-instances-group-az-flexibility)
+ [Spot 最高价](#mixed-instances-group-spot-max-price)
+ [主动容量再平衡](#use-capacity-rebalancing)
+ [扩展行为](#mixed-instances-group-scaling-behavior)
+ [实例类型的区域可用性](#setup-overview-regional-availability-of-instance-types)
+ [相关资源](#setup-overview-related-resources)
+ [限制](#setup-overview-limitations)

## 概述
<a name="mixed-instances-groups-overview"></a>

要创建混合实例组，您有两个选项：
+ [基于属性的实例类型选择](create-mixed-instances-group-attribute-based-instance-type-selection.md)：定义您的计算要求，以便根据其特定实例属性自动选择实例类型。
+ [手动实例类型选择](create-mixed-instances-group-manual-instance-type-selection.md)：手动选择适合您工作负载的实例类型。

------
#### [ Manual selection ]

以下步骤介绍如何通过手动选择实例类型来创建混合实例组：

1. 选择一个启动模板，器中包含用于启动 EC2 实例的参数。启动模板中的参数是可选的，但是如果启动模板中缺少 amilong; (AMI) ID，Amazon EC2 Auto Scaling 将无法启动实例。

1. 选择选项以覆盖启动模板。

1. 手动选择适合您的工作负载的实例类型。

1. 指定要启动的按需型实例和竞价型实例的百分比。

1. 选择决定 Amazon EC2 Auto Scaling 将如何利用可能的实例类型来达到您的按需型和竞价型容量的分配策略。

1. 选择要在其中启动实例的可用区和 VPC 子网。

1. 指定组的初始大小（所需容量）以及该组的最小和最大大小。

必须进行覆盖，才能覆盖启动模板中声明的实例类型并使用嵌入在自动扩缩组自有资源定义中的多个实例类型。有关可用实例类型的更多信息，请参阅《Amazon EC2 用户指南》**中的[实例类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)。

您还可以为每种实例类型配置以下可选参数：
+ `LaunchTemplateSpecification`：您可以根据需要为实例类型分配不同的启动模板。此选项目前在控制台中不可用。有关更多信息，请参阅 [使用多个启动模板](ec2-auto-scaling-mixed-instances-groups-launch-template-overrides.md)。
+ `WeightedCapacity`：与组中其余实例相比，您可以决定该实例在所需容量中所占的比例。如果您为一种实例类型指定 `WeightedCapacity` 值，则必须为所有实例类型指定 `WeightedCapacity` 值。默认情况下，每个实例在您的所需容量中计为一个。有关更多信息，请参阅 [配置自动扩缩组以使用实例权重](ec2-auto-scaling-mixed-instances-groups-instance-weighting.md)。

------
#### [ Attribute-based selection ]

要让 Amazon EC2 Auto Scaling 根据实例的特定属性自动选择您的实例类型，请使用以下步骤通过指定您的计算要求来创建混合实例组：

1. 选择一个启动模板，器中包含用于启动 EC2 实例的参数。启动模板中的参数是可选的，但是如果启动模板中缺少 amilong; (AMI) ID，Amazon EC2 Auto Scaling 将无法启动实例。

1. 选择选项以覆盖启动模板。

1. 指定与您的计算要求相匹配的实例属性，例如 v CPUs 和内存要求。

1. 指定要启动的按需型实例和竞价型实例的百分比。

1. 选择决定 Amazon EC2 Auto Scaling 将如何利用可能的实例类型来达到您的按需型和竞价型容量的分配策略。

1. 选择要在其中启动实例的可用区和 VPC 子网。

1. 指定组的初始大小（所需容量）以及该组的最小和最大大小。

必须进行覆盖，才能覆盖启动模板中声明的实例类型并使用一组实例属性来描述您的计算要求。有关支持的属性，请参阅 [InstanceRequirements](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_InstanceRequirements.html)*Amazon EC2 Auto Scaling API 参考*中的。或者，您可以使用已有实例属性定义的启动模板。

您也可以在覆盖结构中配置 `LaunchTemplateSpecification` 参数，以便根据需要为一组实例要求分配不同的启动模板。此选项目前在控制台中不可用。有关更多信息，请参阅[LaunchTemplateOverrides](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_LaunchTemplateOverrides.html)《*亚马逊 EC2 Auto Scaling API 参考*》。

默认情况下，您将自动扩缩组的所需容量值设置为实例的数量。

或者，您可以将所需容量的值设置为 v 数CPUs 或内存量。为此，请使用 `CreateAutoScalingGroup` API 操作中的 `DesiredCapacityType` 属性或 AWS 管理控制台中的**所需容量类型**下拉字段。这是[实例权重](ec2-auto-scaling-mixed-instances-groups-instance-weighting.md)的实用替代方案。

------

## 实例类型灵活性
<a name="mixed-instances-group-instance-flexibility"></a>

要提高可用性，请跨多种实例类型部署应用程序。最佳实践是使用多种实例类型来满足容量要求。这样，如果您选择的可用区中实例容量不足，则 Amazon EC2 Auto Scaling 可以启动另一种实例类型。

如果竞价型实例的实例容量不足，则 Amazon EC2 Auto Scaling 将继续尝试从其他竞价型实例池启动。（它使用的池由您选择的实例类型和分配策略决定。） Amazon EC2 Auto Scaling 通过启动竞价型实例而不是按需型实例，帮助您利用竞价型实例节省的成本。

我们建议灵活地为每种工作负载在至少 10 种实例类型之间进行选择。选择实例类型时，不要局限于最热门的新实例类型。选择老一代实例类型往往会导致竞价型中断较少，因为按需客户对它们的需求较少。

## 可用区灵活性
<a name="mixed-instances-group-az-flexibility"></a>

我们强烈推荐您在多个可用区之间跨越您的自动扩缩组。利用多个可用区，您可以设计在可用区之间自动实现故障转移的应用程序，从而提高弹性。

作为额外优势，与单个可用区中的组相比，您可以访问更充足的 Amazon EC2 容量池。由于可用区内每个实例类型的容量分开波动，您可以灵活使用实例类型和可用区，通常可以获得更多计算容量。

有关使用多可用区的详细信息，请参阅 [示例：在可用区之间分配实例](auto-scaling-benefits.md#arch-AutoScalingMultiAZ)。

## Spot 最高价
<a name="mixed-instances-group-spot-max-price"></a>

使用 AWS CLI 或软件开发工具包创建 Auto Scaling 组时，可以指定`SpotMaxPrice`参数。`SpotMaxPrice` 参数确定您愿意为竞价型实例一小时支付的最高价。

当您在覆盖（或 `"DesiredCapacityType": "vcpu"` 或在组级别的 `"DesiredCapacityType": "memory-mib"`）中指定 `WeightedCapacity` 参数时，最高价格代表的是最高单价，而不是整个实例的最高价格。

我们强烈建议您不要指定最高价。如果您未收到任何竞价型实例 (例如当您的最高价太低时)，您的应用程序可能不运行。如果未指定最高价，则默认最高价为按需价格。您只需为您启动的竞价型实例支付 Spot 价格。您仍然可以享受竞价型实例提供的大幅折扣。这些折扣得以实现，是由于借助[竞价型定价模型](https://aws.amazon.com/blogs/compute/new-amazon-ec2-spot-pricing/)带来了稳定的竞价型定价。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[定价和节省](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html#spot-pricing)。

## 主动容量再平衡
<a name="use-capacity-rebalancing"></a>

如果您的用例允许，我们建议您进行容量再平衡。容量再平衡可主动替换存在中断风险的竞价型实例，从而帮助维持工作负载的可用性。

当启用容量再平衡时，Amazon EC2 Auto Scaling 将尝试主动替换已收到 EC2 实例再平衡建议的竞价型实例。这让您能够将工作负载转移到不具有较高中断风险的新竞价型实例。

有关更多信息，请参阅 [Auto Scaling 进行容量再平衡以替换存在风险的竞价型实例](ec2-auto-scaling-capacity-rebalancing.md)。

## 扩展行为
<a name="mixed-instances-group-scaling-behavior"></a>

当您创建混合实例组时，它默认使用按需型实例。要使用竞价型实例，您必须修改要启动的按需型实例启动的百分比。您可以指定 0 到 100 之间的任意数字来作为按需百分比。

或者，您也可以指定要开始使用的按需型实例的基本数量。如果您这样操作，则 Amazon EC2 Auto Scaling 将等待，直到它在组横向扩展时启动按需型实例的基本容量之后，才会启动竞价型实例。超出基本容量的任何内容都使用按需百分比来确定要启动多少按需型实例和竞价型实例。

Amazon EC2 Auto Scaling 将百分比转换为等效数量的实例。如果结果创建一个小数，向上舍入为下一个整数，以支持按需型实例。

下表展示了自动扩缩组随着规模的增加和减少而采取的行为。


**示例：扩展行为**  

| 购买选项 | 各购买选项的运行实例的组大小和数量 | 
| --- |--- |
|  | **10** | **20** | **30** | **40** | 
| --- |--- |--- |--- |--- |
| **示例 1**：以 10 为基准，50/ 50% 按需/竞价型 |  |  |  |  | 
| 按需实例（基本数量） | 10 | 10 | 10 | 10 | 
| 按需型实例 | 0 | 5 | 10 | 15 | 
| 竞价型实例 | 0 | 5 | 10 | 15 | 
| **示例 2**：以 0 为基准，0/ 100% 按需/竞价型 |  |  |  |  | 
| 按需实例（基本数量） | 0 | 0 | 0 | 0 | 
| 按需型实例 | 0 | 0 | 0 | 0 | 
| 竞价型实例 | 10 | 20 | 30 | 40 | 
| **示例 3**：以 0 为基准，60/ 40% 按需/竞价型 |  |  |  |  | 
| 按需实例（基本数量） | 0 | 0 | 0 | 0 | 
| 按需型实例 | 6 | 12 | 18 | 24 | 
| 竞价型实例 | 4 | 8 | 12 | 16 | 
| **示例 4**：以 0 为基准，100/ 0% 按需/竞价型 |  |  |  |  | 
| 按需实例（基本数量） | 0 | 0 | 0 | 0 | 
| 按需型实例 | 10 | 20 | 30 | 40 | 
| 竞价型实例 | 0 | 0 | 0 | 0 | 
| **示例 5**：以 12 为基准，0/ 100% 按需/竞价型 |  |  |  |  | 
| 按需实例（基本数量） | 10 | 12 | 12 | 12 | 
| 按需型实例 | 0 | 0 | 0 | 0 | 
| 竞价型实例 | 0 | 8 | 18 | 28 | 

当组规模*增加*时，Amazon EC2 Auto Scaling 将尝试在您指定的可用区之间均匀平衡您的容量。然后，它根据指定的分配策略启动实例类型。

当组规模*减少*时，Amazon EC2 Auto Scaling 首先确定应终止两种类型中的哪一种类型（竞价型或按需）。然后，它会尝试以平衡的方式终止您指定的可用区的实例。它还倾向于以更接近您的分配策略的方式终止实例。有关终止策略的更多信息，请参阅 [配置 Amazon EC2 Auto Scaling 的终止策略](ec2-auto-scaling-termination-policies.md)。

## 实例类型的区域可用性
<a name="setup-overview-regional-availability-of-instance-types"></a>

EC2 实例类型的可用性因您而异 AWS 区域。例如，最新一代实例类型可能尚未在给定区域中可用。由于不同区域的实例可用性存在差异，如果您的覆盖中的多个实例类型在您所在的地区不可用，则在提出编程请求时可能会遇到问题。使用您所在地区不可用的多个实例类型可能会导致请求完全失败。要解决此问题，请使用不同的实例类型重试请求，确保每个实例类型在该区域中都可用。要搜索按位置提供的实例类型，请使用[describe-instance-type-offerings](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-instance-type-offerings.html)命令。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[查找 Amazon EC2 实例类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-discovery.html)。

## 相关资源
<a name="setup-overview-related-resources"></a>

有关竞价型实例的更多最佳实践，请参阅《Amazon EC2 用户指南》**中的 [EC2 竞价型的最佳实践](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-best-practices.html)。

## 限制
<a name="setup-overview-limitations"></a>

使用[混合实例策略](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_MixedInstancesPolicy.html)向自动扩缩组添加覆盖后，您可以通过 `UpdateAutoScalingGroup` API 调用更新覆盖，但无法将其删除。要完全移除覆盖，必须先将自动扩缩组切换为使用启动模板或启动配置，而不是混合实例策略。然后，您可以再次添加混合实例策略，而无需任何覆盖。

# 多种实例类型的分配策略
<a name="allocation-strategies"></a>

当您使用多种实例类型时，您可以根据可能的实例类型管理 Amazon EC2 Auto Scaling 如何满足您的按需容量和竞价容量。为此，您需要指定多个分配策略。

要查看混合实例组的最佳实践，请参阅[创建混合实例组的设置概述](mixed-instances-groups-set-up-overview.md)。

**Topics**
+ [竞价型实例](#spot-allocation-strategy)
+ [按需型实例](#on-demand-allocation-strategy)
+ [分配策略如何与权重配合使用](#lowest-price-allocation-strategy)

## 竞价型实例
<a name="spot-allocation-strategy"></a>

Amazon EC2 Auto Scaling 提供了以下适用于竞价型实例的分配策略：

`price-capacity-optimized`（推荐）  
价格和容量优化分配策略同时考虑价格和容量，以选择中断可能性最小、价格尽可能低的竞价型实例池。  
我们建议您在入门时使用此策略。有关更多信息，请参阅 AWS 博客[中的 EC2 竞价型实例 price-capacity-optimized分配策略简介](https://aws.amazon.com/blogs/compute/introducing-price-capacity-optimized-allocation-strategy-for-ec2-spot-instances/)。

`capacity-optimized`  
Amazon EC2 Auto Scaling 将从池中请求您的竞价型实例，对于启动的实例数量而言，该池具有最佳容量。  
使用竞价型实例，定价会根据长期供需趋势缓慢发生变化。但是，容量会实时波动。`capacity-optimized` 策略通过查看实时容量数据并预测可用性最高的池，自动在可用性最高的池中启动 Spot 实例。这有助于最大限度减少工作负载的可能中断，这些工作负载可能会因重启工作和检查点操作而导致更高的中断成本。要使某些实例类型有更高的首先启动机会，请使用 `capacity-optimized-prioritized`。

`capacity-optimized-prioritized`  
设置启动模板覆盖的实例类型顺序，从最高优先级到最低优先级（从列表中的第一项到最后一项降序列出）。Amazon EC2 Auto Scaling 在尽力而为的基础上尊重实例类型优先级，但会首先针对容量进行优化。对于必须最大限度地减少中断可能性，但对某些实例类型的偏好也很重要的工作负载来说，这是一个不错的选择。如果将按需型分配策略设置为 `prioritized`，则在满足按需型容量时将应用相同的优先级。

`lowest-price`（不推荐）  
不推荐使用 `lowest-price` 策略，因为它对竞价型实例造成的中断风险最高。
Amazon EC2 Auto Scaling 将在您为**价格最低的池**设置指定的 N 个竞价型池之间，使用可用区内价格最低的池请求您的竞价型实例。例如，如果您指定四种实例类型和四个可用区，则您的自动扩缩组可以访问最多 16 个竞价型池。（每个可用区内四个。） 如果您为分配策略指定两个竞价型池 (N=2)，则您的自动扩缩组可以使用每个可用区的两个价格最低的池来满足竞价型容量。  
`lowest-price` 策略仅在使用 AWS CLI时可用。  
Amazon EC2 Auto Scaling 会尽力根据您指定的 N 个池提取竞价型实例。但是，如果池在满足所需容量之前耗尽竞价容量，则 Amazon EC2 Auto Scaling 会继续通过从下一个价格最低的池中提取来满足您的请求。为了达到您所需的容量，您可能会从超过指定的 N 个池接收竞价型实例。同样，如果大多数池没有竞价容量，则您可能会从少于指定的 N 个池接收完整所需容量。

**注意**  
如果将竞价型实例配置为启动并开启 [AMD SEV-SNP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sev-snp.html)，您需要按小时支付额外的使用费，费率为所选实例类型[按需小时费率](https://aws.amazon.com/ec2/pricing/on-demand/)的 10%。如果分配策略使用价格作为输入，则 Amazon EC2 Auto Scaling 不包括这笔额外费用；只使用 Spot 价格。

## 按需型实例
<a name="on-demand-allocation-strategy"></a>

Amazon EC2 Auto Scaling 提供了以下可用于按需实例的分配策略：

`lowest-price`  
Amazon EC2 Auto Scaling 会根据当前的按需价格自动部署每个可用区中价格最低的实例类型。  
为了满足您的所需容量，您可能会在每个可用区中获得一种以上实例类型的按需型实例。这取决于您请求多大容量。

`prioritized`  
在满足按需型容量时，Amazon EC2 Auto Scaling 将根据启动模板覆盖列表中实例类型的顺序，确定首先使用哪个实例类型。例如，假设您按以下顺序指定三个启动模板覆盖：`c5.large`、`c4.large` 和 `c3.large`。在您的按需型实例启动时，自动扩缩组满足按需型容量的顺序是从 `c5.large` 开始，然后是 `c4.large`，最后是 `c3.large`。  
管理按需实例的优先级顺序时，请考虑以下事项：  
+ 您可以通过使用 Savings Plans 或预留实例预先支付使用费用，以获得按需实例的大幅折扣。有关更多信息，请参阅 [Amazon EC2 定价](https://aws.amazon.com/ec2/pricing/)页面。
+ 对于预留实例，如果 Amazon EC2 Auto Scaling 启动匹配的实例类型，则适用常规按需型实例定价的折扣价。因此，如果存在未使用的 `c4.large` 预留实例，则可以设置实例类型优先级，将预留实例的最高优先级赋予 `c4.large` 实例类型。当 `c4.large` 实例启动时，您可享受预留实例定价。
+ 通过 Savings Plans，当您使用 Amazon EC2 Instance Savings Plans 或 Compute Savings Plans 时，将适用常规按需型实例定价的折扣价。通过 Savings Plans，您可以更灵活地确定实例类型的优先级。只要您使用节省计划涵盖的实例类型，就可以按任何优先级顺序设置它们。您也可以偶尔更改实例类型的整个顺序，同时仍可享受节省计划折扣费率。有关 Savings Plans 的更多信息，请参阅 [Savings Plans 用户指南](https://docs.aws.amazon.com/savingsplans/latest/userguide/)。

## 分配策略如何与权重配合使用
<a name="lowest-price-allocation-strategy"></a>

当您在覆盖（或在组级别的 `"DesiredCapacityType": "vcpu"` 或 `"DesiredCapacityType": "memory-mib"`）中指定 `WeightedCapacity` 参数时，分配策略的工作方式与用于其他自动扩缩组时完全相同。

假设您有一个 Auto Scaling 组，该组包含多个具有不同数量的 v 的实例类型CPUs。 您使用`lowest-price`现货和按需分配策略。如果您选择根据每种实例类型的 vCPU 计数分配权重，Amazon EC2 Auto Scaling 将启动交付时每个分配权重值（例如，每个 vCPU）价格最低的任何实例类型。如果是 Spot 实例，那么这意味着每个 vCPU 的最低 Spot 价格。如果是按需型实例，那么这意味着每个 vCPU 的最低按需价格。

 有关更多信息，请参阅 [配置自动扩缩组以使用实例权重](ec2-auto-scaling-mixed-instances-groups-instance-weighting.md)。

# 使用基于属性的实例类型选择创建混合实例组
<a name="create-mixed-instances-group-attribute-based-instance-type-selection"></a>

在创建混合实例组时手动选择实例类型有一个替代方法，您可以指定一组用于描述计算要求的实例属性。当 Amazon EC2 Auto Scaling 启动实例时，自动扩缩组使用的所有实例类型都必须与您所需实例的属性匹配。这称为*基于属性的实例类型选择*。

这种方法非常适合于可以灵活处理所使用实例类型的工作负载和框架，例如容器、大数据和 CI/CD。

选择基于属性的实例类型具有以下优势：
+ **竞价型实例的最佳灵活性**：Amazon EC2 Auto Scaling 可以从各种实例类型中进行选择，从而启动竞价型实例。这是符合灵活处理实例类型的竞价型实例的最佳实践，可以使得 Amazon EC2 竞价型服务有更好的机会查找和分配所需的计算容量。
+ **轻松使用正确的实例类型** – 有如此多的实例类型可供使用，因此找到适用于您的工作负载的实例类型可能非常耗时。当您指定实例属性时，实例类型将自动具有工作负载所需的属性。
+ **自动使用新实例类型**：您的自动扩缩组可以在发布新一代实例类型时使用这些实例类型。新一代实例类型将自动投入使用，如果它们符合您的要求并与您为自动扩缩组选择的分配策略保持一致。

**Topics**
+ [基于属性的实例类型选择的工作原理](#how-attribute-based-instance-type-selection-works)
+ [价格保护](#understand-price-protection)
+ [性能保护](#understand-performance-protection)
+ [先决条件](#attribute-based-instance-type-selection-prerequisites)
+ [使用基于属性的实例类型选择创建一个混合实例组（控制台）](#attribute-based-instance-type-selection-console)
+ [使用基于属性的实例类型选择创建一个混合实例组（AWS CLI）](#attribute-based-instance-type-selection-aws-cli)
+ [示例配置](#attribute-based-instance-type-selection-example-configurations)
+ [预览您的实例类型](#attribute-based-instance-type-selection-preview)
+ [相关资源](#attribute-based-instance-type-selection-related-resources)

## 基于属性的实例类型选择的工作原理
<a name="how-attribute-based-instance-type-selection-works"></a>

通过基于属性的实例类型选择，您无需提供特定实例类型列表，而是提供实例所需的实例属性列表，例如：
+ **vCPU 计数**-每个实例的最小和最大 v CPUs 数。
+ **内存**-每个实例的最小 GiBs 和最大内存。
+ **本地存储** - 是使用 EBS 还是实例存储卷作为本地存储。
+ **可突增性能** - 是否使用 T 实例系列（包括 T4g、T3a、T3 和 T2 类型）。

有许多选项可用于定义您的实例要求。有关每个选项和默认值的描述，请参阅[InstanceRequirements](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_InstanceRequirements.html)《*Amazon EC2 Auto Scaling API 参考*》。

当您的自动扩缩组需要启动实例时，它将搜索与您指定的属性匹配且在该可用区中可用的实例类型。然后，分配策略确定启动哪种匹配的实例类型。默认情况下，基于属性的实例类型选择启用了价格保护功能，以防止您的自动扩缩组启动超出预算阈值的实例类型。

默认情况下，在设置自动扩缩组所需的容量时，使用实例数作为计量单位，这意味着每个实例算作一个单位。

或者，您可以将所需容量的值设置为 v 数CPUs 或内存量。为此，请在或 `UpdateAutoScalingGroup` API 操作中使用 AWS 管理控制台 或`DesiredCapacityType`属性的**所需容量类型**下拉字段。`CreateAutoScalingGroup`然后，Amazon EC2 Auto Scaling 会启动满足所需 vCPU 或内存容量所需的实例数量。例如，如果您使用 v CPUs 作为所需容量类型，并使用CPUs 每个容量为 2 v 的实例，则所需容量为 10 v CPUs 将启动 5 个实例。这是[实例权重](ec2-auto-scaling-mixed-instances-groups-instance-weighting.md)的实用替代方案。

## 价格保护
<a name="understand-price-protection"></a>

通过价格保护，您可以指定愿意为由自动扩缩组启动的 EC2 实例所支付的最高价格。价格保护是一项功能，可以防止自动扩缩组使用您认为成本过高的实例类型，即使其恰好适合您指定的属性。

默认已启用价格保护，价格保护为按需型实例和竞价型实例设置了单独的价格阈值。当 Amazon EC2 Auto Scaling 需要启动新实例时，不会启动定价高于相关阈值的任何实例类型。

**Topics**
+ [按需价格保护](#on-demand-price-price-protection)
+ [竞价价格保护](#spot-price-price-protection)
+ [自定义价格保护](#customize-price-price-protection)

### 按需价格保护
<a name="on-demand-price-price-protection"></a>

对于按需型实例，您可以将愿意支付的最高按需价格定义为高于已确定按需价格的百分比。已确定按需价格是具有指定属性的、价格最低的最新一代 C、M 或 R 实例类型的价格。

如果未明确定义按需价格保护值，则将使用比已确定按需价格高 20% 的默认最高按需价格。

### 竞价价格保护
<a name="spot-price-price-protection"></a>

默认情况下，Amazon EC2 Auto Scaling 将自动应用最佳竞价型实例价格保护，从而始终如一地从各种实例类型中进行选择。您也可以自行手动设置价格保护。但是，让 Amazon EC2 Auto Scaling 为您代劳可以提高竞价型容量得到满足的可能性。

您可以使用以下选项之一，手动指定价格保护。如果您手动设置价格保护，则建议您使用第一个选项。
+ **已确定*按需价格*的百分比**：已确定按需价格是具有指定属性的、价格最低的最新一代 C、M 或 R 实例类型的价格。
+ **高于已确定*竞价价格*的百分比**：已确定竞价价格是具有指定属性的、价格最低的最新一代 C、M 或 R 实例类型的价格。不建议使用此选项，因为竞价价格可能会波动，因此您的价格保护阈值也可能会波动。

### 自定义价格保护
<a name="customize-price-price-protection"></a>

您可以在 Amazon EC2 Auto Scaling 控制台中或使用或自定义价格保护阈值 SDKs。 AWS CLI 
+ 在控制台中，使用**其他实例属性**中的**按需价格保护**和**竞价价格保护**设置。
+ 在[InstanceRequirements](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_InstanceRequirements.html)结构中，要指定按需实例价格保护阈值，请使用`OnDemandMaxPricePercentageOverLowestPrice`属性。要指定竞价型实例价格保护阈值，请使用 `MaxSpotPriceAsPercentageOfOptimalOnDemandPrice` 或 `SpotMaxPricePercentageOverLowestPrice` 属性。

如果您将 “**所需容量类型**” (`DesiredCapacityType`) 设置为 **v CPUs** 或**内存 GiB**，则价格保护将根据每个 vCPU 或每个内存的价格而非每个实例的价格适用。

您也可以关闭价格保护。要表明无价格保护阈值，请指定一个较高的百分比值，如 `999999`。

**注意**  
如果没有与指定属性匹配的最新一代 C、M 或 R 实例类型，则价格保护仍然适用。如果找不到匹配项，则已确定价格来自匹配指定属性的、价格最低的最新一代实例类型；如果没有，则来自价格最低的上一代实例类型。

## 性能保护
<a name="understand-performance-protection"></a>

*性能保护*是一项功能，可确保您的自动扩缩组使用的实例类型类似于或超过指定的性能基准。要使用性能保护，请指定一个实例系列作为基准参考。指定的实例系列的功能确立了可接受的最低性能水平。当 Auto Scaling 选择实例类型时，它会考虑您指定的属性和性能基准。低于性能基准的实例类型将被自动排除在选择范围之外，即使它们与您指定的其他属性相匹配。这可确保所有选定的实例类型都提供与指定实例系列建立的基准相似或更好的性能。Auto Scaling 使用此基准来指导实例类型选择，但并不能保证选定实例类型始终会超过每个应用程序的基准。

目前，此功能仅支持将 CPU 性能作为基准性能因素。指定实例系列的 CPU 性能充当性能基准，确保选定的实例类型与该基准相似或超过该基准。具有相同 CPU 处理器的实例系列会产生相同的筛选结果，即使其网络或磁盘性能有所不同。例如，将 `c6in` 或 `c6i` 指定为基准参考将产生相同的基于性能的筛选结果，因为两个实例系列使用相同的 CPU 处理器。

**不支持的实例系列**  
以下实例系列不支持性能保护：
+ `c1`
+ `g3` \$1 `g3s`
+ `hpc7g`
+ `m1` \$1 `m2`
+ `mac1` \$1 `mac2` \$1 `mac2-m1ultra` \$1 `mac2-m2` \$1 `mac2-m2pro`
+ `p3dn` \$1 `p4d` \$1 `p5`
+ `t1`
+ `u-12tb1` \$1 `u-18tb1` \$1 `u-24tb1` \$1 `u-3tb1` \$1 `u-6tb1` \$1 `u-9tb1` \$1 `u7i-12tb` \$1 `u7in-16tb` \$1 `u7in-24tb` \$1 `u7in-32tb`

如果您通过指定支持的实例系列来启用性能保护，则返回的实例类型将排除上述不受支持的实例系列。

**示例：设置 CPU 性能基准**  
在以下示例中，实例要求是使用具有与 `c6i` 实例系列一样性能的 CPU 核心的实例类型启动。这将筛选出性能较低的 CPU 处理器的实例类型，即使它们满足其他指定的实例要求，例如 v CPUs 的数量。 例如，如果您指定的实例属性包括 4 v CPUs 和 16 GB 的内存，则具有这些属性但 CPU 性能低于该值的实例类型`c6i`将被排除在选择范围之外。

```
"BaselinePerformanceFactors": {
        "Cpu": {
            "References": [
                {
                    "InstanceFamily": "c6i"
                }
            ]
        }
```

**注意事项**  
使用性能保护时，请注意以下事项：
+ 您可以指定实例类型或实例属性，但不能同时指定两者。
+ 在一个请求配置中，最多可以指定四个 `InstanceRequirements` 结构。

## 先决条件
<a name="attribute-based-instance-type-selection-prerequisites"></a>
+ 创建启动模板。有关更多信息，请参阅 [为 Auto Scaling 组创建启动模板](create-launch-template.md)。
+ 验证启动模板尚未请求竞价型实例。

## 使用基于属性的实例类型选择创建一个混合实例组（控制台）
<a name="attribute-based-instance-type-selection-console"></a>

通过以下过程使用基于属性的实例类型选择创建混合实例组。为了帮助您高效地完成这些步骤，我们跳过了一些可选部分。

对于大多数通用工作负载，只需指定所需的 v 数量CPUs 和内存就足够了。对于高级使用案例，您可以指定存储类型、网络接口、CPU 制造商和加速器类型等属性。

要查看混合实例组的最佳实践，请参阅[创建混合实例组的设置概述](mixed-instances-groups-set-up-overview.md)。

**创建一个混合实例组**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 在屏幕顶部的导航栏中，选择在创建启动模板时使用的同一 AWS 区域 。

1. 选择**创建自动扩缩组**。

1. 在**选择启动模板或配置**页面上，对于**自动扩缩组名称**，输入自动扩缩组的名称。

1. 要选择启动模板，请执行以下操作：

   1. 对于**启动模板**，请选择现有启动模板。

   1. 对于 **Launch template version（启动模板版本）**，选择自动扩缩组在扩展时使用启动模板的默认版本、最新版本还是特定版本。

   1. 验证您的启动模板是否支持您计划使用的所有选项，然后选择**下一步**。

1. 在**选择实例启动选项**页面上，执行以下操作：

   1. 对于 **Instance type requirements**（实例类型要求），请选择 **Override launch template**（覆盖启动模板）。
**注意**  
如果您选择了某个已经包含一组实例属性（例如 vCPU 和内存）的启动模板，那么将显示实例属性。这些属性将被添加到自动扩缩组属性中，您可以随时通过 Amazon EC2 Auto Scaling 控制台更新这些属性。

   1. 在 **“指定实例属性”** 下，首先输入您的 v CPUs 和内存要求。
      + 对于 **v CPUs**，输入所需的最小和最大值 v CPUs。 要指定无限制，请选择**无最小值、无****最大值**或两者兼而有之。
      + 对于 **Memory (GiB)**（内存 (GiB)），输入所需的最小和最大内存量。要指定没有限制，请选择 **No minimum**（没有最小值）和/或 **No maximum**（没有最大值）。

   1. （可选）对于 **Additional instance attributes**（其它实例属性），您可以选择指定一个或多个属性以更详细地表达计算要求。每个额外属性都会进一步增加对您的请求的限制。

   1. （可选）展开**预览匹配的实例类型**以查看具有指定属性的实例类型。

   1. 在 **实例购买选项**下，对于 **实例分配**，指定要启动的按需型实例和竞价型实例在该组中所占的百分比。如果您的应用程序无状态、容错，并且可以处理中断的实例，则可以指定更高的竞价型实例百分比。

   1. （可选）如果您指定了一个竞价型实例百分比，请选中**包括按需型基本容量**旁边的复选框，然后指定按需型实例在自动扩缩组的最小初始容量中必须达到的数量。超出基本容量的任何内容都使用**百分比**来确定要启动多少按需实例和 Spot 实例。

   1. 在 **Allocation strategies**（分配策略）下，已为 **On-Demand allocation strategy**（按需分配策略）自动选择 **Lowest price**（最低价格），无法对其进行更改。

   1. 对于 **Spot allocation strategy**（竞价型分配策略），选择分配策略。默认情况下，将选择 **Price capacity optimized**（价格容量优化）。

   1. 对于**容量再平衡**，选择启用还是禁用容量再平衡。使用容量再平衡功能，以自动响应竞价型实例因竞价中断而即将终止的情况。有关更多信息，请参阅 [Auto Scaling 进行容量再平衡以替换存在风险的竞价型实例](ec2-auto-scaling-capacity-rebalancing.md)。

   1. 在 **Network** (网络) 下，对于 **VPC**，选择相应的 VPC。自动扩缩组必须与您在启动模板中指定的安全组创建在相同的 VPC 中。

   1. 对于 **Availability Zones and subnets** (可用区和子网)，选择指定 VPC 中的一个或多个子网。可以在多个可用区中使用子网以提供高可用性。有关更多信息，请参阅 [选择 VPC 子网时的注意事项](asg-in-vpc.md#as-vpc-considerations)。

   1. 选择**下一步**、**下一步**。

1. 对于 **Configure group size and scaling policies**（配置组大小和扩缩策略）步骤，请执行以下操作：

   1. 如果您希望以实例以外的其他单位来衡量所需容量，请为**组大小**、**所需容量类型**选择合适的选项。**支持单位**CPUs、**v** 和**内存 GiB**。默认情况下，Amazon EC2 Auto Scaling 指会定 **Units**（单位），这会用实例数量来衡量。

   1. 为自动扩缩组设置初始 **所需容量**。

   1. 在**扩展**部分的**扩展限制**下，如果**所需容量**的新值大于**所需的最小容量**和**最大所需容量**，则**所需的最大容量**将自动增加到新的所需容量值。您可以按需更改这些限制。有关更多信息，请参阅 [为自动扩缩组设置扩缩限制](asg-capacity-limits.md)。

1. 选择 **Skip to review** (跳转以查看)。

1. 在 **Review**（查看）页面上，选择 **Create Auto Scaling group**（创建 Auto Scaling 组）。

## 使用基于属性的实例类型选择创建一个混合实例组（AWS CLI）
<a name="attribute-based-instance-type-selection-aws-cli"></a>

**使用命令行创建一个混合实例组**  
使用以下命令之一：
+ [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) (AWS CLI)
+ [新-ASAuto ScalingGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/New-ASAutoScalingGroup.html) (AWS Tools for Windows PowerShell)

## 示例配置
<a name="attribute-based-instance-type-selection-example-configurations"></a>

要使用创建具有基于属性的实例类型选择的 Auto Scaling 组 AWS CLI，请使用以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令。

指定了以下实例属性：
+ `VCpuCount`— 实例类型必须最小为四 vCPUs，最大为八 v CPUs。
+ `MemoryMiB` – 实例类型的最小内存必须为 16384 MiB。
+ `CpuManufacturers` - 实例类型必须具有英特尔制造的 CPU。

### JSON
<a name="attribute-based-instance-type-selection-aws-cli-json"></a>

```
aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json
```

下面是一个 `config.json` 示例文件。

```
{
    "AutoScalingGroupName": "my-asg",
    "DesiredCapacityType": "units",
    "MixedInstancesPolicy": {
        "LaunchTemplate": {
            "LaunchTemplateSpecification": {
                "LaunchTemplateName": "my-launch-template",
                "Version": "$Default"
            },
            "Overrides": [{
                "InstanceRequirements": {
                    "VCpuCount": {"Min": 4, "Max": 8},
                    "MemoryMiB": {"Min": 16384},
                    "CpuManufacturers": ["intel"]
                }
            }]
        },
        "InstancesDistribution": {
            "OnDemandPercentageAboveBaseCapacity": 50,
            "SpotAllocationStrategy": "price-capacity-optimized"
        }
    },
    "MinSize": 0,
    "MaxSize": 100,
    "DesiredCapacity": 4,
    "DesiredCapacityType": "units",
    "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782"
}
```

要将所需容量的值设置为 v 数CPUs 或内存量，请在文件`"DesiredCapacityType": "memory-mib"`中指定`"DesiredCapacityType": "vcpu"`或。默认的所需容量类型为 `units`，它将所需容量的值设置为实例数。

### YAML
<a name="attribute-based-instance-type-selection-aws-cli-yaml"></a>

或者，您可以使用以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令创建 Auto Scaling 组。这将引用 YAML 文件作为自动扩缩组的唯一参数。

```
aws autoscaling create-auto-scaling-group --cli-input-yaml file://~/config.yaml
```

下面是一个 `config.yaml` 示例文件。

```
---
AutoScalingGroupName: my-asg
DesiredCapacityType: units
MixedInstancesPolicy:
  LaunchTemplate:
    LaunchTemplateSpecification:
      LaunchTemplateName: my-launch-template
      Version: $Default
    Overrides:
    - InstanceRequirements:
         VCpuCount:
           Min: 2
           Max: 4
         MemoryMiB:
           Min: 2048
         CpuManufacturers:
         - intel
  InstancesDistribution:
    OnDemandPercentageAboveBaseCapacity: 50
    SpotAllocationStrategy: price-capacity-optimized
MinSize: 0
MaxSize: 100
DesiredCapacity: 4
DesiredCapacityType: units
VPCZoneIdentifier: subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782
```

要将所需容量的值设置为 v 数CPUs 或内存量，请在文件`DesiredCapacityType: memory-mib`中指定`DesiredCapacityType: vcpu`或。默认的所需容量类型为 `units`，它将所需容量的值设置为实例数。

有关如何使用多个启动模板和基于属性的实例类型选择的示例，请参阅[使用多个启动模板](ec2-auto-scaling-mixed-instances-groups-launch-template-overrides.md)。

## 预览您的实例类型
<a name="attribute-based-instance-type-selection-preview"></a>

您可以预览符合计算要求的实例类型而无需启动它们，并在必要时调整要求。在 Amazon EC2 Auto Scaling 控制台中创建 Auto Scaling 组时，实例类型的预览将显示在 **Choose instance launch options**（选择实例启动选项）页面的 **Preview matching instance types**（预览匹配的实例类型）部分中。

或者，您可以使用 AWS CLI 或软件开发工具包调用 Amazon EC2 [GetInstanceTypesFromInstanceRequirements](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements.html)API 来预览实例类型。在请求中传递 `InstanceRequirements` 参数，其格式与用于创建或更新 Auto Scaling 组的格式一致。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[预览具有指定属性的实例类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html#ec2fleet-get-instance-types-from-instance-requirements)。

## 相关资源
<a name="attribute-based-instance-type-selection-related-resources"></a>

要了解有关基于属性的实例类型选择的更多信息，请参阅博客上的 EC2 A [uto Scaling 和 EC2 队列的基于属性的实例类型选择](https://aws.amazon.com/blogs/aws/new-attribute-based-instance-type-selection-for-ec2-auto-scaling-and-ec2-fleet/)。 AWS 

当您使用 CloudFormation创建一个自动缩放组时，您可以声明基于属性的实例类型选择。有关更多信息，请参阅 *CloudFormation 用户指南*中的 [自动扩缩模板片段](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-autoscaling.html#scenario-mixed-instances-group-template-examples)部分中的示例片段。

# 通过手动选择实例类型来创建混合实例组
<a name="create-mixed-instances-group-manual-instance-type-selection"></a>

本主题介绍如何通过手动选择实例类型在单个自动扩缩组中启动多种实例类型。

如果您希望使用实例属性作为选择实例类型的标准，请参阅 [使用基于属性的实例类型选择创建混合实例组](create-mixed-instances-group-attribute-based-instance-type-selection.md)。

**Topics**
+ [前提条件](#manual-instance-type-selection-prerequisites)
+ [创建混合实例组（控制台）](#manual-instance-type-selection-console)
+ [创建混合实例组 (AWS CLI)](#manual-instance-type-selection-aws-cli)
+ [示例配置](#manual-instance-type-selection-example-configurations)

## 前提条件
<a name="manual-instance-type-selection-prerequisites"></a>
+ 创建启动模板。有关更多信息，请参阅 [为 Auto Scaling 组创建启动模板](create-launch-template.md)。
+ 验证启动模板尚未请求竞价型实例。

## 创建混合实例组（控制台）
<a name="manual-instance-type-selection-console"></a>

使用以下过程创建混合实例组，手动选择您的组可以启动的实例类型。为了帮助您高效地完成这些步骤，我们跳过了一些可选部分。

要查看混合实例组的最佳实践，请参阅[创建混合实例组的设置概述](mixed-instances-groups-set-up-overview.md)。

**创建一个混合实例组**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 在屏幕顶部的导航栏中，选择在创建启动模板时使用的同一 AWS 区域 。

1. 选择**创建自动扩缩组**。

1. 在**选择启动模板或配置**页面上，对于**自动扩缩组名称**，输入自动扩缩组的名称。

1. 要选择启动模板，请执行以下操作：

   1. 对于**启动模板**，请选择现有启动模板。

   1. 对于 **Launch template version（启动模板版本）**，选择自动扩缩组在扩展时使用启动模板的默认版本、最新版本还是特定版本。

   1. 验证您的启动模板是否支持您计划使用的所有选项，然后选择 **Next**（下一步）。

1. 在**选择实例启动选项**页面上，执行以下操作：

   1. 对于 **Instance type requirements**（实例类型要求），选择 **Override launch template**（覆盖启动模板），然后选择 **Manually add instance types**（手动添加实例类型）。

   1. 选择您的实例类型。您可以使用我们的建议作为起点。默认情况下，将选择 **Family and generation flexible**（系列和世代灵活）。
      + 要更改实例类型的顺序，请使用箭头。如果您选择支持优先级排序的分配策略，则实例类型顺序将设置其启动优先级。
      + 要删除实例类型，请选择 **X**。
      + （可选）对于**权重**列中的方框，为每个实例类型分配一个相对权重。要执行此操作，请输入该类型的实例计入组所需容量的单元数量。如果实例类型提供不同的 vCPU、内存、存储或网络带宽功能，则执行此操作可能很有用。有关更多信息，请参阅 [配置自动扩缩组以使用实例权重](ec2-auto-scaling-mixed-instances-groups-instance-weighting.md)。

        请注意，如果您选择使用**大小灵活**建议，则属于本部分的所有实例类型都将自动获得权重值。如果您不想指定任何权重，则请清除 **Weight**（权重）列中所有实例类型的方框。

   1. 在 **Instance purchase options**（实例购买选项）下，对于 **Instances distribution**（实例分配），分别指定要启动的按需型实例和竞价型实例在该组中所占的百分比。如果您的应用程序无状态、容错，并且可以处理中断的实例，则可以指定更高的竞价型实例百分比。

   1. （可选）如果您指定了一个竞价型实例百分比，请选中**包括按需型基本容量**旁边的复选框，然后指定按需型实例在自动扩缩组的最小初始容量中必须达到的数量。超出基本容量的任何内容都使用**实例分配**设置来确定要启动多少按需实例和 Spot 实例。

   1. 在 **Allocation strategies** (分配策略) 下，对于 **On-Demand allocation strategy** (按需分配策略)，选择分配策略。当您手动选择实例类型时，默认情况下将选择 **Prioritized**（优先）。

   1. 对于 **Spot allocation strategy**（竞价型分配策略），选择分配策略。默认情况下，将选择 **Price capacity optimized**（价格容量优化）。

      如果您选择**容量优化**，则可以选择选中**确定实例类型的优先级**复选框，以便让 Amazon EC2 Auto Scaling 根据您的实例类型列出的顺序选择首先启动哪个实例类型。

   1. 对于**容量再平衡**，选择启用还是禁用容量再平衡。使用容量再平衡功能，以自动响应竞价型实例因竞价中断而即将终止的情况。有关更多信息，请参阅 [Auto Scaling 进行容量再平衡以替换存在风险的竞价型实例](ec2-auto-scaling-capacity-rebalancing.md)。

   1. 在 **Network** (网络) 下，对于 **VPC**，选择相应的 VPC。自动扩缩组必须与您在启动模板中指定的安全组创建在相同的 VPC 中。

   1. 对于 **Availability Zones and subnets** (可用区和子网)，选择指定 VPC 中的一个或多个子网。可以在多个可用区中使用子网以提供高可用性。有关更多信息，请参阅 [选择 VPC 子网时的注意事项](asg-in-vpc.md#as-vpc-considerations)。

   1. 选择**下一步**、**下一步**。

1. 对于 **Configure group size and scaling policies**（配置组大小和扩缩策略）步骤，请执行以下操作：

   1. 在**组大小**下，对于**所需容量**，请输入要启动的实例的初始数量。

      默认情况下，所需容量以实例数量表示。如果您为实例类型分配了权重，则必须将此值转换为用于分配权重的相同计量单位，例如 v 的数量CPUs。

   1. 在**扩展**部分的**扩展限制**下，如果**所需容量**的新值大于**所需的最小容量**和**最大所需容量**，则**所需的最大容量**将自动增加到新的所需容量值。您可以按需更改这些限制。有关更多信息，请参阅 [为自动扩缩组设置扩缩限制](asg-capacity-limits.md)。

1. 选择 **Skip to review** (跳转以查看)。

1. 在 **Review**（查看）页面上，选择 **Create Auto Scaling group**（创建 Auto Scaling 组）。

## 创建混合实例组 (AWS CLI)
<a name="manual-instance-type-selection-aws-cli"></a>

**使用命令行创建一个混合实例组**  
使用以下命令之一：
+ [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) (AWS CLI)
+ [新-ASAuto ScalingGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/New-ASAutoScalingGroup.html) (AWS Tools for Windows PowerShell)

## 示例配置
<a name="manual-instance-type-selection-example-configurations"></a>

以下示例配置显示如何使用不同的竞价分配策略创建混合实例组。

**注意**  
这些示例显示如何使用 JSON 或 YAML 格式的配置文件。如果使用 AWS CLI 版本 1，则必须指定 JSON 格式的配置文件。如果您使用 AWS CLI 版本 2，则可以指定格式为 YAML 或 JSON 的配置文件。

**Topics**
+ [示例 1：使用 `capacity-optimized` 分配策略启动竞价型实例](#capacity-optimized-aws-cli)
+ [示例 2：使用 `capacity-optimized-prioritized` 分配策略启动竞价型实例](#capacity-optimized-prioritized-aws-cli)
+ [示例 3：使用在两个池之间不同的 `lowest-price` 分配策略启动竞价型实例](#lowest-price-aws-cli)
+ [示例 4：使用 `price-capacity-optimized` 分配策略启动 Spot 实例](#price-capacity-optimized-aws-cli)

### 示例 1：使用 `capacity-optimized` 分配策略启动竞价型实例
<a name="capacity-optimized-aws-cli"></a>

以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令创建一个 Auto Scaling 组，该组指定了以下内容：
+ 作为按需型实例 (`0`) 启动的组的百分比以及以 (`1`) 开头的按需实例的基本数量。
+ 按优先级顺序（`c5.large`、`c5a.large`、`m5.large`、`m5a.large`、`c4.large`、`m4.large`、`c3.large`、`m3.large`）启动的实例类型。
+ 要在其中启动实例的子网（`subnet-5ea0c127`、`subnet-6194ea3b`、`subnet-c934b782`）。每个子网都对应不同的可用区。
+ 启动模板 (`my-launch-template`) 和启动模板版本 (`$Default`)。

Amazon EC2 Auto Scaling 尝试满足您的按需容量时，它会首先启动 `c5.large` 实例类型。竞价型实例来自每个可用区中基于竞价型实例容量的最佳竞价池。

#### JSON
<a name="capacity-optimized-aws-cli-json"></a>

```
aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json
```

`config.json` 文件包含以下代码。

```
{
    "AutoScalingGroupName": "my-asg",
    "MixedInstancesPolicy": {
        "LaunchTemplate": {
            "LaunchTemplateSpecification": {
                "LaunchTemplateName": "my-launch-template",
                "Version": "$Default"
            },
            "Overrides": [
                {
                    "InstanceType": "c5.large"
                },
                {
                    "InstanceType": "c5a.large"
                },
                {
                    "InstanceType": "m5.large"
                },
                {
                    "InstanceType": "m5a.large"
                },
                {
                    "InstanceType": "c4.large"
                },
                {
                    "InstanceType": "m4.large"
                },
                {
                    "InstanceType": "c3.large"
                },
                {
                    "InstanceType": "m3.large"
                }
            ]
        },
        "InstancesDistribution": {
            "OnDemandBaseCapacity": 1,
            "OnDemandPercentageAboveBaseCapacity": 0,
            "SpotAllocationStrategy": "capacity-optimized"
        }
    },
    "MinSize": 1,
    "MaxSize": 5,
    "DesiredCapacity": 3,
    "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782"
}
```

#### YAML
<a name="capacity-optimized-aws-cli-yaml"></a>

或者，您可以使用以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令创建 Auto Scaling 组。这将引用 YAML 文件作为自动扩缩组的唯一参数。

```
aws autoscaling create-auto-scaling-group --cli-input-yaml file://~/config.yaml
```

`config.yaml` 文件包含以下内容。

```
---
AutoScalingGroupName: my-asg
MixedInstancesPolicy:
  LaunchTemplate:
    LaunchTemplateSpecification:
      LaunchTemplateName: my-launch-template
      Version: $Default
    Overrides:
    - InstanceType: c5.large
    - InstanceType: c5a.large
    - InstanceType: m5.large
    - InstanceType: m5a.large
    - InstanceType: c4.large
    - InstanceType: m4.large
    - InstanceType: c3.large
    - InstanceType: m3.large
  InstancesDistribution:
    OnDemandBaseCapacity: 1
    OnDemandPercentageAboveBaseCapacity: 0
    SpotAllocationStrategy: capacity-optimized
MinSize: 1
MaxSize: 5
DesiredCapacity: 3
VPCZoneIdentifier: subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782
```

### 示例 2：使用 `capacity-optimized-prioritized` 分配策略启动竞价型实例
<a name="capacity-optimized-prioritized-aws-cli"></a>

以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令创建一个 Auto Scaling 组，该组指定了以下内容：
+ 作为按需型实例 (`0`) 启动的组的百分比以及以 (`1`) 开头的按需实例的基本数量。
+ 按优先级顺序（`c5.large`、`c5a.large`、`m5.large`、`m5a.large`、`c4.large`、`m4.large`、`c3.large`、`m3.large`）启动的实例类型。
+ 要在其中启动实例的子网（`subnet-5ea0c127`、`subnet-6194ea3b`、`subnet-c934b782`）。每个子网都对应不同的可用区。
+ 启动模板 (`my-launch-template`) 和启动模板版本 (`$Latest`)。

Amazon EC2 Auto Scaling 尝试满足您的按需容量时，它会首先启动 `c5.large` 实例类型。当 Amazon EC2 Auto Scaling 尝试满足您的竞价容量时，它会尽最大努力遵守实例类型优先级。但它首先会针对容量进行优化。

#### JSON
<a name="capacity-optimized-prioritized-aws-cli-json"></a>

```
aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json
```

`config.json` 文件包含以下代码。

```
{
    "AutoScalingGroupName": "my-asg",
    "MixedInstancesPolicy": {
        "LaunchTemplate": {
            "LaunchTemplateSpecification": {
                "LaunchTemplateName": "my-launch-template",
                "Version": "$Latest"
            },
            "Overrides": [
                {
                    "InstanceType": "c5.large"
                },
                {
                    "InstanceType": "c5a.large"
                },
                {
                    "InstanceType": "m5.large"
                },
                {
                    "InstanceType": "m5a.large"
                },
                {
                    "InstanceType": "c4.large"
                },
                {
                    "InstanceType": "m4.large"
                },
                {
                    "InstanceType": "c3.large"
                },
                {
                    "InstanceType": "m3.large"
                }
            ]
        },
        "InstancesDistribution": {
            "OnDemandBaseCapacity": 1,
            "OnDemandPercentageAboveBaseCapacity": 0,
            "SpotAllocationStrategy": "capacity-optimized-prioritized"
        }
    },
    "MinSize": 1,
    "MaxSize": 5,
    "DesiredCapacity": 3,
    "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782"
}
```

#### YAML
<a name="capacity-optimized-prioritized-aws-cli-yaml"></a>

或者，您可以使用以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令创建 Auto Scaling 组。这将引用 YAML 文件作为自动扩缩组的唯一参数。

```
aws autoscaling create-auto-scaling-group --cli-input-yaml file://~/config.yaml
```

`config.yaml` 文件包含以下内容。

```
---
AutoScalingGroupName: my-asg
MixedInstancesPolicy:
  LaunchTemplate:
    LaunchTemplateSpecification:
      LaunchTemplateName: my-launch-template
      Version: $Default
    Overrides:
    - InstanceType: c5.large
    - InstanceType: c5a.large
    - InstanceType: m5.large
    - InstanceType: m5a.large
    - InstanceType: c4.large
    - InstanceType: m4.large
    - InstanceType: c3.large
    - InstanceType: m3.large
  InstancesDistribution:
    OnDemandBaseCapacity: 1
    OnDemandPercentageAboveBaseCapacity: 0
    SpotAllocationStrategy: capacity-optimized-prioritized
MinSize: 1
MaxSize: 5
DesiredCapacity: 3
VPCZoneIdentifier: subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782
```

### 示例 3：使用在两个池之间不同的 `lowest-price` 分配策略启动竞价型实例
<a name="lowest-price-aws-cli"></a>

以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令创建一个 Auto Scaling 组，该组指定了以下内容：
+ 作为按需实例启动的组的百分比 (`50`)。（这不会指定要开始使用的按需型实例的基本数量。）
+ 按优先级顺序（`c5.large`、`c5a.large`、`m5.large`、`m5a.large`、`c4.large`、`m4.large`、`c3.large`、`m3.large`）启动的实例类型。
+ 要在其中启动实例的子网（`subnet-5ea0c127`、`subnet-6194ea3b`、`subnet-c934b782`）。每个子网都对应不同的可用区。
+ 启动模板 (`my-launch-template`) 和启动模板版本 (`$Latest`)。

Amazon EC2 Auto Scaling 尝试满足您的按需容量时，它会首先启动 `c5.large` 实例类型。对于您的竞价容量，Amazon EC2 Auto Scaling 尝试在每个可用区中的两个价格最低的池中平均启动竞价型实例。

#### JSON
<a name="lowest-price-aws-cli-json"></a>

```
aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json
```

`config.json` 文件包含以下代码。

```
{
    "AutoScalingGroupName": "my-asg",
    "MixedInstancesPolicy": {
        "LaunchTemplate": {
            "LaunchTemplateSpecification": {
                "LaunchTemplateName": "my-launch-template",
                "Version": "$Latest"
            },
            "Overrides": [
                {
                    "InstanceType": "c5.large"
                },
                {
                    "InstanceType": "c5a.large"
                },
                {
                    "InstanceType": "m5.large"
                },
                {
                    "InstanceType": "m5a.large"
                },
                {
                    "InstanceType": "c4.large"
                },
                {
                    "InstanceType": "m4.large"
                },
                {
                    "InstanceType": "c3.large"
                },
                {
                    "InstanceType": "m3.large"
                }
            ]
        },
        "InstancesDistribution": {
            "OnDemandPercentageAboveBaseCapacity": 50,
            "SpotAllocationStrategy": "lowest-price",
            "SpotInstancePools": 2
        }
    },
    "MinSize": 1,
    "MaxSize": 5,
    "DesiredCapacity": 3,
    "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782"
}
```

#### YAML
<a name="lowest-price-aws-cli-yaml"></a>

或者，您可以使用以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令创建 Auto Scaling 组。这将引用 YAML 文件作为自动扩缩组的唯一参数。

```
aws autoscaling create-auto-scaling-group --cli-input-yaml file://~/config.yaml
```

`config.yaml` 文件包含以下内容。

```
---
AutoScalingGroupName: my-asg
MixedInstancesPolicy:
  LaunchTemplate:
    LaunchTemplateSpecification:
      LaunchTemplateName: my-launch-template
      Version: $Default
    Overrides:
    - InstanceType: c5.large
    - InstanceType: c5a.large
    - InstanceType: m5.large
    - InstanceType: m5a.large
    - InstanceType: c4.large
    - InstanceType: m4.large
    - InstanceType: c3.large
    - InstanceType: m3.large
  InstancesDistribution:
    OnDemandPercentageAboveBaseCapacity: 50
    SpotAllocationStrategy: lowest-price
    SpotInstancePools: 2
MinSize: 1
MaxSize: 5
DesiredCapacity: 3
VPCZoneIdentifier: subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782
```

### 示例 4：使用 `price-capacity-optimized` 分配策略启动 Spot 实例
<a name="price-capacity-optimized-aws-cli"></a>

以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令创建一个 Auto Scaling 组，该组指定了以下内容：
+ 作为按需实例启动的组的百分比 (`30`)。（这不会指定要开始使用的按需型实例的基本数量。）
+ 按优先级顺序（`c5.large`、`c5a.large`、`m5.large`、`m5a.large`、`c4.large`、`m4.large`、`c3.large`、`m3.large`）启动的实例类型。
+ 要在其中启动实例的子网（`subnet-5ea0c127`、`subnet-6194ea3b`、`subnet-c934b782`）。每个子网都对应不同的可用区。
+ 启动模板 (`my-launch-template`) 和启动模板版本 (`$Latest`)。

Amazon EC2 Auto Scaling 尝试满足您的按需容量时，它会首先启动 `c5.large` 实例类型。对于您的竞价型容量，Amazon EC2 Auto Scaling 将尝试从竞价型实例池启动竞价型实例，这些竞价型实例池不仅具有尽可能低的价格，对于正在启动的实例数量而言还具有最佳容量。

#### JSON
<a name="price-capacity-optimized-aws-cli-json"></a>

```
aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json
```

`config.json` 文件包含以下代码。

```
{
    "AutoScalingGroupName": "my-asg",
    "MixedInstancesPolicy": {
        "LaunchTemplate": {
            "LaunchTemplateSpecification": {
                "LaunchTemplateName": "my-launch-template",
                "Version": "$Latest"
            },
            "Overrides": [
                {
                    "InstanceType": "c5.large"
                },
                {
                    "InstanceType": "c5a.large"
                },
                {
                    "InstanceType": "m5.large"
                },
                {
                    "InstanceType": "m5a.large"
                },
                {
                    "InstanceType": "c4.large"
                },
                {
                    "InstanceType": "m4.large"
                },
                {
                    "InstanceType": "c3.large"
                },
                {
                    "InstanceType": "m3.large"
                }
            ]
        },
        "InstancesDistribution": {
            "OnDemandPercentageAboveBaseCapacity": 30,
            "SpotAllocationStrategy": "price-capacity-optimized"
        }
    },
    "MinSize": 1,
    "MaxSize": 5,
    "DesiredCapacity": 3,
    "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782"
}
```

#### YAML
<a name="price-capacity-optimized-aws-cli-yaml"></a>

或者，您可以使用以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令创建 Auto Scaling 组。这将引用 YAML 文件作为自动扩缩组的唯一参数。

```
aws autoscaling create-auto-scaling-group --cli-input-yaml file://~/config.yaml
```

`config.yaml` 文件包含以下内容。

```
---
AutoScalingGroupName: my-asg
MixedInstancesPolicy:
  LaunchTemplate:
    LaunchTemplateSpecification:
      LaunchTemplateName: my-launch-template
      Version: $Default
    Overrides:
    - InstanceType: c5.large
    - InstanceType: c5a.large
    - InstanceType: m5.large
    - InstanceType: m5a.large
    - InstanceType: c4.large
    - InstanceType: m4.large
    - InstanceType: c3.large
    - InstanceType: m3.large
  InstancesDistribution:
    OnDemandPercentageAboveBaseCapacity: 30
    SpotAllocationStrategy: price-capacity-optimized
MinSize: 1
MaxSize: 5
DesiredCapacity: 3
VPCZoneIdentifier: subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782
```

# 配置自动扩缩组以使用实例权重
<a name="ec2-auto-scaling-mixed-instances-groups-instance-weighting"></a>

当您使用多种实例类型时，可以指定与每种实例类型关联的单位数量，然后使用相同的度量单位来指定组的容量。此容量规格选项称为权重。

例如，假设您运行的计算密集型应用程序在至少有 8 v CPUs 和 15 GiB 的 RAM 时性能最佳。如果您使用 `c5.2xlarge` 作为基本单元，以下任何 EC2 实例类型都将满足您的应用程序需求。


**实例类型示例**  

| 实例类型 | vCPU | 内存（GiB） | 
| --- | --- | --- | 
| c5.2xlarge  |  8  | 16 | 
| c5.4xlarge | 16 | 32 | 
| c5.12xlarge | 48 | 96 | 
| c5.18xlarge  | 72 | 144 | 
| c5.24xlarge | 96 | 192 | 

默认情况下，无论大小如何，所有实例类型的权重都相同。换句话说，无论 Amazon EC2 Auto Scaling 启动大型还是小型实例类型，每个实例都会计入自动扩缩组的所需容量。

但是，通过权重，您可以分配一个数值，该值指定与每种实例类型关联的单位数量。例如，如果实例大小不相同，`c5.2xlarge` 实例的权重可能为 2，而 `c5.4xlarge`（大两倍）的权重可能为 4，依此类推。然后，在 Amazon EC2 Auto Scaling 扩展组时，这些权重将转换为每个实例计入您所需容量中的单位数量。

权重不会更改 Amazon EC2 Auto Scaling 选择启动的实例类型；而是分配策略会做到这一点。有关更多信息，请参阅 [多种实例类型的分配策略](allocation-strategies.md)。

**重要**  
要使用 v 的数量CPUs 或每种实例类型的内存量配置 Auto Scaling 组以满足其所需容量，我们建议使用基于属性的实例类型选择。设置 `DesiredCapacityType` 参数会根据您为此参数设置的值自动指定与每种实例类型关联的单位数量。有关更多信息，请参阅 [使用基于属性的实例类型选择创建混合实例组](create-mixed-instances-group-attribute-based-instance-type-selection.md)。

**Topics**
+ [注意事项](#weights-considerations)
+ [实例权重行为](#instance-weighting-behaviors)
+ [配置自动扩缩组以使用权重](configue-auto-scaling-group-to-use-weights.md)
+ [每单位小时 Spot 价格示例](weights-spot-price-per-unit-hour-example.md)

## 注意事项
<a name="weights-considerations"></a>

本节讨论有效实施权重的关键注意事项。
+ 选择几种符合应用程序性能需求的实例类型。根据每种实例类型的功能，确定其应计入自动扩缩组所需容量的权重。这些权重应用于当前和未来实例。
+ 避免权重之间的差距过大。例如，当下一个较大的实例类型的权重为 200 时，不要将实例类型的权重指定为 1。此外，最小权重和最大权重之间的差异不能太极端。过大的权重差异会对性价比优化产生负面影响。
+ 以单位（而不是实例数）指定组的所需容量。例如，如果使用基于 vCPU 的权重，请设置所需核心数以及最小核心数和最大核心数。
+ 设置权重和所需容量，使所需容量至少比最大权重大两到三倍。

更新现有群组时请注意以下几点：
+ 向现有组添加权重时，应包括当前正在使用的所有实例类型的权重。
+ 添加或更改权重时，Amazon EC2 Auto Scaling 将根据新权重值启动或终止实例以达到所需容量。
+ 如果您删除了实例类型，则该类型正在运行的实例将保留其上次权重，即使不再定义。

## 实例权重行为
<a name="instance-weighting-behaviors"></a>

当您使用实例权重时，Amazon EC2 Auto Scaling 的行为方式如下：
+ 当前容量等于或高于所需容量。如果启动的实例超出剩余的所需容量单位，则当前容量可能会超过所需容量。例如，假设您指定了两个实例类型 `c5.2xlarge` 和 `c5.12xlarge`，并且您为 `c5.2xlarge` 分配了实例权重 2，为 `c5.12xlarge` 分配了实例权重 12。如果还剩 5 个单位才能实现所需容量，Amazon EC2 Auto Scaling 会预配置 `c5.12xlarge`，所需容量将超过 7 个单位。
+ 启动实例时，Amazon EC2 Auto Scaling 优先考虑在可用区之间分配容量并遵守分配策略，而不是超出所需容量。
+ 使用您的首选分配策略，Amazon EC2 Auto Scaling 可以超出最大容量限制，以便在可用区之间保持平衡。Amazon EC2 Auto Scaling 强制执行的硬性限制为所需容量加上最大权重。

# 配置自动扩缩组以使用权重
<a name="configue-auto-scaling-group-to-use-weights"></a>

您可以将自动扩缩组配置为使用权重，如以下 AWS CLI 示例所示。有关如何使用控制台的说明，请参阅[通过手动选择实例类型来创建混合实例组](create-mixed-instances-group-manual-instance-type-selection.md)。

**配置新自动扩缩组以使用权重 (AWS CLI)**  
使用 [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) 命令。例如，以下命令创建一个新的自动扩缩组，并通过指定以下内容分配权重：
+ 作为按需实例启动的组的百分比 (`0`) 
+ 每个可用区中竞价型实例的分配策略(`capacity-optimized`)。
+ 按优先级顺序启动（`m4.16xlarge`、`m5.24xlarge`）的实例类型
+ 实例权重对应于实例类型 (`16`,CPUs) 之间的相对大小差 (v`24`)
+ 要在其中启动实例的子网（`subnet-5ea0c127`、`subnet-6194ea3b`、`subnet-c934b782`），每个子网对应于不同的可用区
+ 启动模板 (`my-launch-template`) 和启动模板版本 (`$Latest`)

```
aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json
```

`config.json` 文件包含以下代码。

```
{
    "AutoScalingGroupName": "my-asg",
    "MixedInstancesPolicy": {
        "LaunchTemplate": {
            "LaunchTemplateSpecification": {
                "LaunchTemplateName": "my-launch-template",
                "Version": "$Latest"
            },
            "Overrides": [
                {
                    "InstanceType": "m4.16xlarge",
                    "WeightedCapacity": "16"
                },
                {
                    "InstanceType": "m5.24xlarge",
                    "WeightedCapacity": "24"
                }
            ]
        },
        "InstancesDistribution": {
            "OnDemandPercentageAboveBaseCapacity": 0,
            "SpotAllocationStrategy": "capacity-optimized"
        }
    },
    "MinSize": 160,
    "MaxSize": 720,
    "DesiredCapacity": 480,
    "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782",
    "Tags": []
}
```

**配置现有自动扩缩组以使用权重 (AWS CLI)**  
使用 [update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html) 命令。例如，以下命令通过指定以下内容向现有自动扩缩组中的实例类型分配权重：
+ 按优先级顺序启动（`c5.18xlarge`、`c5.24xlarge`、`c5.2xlarge`、`c5.4xlarge`）的实例类型
+ 实例权重对应于实例类型 (`18`、、`24``2`、CPUs) 之间的相对大小差 (v`4`)
+ 新增加的所需容量，大于最大权重

```
aws autoscaling update-auto-scaling-group --cli-input-json file://~/config.json
```

`config.json` 文件包含以下代码。

```
{
    "AutoScalingGroupName": "my-existing-asg",
    "MixedInstancesPolicy": {
        "LaunchTemplate": {
            "Overrides": [
                {
                    "InstanceType": "c5.18xlarge",
                    "WeightedCapacity": "18"
                },
                {
                    "InstanceType": "c5.24xlarge",
                    "WeightedCapacity": "24"
                },
                {
                    "InstanceType": "c5.2xlarge",
                    "WeightedCapacity": "2"
                },
                {
                    "InstanceType": "c5.4xlarge",
                    "WeightedCapacity": "4"
                }
            ]
        }
    },
    "MinSize": 0,
    "MaxSize": 100,
    "DesiredCapacity": 100
}
```

**使用命令行验证权重**  
使用以下命令之一：
+ [describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html) (AWS CLI)
+ [获取-ASAuto ScalingGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-ASAutoScalingGroup.html) (AWS Tools for Windows PowerShell)

# 每单位小时 Spot 价格示例
<a name="weights-spot-price-per-unit-hour-example"></a>

下表比较美国东部（弗吉尼亚州北部）不同可用区中竞价型实例的每小时价格和同一区域中按需型实例的价格。显示的价格是示例定价，而不是当前定价。这些价格是您*每实例小时*的成本。


**示例：每实例小时的竞价定价**  

| 实例类型 | us–east–1a | us–east–1b | us–east–1c | 按需定价 | 
| --- | --- | --- | --- | --- | 
| c5.2xlarge  | 0.180 USD | 0.191 USD | 0.170 USD | 0.34 USD  | 
| c5.4xlarge | 0.341 USD | 0.361 USD | 0.318 USD | 0.68 USD | 
| c5.12xlarge  | 0.779 USD | 0.777 USD  | 0.777 USD  | 2.04 USD | 
| c5.18xlarge  | 1.207 USD | 1.475 USD | 1.357 USD | 3.06 USD | 
| c5.24xlarge | 1.555 USD | 1.555 USD | 1.555 USD | 4.08 USD | 

通过实例权重，您可以根据*每单位小时*的使用量来评估您的成本。您可以将某种实例类型的价格除以它表示的单位数来确定每单位小时价格。对于按需实例，部署一个实例类型时的每单位小时 价格与部署不同大小的相同实例类型时的价格相同。但是，相比之下，每单位小时 的 Spot 价格因竞价池而异。

以下示例显示了如何使用实例权重计算每单位小时竞价价格。为便于计算，假定您只想启动 `us-east-1a` 中的竞价型实例。下表列出了每单位小时的价格。


**示例：每单位小时 Spot 价格**  

| 实例类型 | us–east–1a | 实例权重 | 每单位小时价格  | 
| --- | --- | --- | --- | 
| c5.2xlarge  | 0.180 USD | 2 | 0.090 USD | 
| c5.4xlarge | 0.341 USD | 4 | 0.085 USD | 
| c5.12xlarge  | 0.779 USD | 12 | 0.065 USD | 
| c5.18xlarge  | 1.207 USD | 18 | 0.067 USD | 
| c5.24xlarge | 1.555 USD | 24 | 0.065 USD | 

# 使用多个启动模板
<a name="ec2-auto-scaling-mixed-instances-groups-launch-template-overrides"></a>

除了使用多种实例类型外，您还可以使用多种启动模板。

例如，假设您为计算密集型应用程序配置自动扩缩组，并希望混合 C5、C5a 和 C6g 实例类型。但是，C6g 实例采用基于 64 位 A AWS rm 架构的 Graviton 处理器，而 C5 和 C5a 实例则在 64 位英特尔 x86 处理器上运行。 AMIs 适用于 C5 和 C5a 的实例都适用于其中的每一个实例，但不能在 C6g 实例上运行。要解决此问题，请对 C6g 实例使用不同的启动模板。您仍然可以对 C5 和 C5a 实例使用相同的启动模板。

本节包含使用执行与 AWS CLI 使用多个启动模板相关的任务的过程。目前，仅当您使用 AWS CLI 或 SDK 时此功能才可用，并且不可从控制台使用。

**Topics**
+ [配置自动扩缩组以使用多个启动模板](#configue-auto-scaling-group-to-use-multiple-launch-templates)
+ [相关资源](#multiple-launch-templates-related-resources)

## 配置自动扩缩组以使用多个启动模板
<a name="configue-auto-scaling-group-to-use-multiple-launch-templates"></a>

您可以将自动扩缩组配置为使用多个启动模板，如以下示例所示。

**要将新的自动扩缩组配置为使用多个启动模板 (AWS CLI)**  
使用 [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) 命令。例如，以下命令将创建一个新的自动扩缩组。它指定 `c5.large`、`c5a.large` 和 `c6g.large` 实例类型，并为 `c6g.large` 实例类型定义新的启动模板，以确保使用适当的 AMI 启动 Arm 实例。Amazon EC2 Auto Scaling 使用实例类型顺序确定在满足按需容量时应首先使用哪一实例类型。

```
aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json
```

`config.json` 文件包含以下代码。

```
{
  "AutoScalingGroupName":"my-asg",
  "MixedInstancesPolicy":{
    "LaunchTemplate":{
      "LaunchTemplateSpecification":{
        "LaunchTemplateName":"my-launch-template-for-x86",
        "Version":"$Latest"
      },
      "Overrides":[
        {
          "InstanceType":"c6g.large",
          "LaunchTemplateSpecification": {
            "LaunchTemplateName": "my-launch-template-for-arm",
            "Version": "$Latest"
          }
        },
        {
          "InstanceType":"c5.large"
        },
        {
          "InstanceType":"c5a.large"
        }
      ]
    },
    "InstancesDistribution":{
      "OnDemandBaseCapacity": 1,
      "OnDemandPercentageAboveBaseCapacity": 50,
      "SpotAllocationStrategy": "capacity-optimized"
    }
  },
  "MinSize":1,
  "MaxSize":5,
  "DesiredCapacity":3,
  "VPCZoneIdentifier":"subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782",
  "Tags":[ ]
}
```

**将现有自动扩缩组配置为使用多个启动模板 (AWS CLI)**  
使用 [update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html) 命令。例如，以下命令将名为 `my-launch-template-for-arm` 的自动扩缩组的 `c6g.large` 实例类型分配名为 *`my-asg`* 的启动模板。

```
aws autoscaling update-auto-scaling-group --cli-input-json file://~/config.json
```

`config.json` 文件包含以下内容。

```
{
  "AutoScalingGroupName":"my-asg",
  "MixedInstancesPolicy":{
    "LaunchTemplate":{
      "Overrides":[
        {
          "InstanceType":"c6g.large",
          "LaunchTemplateSpecification": {
            "LaunchTemplateName": "my-launch-template-for-arm",
            "Version": "$Latest"
          }
        },
        {
          "InstanceType":"c5.large"
        },
        {
          "InstanceType":"c5a.large"
        }
      ]
    }
  }
}
```

**将新的自动扩缩组配置为使用多个启动模板和基于属性的实例类型选择（AWS CLI）**  
使用 [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) 命令。例如，以下命令通过为带有 ARM AMI 的 AWS Graviton 实例指定启动模板以及为具有 x86 AMI 的 AMD 或英特尔实例指定其他启动模板来创建新的 Auto Scaling 组。然后，该命令两次使用[基于属性的实例选择](create-mixed-instances-group-attribute-based-instance-type-selection.md)，从多种实例类型中为每个 CPU 架构选择实例。您可以使用[update-autoscaling-group](https://docs.aws.amazon.com/cli/latest/reference/autoscaling/update-auto-scaling-group.html)命令向现有 Auto Scaling 组添加类似的配置。

```
aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json
```

`config.json` 文件包含以下内容。

```
{
  "AutoScalingGroupName":"my-asg",
  "MixedInstancesPolicy":{
    "LaunchTemplate":{
      "LaunchTemplateSpecification":{
        "LaunchTemplateName":"my-launch-template-for-arm",
        "Version":"$Latest"
      },
      "Overrides":[
        {
          "InstanceRequirements": {
            "VCpuCount": {"Min": 2},
            "MemoryMiB": {"Min": 2048},
            "CpuManufacturers": ["amazon-web-services"]
          }
         },
         {
           "InstanceRequirements": {
            "VCpuCount": {"Min": 2},
            "MemoryMiB": {"Min": 2048},
            "CpuManufacturers": ["intel", "amd"]
          },
          "LaunchTemplateSpecification": {
            "LaunchTemplateName": "my-launch-template-for-x86",
            "Version": "$Latest"
          }
         }
      ]
    },
    "InstancesDistribution":{
      "OnDemandPercentageAboveBaseCapacity": 0, 
      "SpotAllocationStrategy": "price-capacity-optimized"
    }
  },
  "MinSize":1,
  "MaxSize":10,
  "DesiredCapacity":6,
  "VPCZoneIdentifier":"subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782",
  "Tags":[ ]
}
```

**验证 Auto Scaling 组的启动模板**  
使用以下命令之一：
+ [describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html) (AWS CLI)
+ [获取-ASAuto ScalingGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-ASAutoScalingGroup.html) (AWS Tools for Windows PowerShell)

## 相关资源
<a name="multiple-launch-templates-related-resources"></a>

[你可以在 re: Post 的模板中找到使用基于属性的实例类型选择来指定多个启动 CloudFormation 模板的示例。AWS](https://repost.aws/articles/ARQeKDQX68TcqipYaaisl6bA/cloudformation-auto-scaling-group-sample-template-for-mixed-x86-intel-amd-and-aws-graviton-instances)

# 使用启动配置创建自动扩缩组
<a name="create-auto-scaling-groups-launch-configuration"></a>

**重要**  
限制：  
自 **2023 年 1 月 1 日起**，启动配置已不再支持新的 Amazon EC2 实例类型。这包括支持在初始区域启动 AWS 区域 后添加到中的任何实例类型。
**2023 年 6 月 1 日**当天或之后创建的账户无法使用控制台创建新启动配置。
**2024 年 10 月 1 日**当天或之后创建的账户无法使用任何方法（控制台 AWS CLI、API 或 CloudFormation）创建新的启动配置。
 迁移到启动模板以确保您现在或将来都不需要创建新的启动配置。有关为自动扩缩组创建启动模板的更多信息，请参阅 [将自动扩缩组迁移到启动模板](migrate-to-launch-templates.md)。

如果您已经创建了启动配置或 EC2 实例，则可以创建一个自动扩缩组，将启动配置用作其 EC2 实例的配置模板。启动配置可以为实例指定一些信息，例如，AMI ID、实例类型、密钥对、安全组和块储存设备映射。有关创建启动配置的信息，请参阅[创建启动配置](create-launch-config.md)。

您必须具有足够的权限来创建自动扩缩组。您还必须具有足够的权限来创建服务相关角色，以便 Amazon EC2 Auto Scaling 在该角色还不存在的情况下用它来代表您执行操作。有关管理员在向您授予权限时可参考的 IAM policy 示例，请参阅 [基于身份的策略示例](security_iam_id-based-policy-examples.md)。

**Topics**
+ [使用启动配置创建 Auto Scaling 组](create-asg-launch-configuration.md)
+ [使用现有实例创建 Auto Scaling 组 AWS CLI](create-asg-from-instance.md)

# 使用启动配置创建 Auto Scaling 组
<a name="create-asg-launch-configuration"></a>

**重要**  
我们为尚未从启动配置迁移到启动模板的客户提供有关启动配置的信息。有关为自动扩缩组创建启动模板的更多信息，请参阅 [将自动扩缩组迁移到启动模板](migrate-to-launch-templates.md)。

在创建 Auto Scaling 组时，您必须指定配置 Amazon EC2 实例所需的信息、实例的可用区和 VPC 子网、所需容量以及最小和最大容量限制。

以下过程演示如何使用启动配置创建 Auto Scaling 组。您无法在创建启动配置后进行修改，但可以替换 Auto Scaling 组的启动配置。有关更多信息，请参阅 [更改 Auto Scaling 组的启动配置](change-launch-config.md)。

**先决条件**
+ 您必须已创建启动配置。有关更多信息，请参阅 [创建启动配置](create-launch-config.md)。

**使用启动配置创建 Auto Scaling 组（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 在屏幕顶部的导航栏上，选择与创建启动配置时相同的 AWS 区域 配置。

1. 选择**创建自动扩缩组**。

1. 在**选择启动模板或配置**页面上，对于 **Auto Scaling 组名称**，输入 Auto Scaling 组的名称。

1. 要选择启动配置，请执行以下操作：

   1. 对于 **Launch Template** (启动模板)，选择 **Switch to launch configuration** (切换以启动配置)。

   1. 对于 **Launch configuration (启动配置)**，请选择现有启动配置。

   1. 验证您的启动配置是否支持您计划使用的所有选项，然后选择 **Next (下一步)**。

1. 在**配置实例启动选项**页面的**网络**下方，对于 **VPC**，选择相应的 VPC。必须在您于启动配置中指定的安全组所在的 VPC 中创建 Auto Scaling 组。

1. 对于**可用区和子网**，选择指定 VPC 中的一个或多个子网。可以在多个可用区中使用子网以提供高可用性。有关更多信息，请参阅 [选择 VPC 子网时的注意事项](asg-in-vpc.md#as-vpc-considerations)。

1. 选择**下一步**。

   或者，您可接受其余默认值，然后选择 **Skip to review** (跳到审核)。

1. （可选）在 **Configure advanced options（配置高级选项）**页面上，配置以下选项，然后选择 **Next（下一步）**：

   1. （可选）对于**运行状况检查**、**其他运行状况检查类型**，选择**开启 Amazon EBS 运行状况检查**。有关更多信息，请参阅 [使用运行状况检查监控具有受损 Amazon EBS 卷的 Auto Scaling 实例](monitor-and-replace-instances-with-impaired-ebs-volumes.md)。

   1. （可选）对于**运行状况检查宽限期**，输入时间长短（以秒为单位）。此时间是 Amazon EC2 Auto Scaling 在实例进入 `InService` 状态后需要等待完成实例运行状况检查的时间。有关更多信息，请参阅 [设置自动扩缩组的运行状况检查宽限期](health-check-grace-period.md)。

   1. 在 **“其他设置”** 下的 “**监控**” 下，选择是否启用 CloudWatch 群组指标收集。这些指标提供的测量值可以指示潜在的问题，例如终止实例的数量或挂起实例的数量。有关更多信息，请参阅 [CloudWatch 监控您的 Auto Scaling 组和实例的指标](ec2-auto-scaling-cloudwatch-monitoring.md)。

   1. 对于**启用默认实例预热**，选择此选项并选择应用程序的预热时间。如果您正在创建具有扩展策略的 Auto Scaling 组，则默认实例预热功能会改进用于动态扩展的 Amazon CloudWatch 指标。有关更多信息，请参阅 [为 Auto Scaling 组设置原定设置实例预热](ec2-auto-scaling-default-instance-warmup.md)。

1. （可选）在 **Configure group size and scaling policies** (配置组大小和扩展策略) 页面上，配置以下选项，然后选择 **Next** (下一步)：

   1. 在**组大小**下，对于**所需容量**，请输入要启动的实例的初始数量。

   1. 在**扩展**部分的**扩展限制**下，如果**所需容量**的新值大于**所需的最小容量**和**最大所需容量**，则**所需的最大容量**将自动增加到新的所需容量值。您可以按需更改这些限制。有关更多信息，请参阅 [为自动扩缩组设置扩缩限制](asg-capacity-limits.md)。

   1. 对于**自动扩缩**，请选择是否要创建目标跟踪扩展策略。您也可以在创建自动扩缩组后再创建此策略。

      如果您选择**目标跟踪扩展策略**，请按照 [创建目标跟踪扩缩策略](policy_creating.md) 中的说明创建策略。

   1. 对于**实例维护策略**，请选择是否要创建实例维护策略。您也可以在创建自动扩缩组后再创建此策略。要创建策略，请按照[设置实例维护政策](set-instance-maintenance-policy.md)中的指导操作。

   1. 在 **Instance scale-in protection**（实例缩减保护）下，选择是否启用实例缩减保护。有关更多信息，请参阅 [使用实例横向缩减保护以控制实例终止](ec2-auto-scaling-instance-protection.md)。

1. （可选）要接收通知，请为 **Add notification**（添加通知）配置通知，然后选择 **Next**（下一步）。有关更多信息，请参阅 [Amazon EC2 Auto Scaling 的 Amazon SNS 通知选项](ec2-auto-scaling-sns-notifications.md)。

1. （可选）要添加标签，请选择 **Add tag**（添加标签），为每个标签提供标签键和值，然后选择 **Next**（下一步）。有关更多信息，请参阅 [为 Auto Scaling 组和实例添加标签](ec2-auto-scaling-tagging.md)。

1. 在 **Review（查看）**页面上，选择 **Create Auto Scaling group（创建 Auto Scaling 组）**。

**使用命令行创建 Auto Scaling 组**

您可以使用以下任一命令：
+ [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) (AWS CLI)
+ [新-ASAuto ScalingGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/New-ASAutoScalingGroup.html) (AWS Tools for Windows PowerShell)

# 使用现有实例创建 Auto Scaling 组 AWS CLI
<a name="create-asg-from-instance"></a>

**重要**  
我们为尚未从启动配置迁移到启动模板的客户提供有关启动配置的信息。有关为自动扩缩组创建启动模板的更多信息，请参阅 [将自动扩缩组迁移到启动模板](migrate-to-launch-templates.md)。

如果这是您第一次创建 Auto Scaling 组，我们建议您使用控制台从现有 EC2 实例创建启动模板。然后使用启动模板创建新的 Auto Scaling 组。有关此步骤，请参阅 [使用 Amazon EC2 启动向导创建 Auto Scaling 组](create-asg-ec2-wizard.md)。

以下程序演示了如何通过如下方法创建 Auto Scaling 组：指定要用作启动其他实例基础的现有实例。创建 EC2 实例需要多个参数，例如 Amazon Machine Image (AMI) ID、实例类型、密钥对和安全组。Amazon EC2 Auto Scaling 还使用所有这些信息，以便在需要扩展时代表您启动实例。此信息存储在启动模板或启动配置中。

当您使用现有实例时，Amazon EC2 Auto Scaling 会创建一个 Auto Scaling 组，该组将根据同时创建的启动配置启动实例。Auto Scaling 组的名称与 Auto Scaling 组相同，并且包括来自已识别实例的某些配置详细信息。

以下配置详细信息会从已识别的实例复制到启动配置中：
+ AMI ID
+ 实例类型
+ 密钥对
+ 安全组
+ IP 地址类型（公有或私有）
+ IAM 实例配置文件（如果适用）
+ 监控（true 或 false）
+ EBS 优化（true 或 false）
+ 租期设置 (如果在 VPC (共享或专用) 中启动)
+ 内核 ID 和 RAM 磁盘 ID (如果适用)
+ 用户数据，如果指定 
+ Spot（最高）价格

VPC 子网和可用区将从已识别的实例复制到自动扩缩组自己的资源定义中。

如果已识别的实例位于置放群组中，则新 Auto Scaling 组将在与已识别实例相同的置放群组中启动实例。由于启动配置设置不允许指定置放群组，因此将置放群组复制到新 Auto Scaling 组的 `PlacementGroup` 属性。

不会从已识别实例中复制以下配置详细信息，
+ 存储：不会从已识别的实例中复制块储存设备（EBS 卷和实例存储卷）。相反，作为创建 AMI 的一部分而创建的块储存设备映射决定了使用哪些设备。
+ 网络接口数量：网络接口未从已识别的实例中复制。相反，Amazon EC2 Auto Scaling 会使用其默认设置创建一个网络接口，即主网络接口 (eth0)。
+ 实例元数据选项：不会从已识别的实例中复制元数据可访问、元数据版本和令牌响应跃点数限制设置。相反，Amazon EC2 Auto Scaling 会使用其默认设置。有关更多信息，请参阅 [配置实例元数据选项](create-launch-config.md#launch-configurations-imds)。
+ 负载均衡器：如果识别的实例适用一个或多个负载均衡器进行注册，则有关负载均衡器的信息不会复制到负载均衡器或新 Auto Scaling 组的目标组属性。
+ 标签：如果识别的实例有标签，标签不会复制到新 Auto Scaling 组的 `Tags` 属性。

## 先决条件
<a name="create-asg-from-instance-prerequisites"></a>

EC2 实例必须符合以下标准：
+ 实例不是其他 Auto Scaling 组的成员。
+ 实例处于 `running` 状态。
+ 用于启动实例的 AMI 必须仍然存在。

## 从 EC2 实例创建 Auto Scaling 组 (AWS CLI)
<a name="create-asg-from-instance-aws-cli"></a>

以下示例过程向您展示了如何使用 CLI 命令从 EC2 实例创建自动扩缩组。

此程序不会将实例添加到 Auto Scaling 组中。要连接实例，必须在创建 Auto Scaling 组之后运行 [attach-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/attach-instances.html) 命令。

开始之前，请使用 Amazon EC2 控制台或 [describe-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-instances.html) 命令查找 EC2 实例的 ID。

**将当前实例用作模板**
+ 使用以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令从 EC2 实例创建 Auto Scaling 组`i-123456789abcdefg0`。`my-asg-from-instance`

  ```
  aws autoscaling create-auto-scaling-group --auto-scaling-group-name my-asg-from-instance \
    --instance-id i-123456789abcdefg0 --min-size 1 --max-size 2 --desired-capacity 2
  ```

**验证 Auto Scaling 组已启动实例**
+ 使用以下[describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html)命令验证 Auto Scaling 组是否已成功创建。

  ```
  aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg-from-instance
  ```

  以下示例响应显示该组的所需容量为 2，该组有 2 个正在运行的实例，启动配置命名为 `my-asg-from-instance`。

  ```
  {
    "AutoScalingGroups":[
      {
        "AutoScalingGroupName":"my-asg-from-instance",
        "AutoScalingGroupARN":"arn",
        "LaunchConfigurationName":"my-asg-from-instance",
        "MinSize":1,
        "MaxSize":2,
        "DesiredCapacity":2,
        "DefaultCooldown":300,
        "AvailabilityZones":[
          "us-west-2a"
        ],
        "LoadBalancerNames":[],
        "TargetGroupARNs":[],
        "HealthCheckType":"EC2",
        "HealthCheckGracePeriod":0,
        "Instances":[
          {
            "InstanceId":"i-34567890abcdef012",
            "InstanceType":"t2.micro",
            "AvailabilityZone":"us-west-2a",
            "LifecycleState":"InService",
            "HealthStatus":"Healthy",
            "LaunchConfigurationName":"my-asg-from-instance",
            "ProtectedFromScaleIn":false
          },
          {
            "InstanceId":"i-012345abcdefg6789",
            "InstanceType":"t2.micro",
            "AvailabilityZone":"us-west-2a",
            "LifecycleState":"InService",
            "HealthStatus":"Healthy",
            "LaunchConfigurationName":"my-asg-from-instance",
            "ProtectedFromScaleIn":false
          }
        ],
        "CreatedTime":"2020-10-28T02:39:22.152Z",
        "SuspendedProcesses":[ ],
        "VPCZoneIdentifier":"subnet-0abc1234",
        "EnabledMetrics":[ ],
        "Tags":[ ],
        "TerminationPolicies":[
          "Default"
        ],
        "NewInstancesProtectedFromScaleIn":false,
        "ServiceLinkedRoleARN":"arn",
        "TrafficSources":[]
      }
    ]
  }
  ```

**查看启动配置**
+ 使用以下[describe-launch-configurations](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-launch-configurations.html)命令查看启动配置的详细信息。

  ```
  aws autoscaling describe-launch-configurations --launch-configuration-names my-asg-from-instance
  ```

  下面是示例输出：

  ```
  {
    "LaunchConfigurations":[
      {
        "LaunchConfigurationName":"my-asg-from-instance",
        "LaunchConfigurationARN":"arn",
        "ImageId":"ami-234567890abcdefgh",
        "KeyName":"my-key-pair-uswest2",
        "SecurityGroups":[
          "sg-12abcdefgh3456789"
        ],
        "ClassicLinkVPCSecurityGroups":[ ],
        "UserData":"",
        "InstanceType":"t2.micro",
        "KernelId":"",
        "RamdiskId":"",
        "BlockDeviceMappings":[ ],
        "InstanceMonitoring":{
          "Enabled":true
        },
        "CreatedTime":"2020-10-28T02:39:22.321Z",
        "EbsOptimized":false,
        "AssociatePublicIpAddress":true
      }
    ]
  }
  ```

**终止实例**
+ 如果您不再需要实例，可终止它。以下 [terminate-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/terminate-instances.html) 命令可终止实例`i-123456789abcdefg0`。

  ```
  aws ec2 terminate-instances --instance-ids i-123456789abcdefg0
  ```

  终止 Amazon EC2 实例后，您无法重新启动实例。终止后，卷上的数据都不复存在，并且再也不能附加到任何实例。要了解有关终止实例的更多信息，请参阅《Amazon EC2 用户指南》**中的[终止实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#terminating-instances-console)。

# 同步启动实例
<a name="launch-instances-synchronously"></a>

Amazon EC2 Auto Scaling 提供了两种在 Auto Scaling 组中启动实例的方法：异步扩展行为和使用 LaunchInstances API 进行同步配置。

通过同步配置，您可以使用 LaunchInstances API 请求特定可用区中特定数量的实例。同步配置具有以下好处：
+ 即时反馈特定可用区域的容量可用性
+ 精确控制哪些可用区实例在哪个可用区启动
+  IDs 可立即在编排系统中使用的确定性实例
+ 基于实际容量限制的实时扩展决策
+ 通过消除异步 Auto Scaling 启动的等待时间来加快扩展速度

使用异步 Auto Scaling 时，当您更改所需容量或触发扩展策略时，Amazon EC2 Auto Scaling 会处理扩展请求并在后台启动实例。您必须监控扩展活动或描述您的 Auto Scaling 组，以确定何时成功启动实例。

**注意**  
该 LaunchInstances API 仅适用于使用启动模板的 Auto Scaling 群组。不支持使用启动配置的 Auto Scaling 组。如果您的 Auto Scaling 组使用启动配置，则必须先迁移到启动模板，然后才能使用同步配置。
 LaunchInstances API 仅支持完全按需购买或完全竞价购买选项的混合实例策略。不支持组合按需实例和竞价型实例的混合策略。
对于覆盖多个可用区的 Auto Scaling 组，您必须指定目标可用区或子网。对于单可用区组，此参数是可选的。

## 同步配置和异步扩展
<a name="synchronous-vs-asynchronous-scaling"></a>

### 同步配置
<a name="synchronous-provisioning-behavior"></a>

当你使用 LaunchInstances API 时，亚马逊 EC2 Auto Scaling：
+ 立即尝试使用启动请求的实例 CreateFleet
+ 等待 CreateFleet 返回实例后 IDs 再响应
+ 成功后返回实例 IDs、实例类型和可用区信息
+ 返回特定的错误代码和失败详情
+ 提供即时反馈，实现实时扩展决策

### 异步扩展
<a name="asynchronous-scaling-behavior"></a>

当您使用异步 Auto Scaling 方法（例如更改所需容量或使用扩展策略）时，Amazon EC2 Auto Scaling：
+ 更新 API 中的所需容量，但不会立即返回实例
+ 计划实例自动跨可用区启动
+ 通过后台工作流程启动实例
+ 自动在多个可用区之间分配容量以实现平衡
+ 使用内置的重试逻辑处理启动失败

您必须对扩展活动进行轮询或描述您的 Auto Scaling 群组，才能检查启动操作的状态。

## 限制和注意事项
<a name="limitations-considerations-synchronous"></a>

使用同步配置时，请记住以下注意事项和限制：
+ **启动后的实例状态**-API 返回的实例处于待处理状态。在后续的工作流程或生命周期挂钩中，它们可能仍会失败。成功的 API 响应意味着 EC2 已接受启动请求并返回了实例 ID。实例不会自动被视为已完全为工作负载做好准备，必须完成标准的 EC2 和 Auto Scaling 生命周期流程。
+ **温池限制**-目前不支持带有温池的 Auto Scaling 组。如果您尝试在配置了温池 LaunchInstances 的 Auto Scaling 组上调用 API，API 会执行冷启动而不是使用温池实例，并返回 UnsupportedOperation 错误。有关冷启动的更多信息，请参阅[温池的限制](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-warm-pools.html#warm-pools-limitations)。
+ **API 超时和重试** — 如果底层 CreateFleet 操作花费的时间超过预期，API 可能会超时并返回一个等性令牌。您可以使用相同的方法重试 ClientToken 以跟踪原始启动操作，也可以使用带有客户端令牌的 describe-instances 来检查已启动的实例。
+ **可用区限制** — 如果您的 Auto Scaling 组跨越多个可用区并启用了可用区重新平衡，则同步启动实例可能会导致操作冲突：
  + 每次调用仅限一个可用区 — 即使您的 Auto Scaling 组跨越多个区域，每个 LaunchInstances API 调用也只能针对一个可用区。
  + 可用区重新平衡冲突-如果您的 Auto Scaling 组启用了可用区再平衡，则跨不同组的连续调用 AZs 可能会触发额外的异步启动，从而导致实例数超出预期的范围。考虑暂停 AZ 再平衡以实现精确的容量控制。有关更多信息，请参阅 [暂停和恢复 Amazon EC2 Auto Scaling 进程](as-suspend-resume-processes.md)。
+ **部分成功场景** — 如果只有部分请求的容量可用，`LaunchInstances`API 可能会返回部分成功，这是 EC2 的正常行为。API 会返回成功启动的实例以及启动失败的错误详情。对于要求所有实例一起启动的用例（例如应用程序需要在同一可用区内的所有实例以实现低延迟），您需要终止部分启动的实例，然后在不同的可用区重试。在为容量敏感型工作负载设计重试逻辑时，请考虑这种行为。
+ **实例权重**-如果您的 Auto Scaling 组使用实例权重，则该 RequestedCapacity 参数表示加权容量单位，而不是实例数。实际启动的实例数量取决于所选的实例类型及其配置的权重。无论请求的加权容量如何，EC2 Auto Scaling 都限制每次 API 调用最多启动 100 个实例。
+ **混合实例类型** — LaunchInstances API 使用您的 Auto Scaling 组的现有混合实例策略来确定要启动的实例类型。API 会根据您所在群组的分配策略和实例类型优先级启动实例。

# 使用同步配置启动实例
<a name="launching-instances-synchronous-provisioning"></a>

您可以使用该 LaunchInstances API 同步启动 Auto Scaling 组中特定数量的实例。API 在您指定的可用区或子网中启动实例，并立即返回实例 IDs 或错误信息。

## 先决条件
<a name="prerequisites-synchronous-provisioning"></a>

在使用 LaunchInstances API 之前，您必须具备以下条件：
+ 使用启动模板的 Auto Scaling 组（不支持启动配置）
+ 您必须拥有以下 IAM 操作的权限：
  + `autoscaling:LaunchInstances`
  + `ec2:CreateFleet`
  + `ec2:DescribeLaunchTemplateVersions`

## 使用同步配置启动实例
<a name="launch-instances-cli"></a>

您可以通过启动具有同步配置功能的实例 AWS CLI。

### AWS CLI
<a name="aws-cli-launch-instances"></a>

要使用同步配置启动实例，请执行以下操作：

```
aws autoscaling launch-instances \
        --auto-scaling-group-name group-name \
        --requested-capacity number \
        [--availability-zones zone-name] \
        [--subnet-ids subnet-id] \
        [--availability-zone-ids zone-id] \
        [--retry-strategy none|retry-with-group-configuration] \
        [--client-token token]
```

#### 示例
<a name="examples-launch-instances"></a>

**在特定可用区启动实例**

```
aws autoscaling launch-instances \
        --auto-scaling-group-name my-asg \
        --requested-capacity 3 \
        --availability-zones us-east-1a \
        --retry-strategy retry-with-group-configuration
```

**在特定子网中启动实例**

```
aws autoscaling launch-instances \
        --auto-scaling-group-name my-asg \
        --requested-capacity 2 \
        --subnet-ids subnet-12345678 \
        --retry-strategy none \
        --client-token my-unique-token-123
```

#### 处理回复
<a name="handling-responses"></a>

**成功响应的示例：**

```
{
    "AutoScalingGroupName": "my-asg",
    "ClientToken": "my-unique-token-123",
    "Instances": [
        {
            "InstanceType": "m5.xlarge",
            "AvailabilityZone": "us-east-1a",
            "AvailabilityZoneId": "use1-az1",
            "SubnetId": "subnet-12345678",
            "MarketType": "OnDemand",
            "InstanceIds": ["i-0123456789abcdef0", "i-0fedcba9876543210"]
        }
    ],
    "Errors": []
}
```

**有错误的响应示例**

```
{
    "AutoScalingGroupName": "my-asg",
    "ClientToken": "my-unique-token-123",
    "Instances": [],
    "Errors": [
       {
        "InstanceType": "m5.large",
        "AvailabilityZone": "us-east-1a",
        "AvailabilityZoneId": "use1-az1",
        "SubnetId": "subnet-12345678",
        "MarketType": "OnDemand",
        "ErrorCode": "InsufficientInstanceCapacity",
        "ErrorMessage": "There is not enough capacity to fulfill your request for instance type 'm5.large' in 'us-east-1a'"
        }
    ]
}
```

## 处理启动失败和重试
<a name="handle-launch-failures-retries"></a>

当 LaunchInstances API 遇到故障时，您可以使用等效令牌和适当的重试策略来实现重试策略。

您可以使用 client-token 参数来重试请求。您也可以使用以下重试策略：
+ `RetryStrategy: none`（默认）-如果 API 调用失败，Auto Scaling 组的所需容量将保持不变，并且不会自动重试。
+ `RetryStrategy: retry-with-group-configuration`-如果 API 调用失败，Auto Scaling 组的所需容量将按请求的数量增加，Auto Scaling 将使用该组的标准配置和流程自动重试启动实例。

的重试行为`RetryStrategy: retry-with-group-configuration`取决于失败类型：
+ **验证错误**：由于操作无法继续，因此未增加所需容量。例如，无效的参数或不支持的配置。
+ **容量错误**：所需容量已增加，Auto Scaling 将使用组的正常扩展流程重试异步启动实例。

### 使用客户端令牌实现等性
<a name="client-tokens-sp"></a>

该`client-token`参数可确保执行等性操作，并允许安全重试启动请求。

关键行为：
+ 客户令牌的有效期从初始请求算起 8 小时
+ 在 8 小时内使用相同的客户端令牌重试会返回缓存的响应，而不是启动新实例
+ 8 小时后，相同的客户端令牌将启动新的启动操作

# 更新自动扩缩组
<a name="update-auto-scaling-group"></a>

您可以更新自动扩缩组的大部分详细信息。您无法更新 Auto Scaling 组的名称或更改其名称 AWS 区域。

**更新自动扩缩组（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选择您的自动扩缩组以显示有关该组的信息，其中包含**详细信息**、**活动**、**自动扩缩**、**实例管理**、**监控**和**实例刷新**选项卡。

1. 选择您感兴趣的配置区域的选项卡，然后根据需要更新设置。对于您编辑的每个设置，请选择**更新**以保存对自动扩缩组配置所做的更改。
   + **详细信息**选项卡

     这些是自动扩缩组的常规设置。您可以像创建自动扩缩组时那样编辑和管理这些设置。

     **高级配置**部分包含一些在创建组时不可用的选项，例如[终止策略](ec2-auto-scaling-termination-policies.md)、[冷却时间](ec2-auto-scaling-scaling-cooldowns.md)、[暂停的进程](as-suspend-resume-processes.md)和[最大实例生命周期](asg-max-instance-lifetime.md)。您也可以查看但不能编辑自动扩缩组的置放群组和[服务相关角色](autoscaling-service-linked-role.md)。
   + **集成**选项卡
     + **负载均衡** — [Elastic Load Balancing](autoscaling-load-balancer.md)

       如果该组与 Elastic Load Balancing 资源相关联，请在更改可用区之前参阅 [添加可用区删除可用区](as-add-az-console.md)。对负载均衡器的某些限制可能会阻止您将该组的可用区更改应用于负载均衡器的可用区。
     + **VPC Lattice 集成选项** — [VPC Lattice](ec2-auto-scaling-vpc-lattice.md) 
     + **ARC 可用区转移** — [自动扩缩组可用区转移](ec2-auto-scaling-zonal-shift.md) 
   + **自动扩缩**选项卡
     + **动态扩缩策略**：[动态扩缩策略](as-scale-based-on-demand.md)
     + **预测性扩展策略**：[预测性扩展策略](ec2-auto-scaling-predictive-scaling.md)
     + **计划操作**：[计划操作](ec2-auto-scaling-scheduled-scaling.md)
   + **实例管理**选项卡
     + **生命周期挂钩**：[生命周期挂钩](lifecycle-hooks.md)
     + **暖池**：[暖池](ec2-auto-scaling-warm-pools.md)
   + **活动**选项卡
     + **活动通知**：[Amazon SNS 通知](ec2-auto-scaling-sns-notifications.md)
   + **监控**选项卡
     + 此选项卡中只有一个选项，允许您启用或禁用[CloudWatch群组指标收集](ec2-auto-scaling-metrics.md)。

**使用命令行来更新自动扩缩组**

您可以使用以下任一命令：
+ [update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html) (AWS CLI)
+ [更新-ASAuto ScalingGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/Update-ASAutoScalingGroup.html) (AWS Tools for Windows PowerShell)

## 更新自动扩缩实例
<a name="update-auto-scaling-instances"></a>

如果您将新的启动模板或启动配置与自动扩缩组相关联，那么所有新实例都将获得更新后的配置。现有实例继续采用它们最初启动时采用的配置运行。要将更改应用于现有实例，您有以下选项：
+ 启动实例刷新以替换旧实例。有关更多信息，请参阅 [使用实例刷新更新自动扩缩组中的实例](asg-instance-refresh.md)。
+ 根据[终止策略](as-instance-termination.md)等待扩缩活动逐步使用较新的实例替换较旧的实例。
+ 手动终止它们，这样它们就会被您的自动扩缩组所替代。

**注意**  
您可以通过将以下实例属性指定为启动模板或启动配置的一部分来更改这些属性：  
亚马逊机器映像（AMI）
块储存设备
密钥对
实例类型
安全组
用户数据
监控
IAM 实例配置文件
部署租期
kernel
虚拟磁盘
实例是否有公有 IP 地址
可用区分配策略

## 自动扩缩组分配策略和容量变化
<a name="update-mixed-instance-groups"></a>

更改自动扩缩组分配策略时，不会替换现有实例。因横向扩展事件而启动的任何新实例都将遵循新的分配策略。未来的任何横向缩减事件都将遵循[终止策略](ec2-auto-scaling-termination-policies.md)，如果终止策略设置为 `Default` 或 `AllocationStrategy`，则将使用新的分配策略。例如，如果分配策略从 `lowest-price` 更改为 `price-capacity-optimized`，可能不会终止任何实例，但任何新实例都将按新的分配策略启动。实例类型的变化不影响现有实例。

当您更改某些参数（例如[OnDemandBaseCapacity](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_InstancesDistribution.html)或）时 [OnDemandPercentageAboveBaseCapacity](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_InstancesDistribution.html)，如果按需实例和竞价型实例的百分比与新规格不匹配，Auto Scaling 将自动重新平衡。例如，假设一个自动扩缩组将 `OnDemandPercentageAboveBaseCapacity` 设置为 50% 按需型实例和 50% 竞价型实例。则 `OnDemandPercentageAboveBaseCapacity` 增加至 100% 按需型实例。自动扩缩组将通过启动新的按需型实例和终止竞价型实例来主动进行再平衡。您定义的[实例维护策略](instance-maintenance-policy-overview-and-considerations.md)决定了启动与终止活动的顺序。

# 为 Auto Scaling 组和实例添加标签
<a name="ec2-auto-scaling-tagging"></a>

*标签*是您分配或分配给 AWS 资源的自定义属性标签。 AWS 每个 标签具有两个部分：
+ 标签键（例如，`costcenter`、`environment` 或 `project`）
+ 一个称为标签值的可选字段（例如，`111122223333` 或 `production`）

标签可帮助您：
+ 追踪您的 AWS 成本。您可以在 AWS 账单与成本管理 控制面板上激活这些标签。 AWS 使用标签对您的成本进行分类，并向您提供每月成本分配报告。有关更多信息，请参阅 *AWS Billing 用户指南*中的[使用成本分配标签](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)。
+ 根据标签控制对 Auto Scaling 组的访问。您可以使用 IAM policy 中的条件根据该组上的标签控制对自动扩缩组的访问。有关更多信息，请参阅 [安全性标签](tag-security.md)。
+ 根据您添加的标签筛选和搜索自动扩缩组。有关更多信息，请参阅 [使用标签筛选 Auto Scaling 组](use-tag-filters-aws-cli.md)。
+ 识别和整理您的 AWS 资源。许多都 AWS 服务 支持标记，因此您可以为来自不同服务的资源分配相同的标签，以表明这些资源是相关的。

您可以标记新的或现有 Auto Scaling 组。您还可以将来自某个自动扩缩组的标签传播到该组启动的 EC2 实例。

标签不会传播到 Amazon EBS 卷。要向 Amazon EBS 卷添加标签，请在启动模板中指定标签。有关更多信息，请参阅 [为 Auto Scaling 组创建启动模板](create-launch-template.md)。

您可以通过 AWS 管理控制台 AWS CLI、或创建和管理标签 SDKs。

**Topics**
+ [标签命名和使用限制](#tag_restrictions)
+ [EC2 实例标签生命周期](#tag-lifecycle)
+ [标记 Auto Scaling 组](add-tags.md)
+ [删除标签](delete-tag.md)
+ [安全性标签](tag-security.md)
+ [控制对标签的访问](tag-permissions.md)
+ [使用标签筛选 Auto Scaling 组](use-tag-filters-aws-cli.md)

## 标签命名和使用限制
<a name="tag_restrictions"></a>

下面是适用于 标签的基本限制：
+ 每个资源的最大标签数是 50。
+ 可以使用单个调用添加或删除的标签的最大数目为 25。
+ 最大键长度为 128 个 Unicode 字符。
+ 最大值长度为 256 个 Unicode 字符。
+ 标签键和值区分大小写。最佳实践是，决定利用标签的策略并在所有资源类型中一致地实施该策略。
+ 请勿在标签名称或值中使用`aws:`前缀，因为它是保留供 AWS 使用的。您不能编辑或删除具有此前缀的标签名称或值，它们不计入每个资源配额的标签数限制。

## EC2 实例标签生命周期
<a name="tag-lifecycle"></a>

如果您选择将标签传播到 EC2 实例，则将按以下方式管理标签：
+ 当 Auto Scaling 组启动实例时，它会在资源创建期间向实例添加标记，而不是在创建资源之后。
+ Auto Scaling 组会自动向实例添加带有 `aws:autoscaling:groupName` 键和 Auto Scaling 组名称值的标签。
+ 如果您在启动模板中指定了实例标签，并且选择将组的标签传播到其实例，则所有标签都会合并。如果为启动模板中的标签和 Auto Scaling 组中的标签指定了相同的标签键，则优先使用该组中的标签值。
+ 您在附加现有实例时，Auto Scaling 组就会向这些实例添加标签，覆盖具有相同标签关键字的现有标签。它还添加键为 `aws:autoscaling:groupName`、值为 Auto Scaling 组名称的标签。
+ 将实例从 Auto Scaling 组中分离时，它仅删除 `aws:autoscaling:groupName` 标签。

# 标记 Auto Scaling 组
<a name="add-tags"></a>

当您向 Auto Scaling 组添加标签时，可以指定是否应将其添加到 Auto Scaling 组中启动的实例。如果修改标签，在更改后，标签的更新版本将添加到在 Auto Scaling 组中启动的实例。如果创建或修改 Auto Scaling 组的标签，不会对已经在 Auto Scaling 组中运行的实例进行这些更改。

**Topics**
+ [添加或修改标签（控制台）](#add-tags-console)
+ [添加或修改标签 (AWS CLI)](#add-tags-aws-cli)

## 添加或修改标签（控制台）
<a name="add-tags-console"></a>

**创建时标记 Auto Scaling 组**  
当您使用 Amazon EC2 控制台创建 Auto Scaling 组时，您可以在“创建 Auto Scaling 组”向导的**添加标签**页面上指定标签键和值。要将标签传播到在 Auto Scaling 组中启动的实例，请确保该标签的 **Tag new instances**（标记新实例）选项保持选中状态。否则，您可以取消选择它。

**添加或修改现有 Auto Scaling 组的标签**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中 Auto Scaling 组旁边的复选框。

   这时将在 **Auto Scaling groups**（Auto Scaling 组）页面底部打开一个拆分窗格。

1. 在 **Details**（详细信息）选项卡上，选择 **Tags**（标签）、**Edit**（编辑）。

1. 要修改现有标签，请编辑 **Key**（键）和 **Value**（值）。

1. 要添加新标签，请选择 **Add tag**（添加标签），然后编辑 **Key**（键）和 **Value**（值）。您可以使**标记新实例**保持选中状态，以便自动将标签添加到在 Auto Scaling 组启动的实例，否则取消选中它。

1. 添加完标签后，选择 **Update**（更新）。

## 添加或修改标签 (AWS CLI)
<a name="add-tags-aws-cli"></a>

以下示例说明如何在创建 Auto Scaling 组时使用添加标签，以及如何为现有 Auto Scaling 组添加或修改标签。 AWS CLI 

**创建时标记 Auto Scaling 组**  
使用[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令创建新的 Auto Scaling 组，然后向 Auto Scaling 组添加标签。**environment=production**该标签还会添加到在 Auto Scaling 组中启动的任何实例。

```
aws autoscaling create-auto-scaling-group --auto-scaling-group-name my-asg \
  --launch-configuration-name my-launch-config --min-size 1 --max-size 3 \
  --vpc-zone-identifier "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782" \
  --tags Key=environment,Value=production,PropagateAtLaunch=true
```

**创建或修改现有 Auto Scaling 组的标签**  
可以使用 [create-or-update-tags](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-or-update-tags.html) 命令创建或修改标签。例如，以下命令将添加 `Name=my-asg` 和 `costcenter=cc123` 标签。在进行该更改后，该标签还会添加到在 Auto Scaling 组中启动的任何实例。如果具有任一键的标签已经存在，则会替换现有标签。Amazon EC2 控制台将每个实例的显示名称与为 `Name` 键指定的名称（区分大小写）关联。

```
aws autoscaling create-or-update-tags \
  --tags ResourceId=my-asg,ResourceType=auto-scaling-group,Key=Name,Value=my-asg,PropagateAtLaunch=true \
  ResourceId=my-asg,ResourceType=auto-scaling-group,Key=costcenter,Value=cc123,PropagateAtLaunch=true
```

### 描述 Auto Scaling 组的标签 (AWS CLI）
<a name="describe-tags-aws-cli"></a>

如果您要查看应用于特定的 Auto Scaling 组的标签，可以使用以下任一命令：
+ [describe-tags](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-tags.html)：您提供自动扩缩组的名称，以查看指定组的标签列表。

  ```
  aws autoscaling describe-tags --filters Name=auto-scaling-group,Values=my-asg
  ```

  以下为响应示例。

  ```
  {
      "Tags": [
          {
              "ResourceType": "auto-scaling-group",
              "ResourceId": "my-asg",
              "PropagateAtLaunch": true,
              "Value": "production",
              "Key": "environment"
          }
      ]
  }
  ```
+ [describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html)— 您可以提供 Auto Scaling 组名称以查看指定组的属性，包括任何标签。

  ```
  aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg
  ```

  以下为响应示例。

  ```
  {
      "AutoScalingGroups": [
          {
              "AutoScalingGroupName": "my-asg",
              "AutoScalingGroupARN": "arn",
              "LaunchTemplate": {
                  "LaunchTemplateId": "lt-0b97f1e282EXAMPLE",
                  "LaunchTemplateName": "my-launch-template",
                  "Version": "$Latest"
              },
              "MinSize": 1,
              "MaxSize": 5,
              "DesiredCapacity": 1,
              ...
              "Tags": [
                  {
                      "ResourceType": "auto-scaling-group",
                      "ResourceId": "my-asg",
                      "PropagateAtLaunch": true,
                      "Value": "production",
                      "Key": "environment"
                  }
              ],
              ...
          }
      ]
  }
  ```

# 删除标签
<a name="delete-tag"></a>

您可以随时删除与 Auto Scaling 组关联的标签。

**Topics**
+ [删除标签（控制台）](#delete-tag-console)
+ [删除标签 (AWS CLI)](#delete-tag-aws-cli)

## 删除标签（控制台）
<a name="delete-tag-console"></a>

**删除标签**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中现有组旁边的复选框。

   这时将在 **Auto Scaling groups**（Auto Scaling 组）页面底部打开一个拆分窗格。

1. 在 **Details**（详细信息）选项卡上，选择 **Tags**（标签）、**Edit**（编辑）。

1. 选择标签旁边的 **Remove**（删除）。

1. 选择 **Update**（更新）。

## 删除标签 (AWS CLI)
<a name="delete-tag-aws-cli"></a>

使用 [delete-tags](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/delete-tags.html) 命令删除标签。例如，以下命令删除键为 `environment` 的标签。

```
aws autoscaling delete-tags --tags "ResourceId=my-asg,ResourceType=auto-scaling-group,Key=environment"
```

您必须指定标签键，但无需指定值。如果您指定了一个值，并且该值不正确，则不会删除标签。

# 安全性标签
<a name="tag-security"></a>

使用标签来验证请求者（例如 IAM 用户或角色）是否有权创建、修改或删除特定自动扩缩组。使用下面的一个或多个条件键，在 IAM policy 的条件元素中提供标签信息：
+ 使用 `autoscaling:ResourceTag/tag-key: tag-value` 可允许（或拒绝）带特定标签的 Auto Scaling 组上的用户操作。
+ 使用 `aws:RequestTag/tag-key: tag-value` 要求在请求中存在（或不存在）特定标签。
+ 使用 `aws:TagKeys [tag-key, ...]` 要求在请求中存在（或不存在）特定标签键。

例如，您可能拒绝对包含具有键 `environment` 和值 `production` 的标签的 Auto Scaling 组的访问，如以下示例所示。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [        
                "autoscaling:CreateAutoScalingGroup",
                "autoscaling:UpdateAutoScalingGroup",
                "autoscaling:DeleteAutoScalingGroup"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {"autoscaling:ResourceTag/environment": "production"}
            }
        }
    ]
}
```

------

有关使用条件键控制自动扩缩组访问的更多信息，请参阅 [Amazon EC2 Auto Scaling 如何与 IAM 结合使用](control-access-using-iam.md)。

# 控制对标签的访问
<a name="tag-permissions"></a>

使用标签来验证请求者（例如 IAM 用户或角色）是否有权添加、修改或删除自动扩缩组的标签。

以下 IAM policy 示例授予主体权限仅从自动扩缩组中删除带有 `temporary` 密钥的标签。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "autoscaling:DeleteTags",
            "Resource": "*",
            "Condition": {
                "ForAllValues:StringEquals": { "aws:TagKeys": ["temporary"] }
            }
        }
    ]
}
```

------

有关对自动扩缩组指定的标签实施限制的 IAM policy 的更多示例，请参阅 [控制可以使用哪些标签键和标签值](security_iam_id-based-policy-examples.md#policy-example-tags)。

**注意**  
在实例启动后，即使您制定限制您的用户对 Auto Scaling 组执行标记（或取消标记）操作的策略，这也不会防止他们手动更改实例上的标签。有关控制对 EC2 实例上标签访问的示例，请参阅《Amazon EC2 用户指南》**中的[示例：标记资源](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ExamplePolicies_EC2.html#iam-example-taggingresources)。

# 使用标签筛选 Auto Scaling 组
<a name="use-tag-filters-aws-cli"></a>

以下示例向您展示了如何使用带[describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html)命令的过滤器来描述带有特定标签的 Auto Scaling 组。按标签筛选仅限于 AWS CLI 或 SDK，无法通过控制台进行筛选。

**筛选注意事项**
+ 您可以在单一请求中指定多个筛选条件和多个筛选条件值。
+ 您不可以将通配符与筛选值一同使用。
+ 筛选值区分大小写。

**示例：使用特定标签键和值对描述 Auto Scaling 组**  
以下命令展示了如何筛选结果以仅显示具有 **`environment=production`** 的标签键和值对的 Auto Scaling 组。

```
aws autoscaling describe-auto-scaling-groups \
  --filters Name=tag-key,Values=environment Name=tag-value,Values=production
```

以下为响应示例。

```
{
    "AutoScalingGroups": [
        {
            "AutoScalingGroupName": "my-asg",
            "AutoScalingGroupARN": "arn",
            "LaunchTemplate": {
                "LaunchTemplateId": "lt-0b97f1e282EXAMPLE",
                "LaunchTemplateName": "my-launch-template",
                "Version": "$Latest"
            },
            "MinSize": 1,
            "MaxSize": 5,
            "DesiredCapacity": 1,
            ...
            "Tags": [
                {
                    "ResourceType": "auto-scaling-group",
                    "ResourceId": "my-asg",
                    "PropagateAtLaunch": true,
                    "Value": "production",
                    "Key": "environment"
                }
            ],
            ...
        },

    ... additional groups ...

    ]
}
```

或者，您也可以使用 `tag:<key>` 筛选条件指定标签。例如，以下命令展示了如何筛选结果以仅显示具有 **`environment=production`** 的标签键和值对的 Auto Scaling 组。此筛选条件的格式如下所示：`Name=tag:<key>,Values=<value>`，其中采用代表标签键值对的 **<key>** 和 **<value>**。

```
aws autoscaling describe-auto-scaling-groups \
  --filters Name=tag:environment,Values=production
```

您也可以使用`--query`选项筛选 AWS CLI 输出。以下示例说明如何仅将前一个命令的 AWS CLI 输出限制为组名、最小大小、最大大小和所需的容量属性。

```
aws autoscaling describe-auto-scaling-groups \
  --filters Name=tag:environment,Values=production \
  --query "AutoScalingGroups[].{AutoScalingGroupName: AutoScalingGroupName, MinSize: MinSize, MaxSize: MaxSize, DesiredCapacity: DesiredCapacity}"
```

以下为响应示例。

```
[
    {
        "AutoScalingGroupName": "my-asg",
        "MinSize": 0,
        "MaxSize": 10,
        "DesiredCapacity": 1
    },

    ... additional groups ...

]
```

有关筛选的更多信息，请参阅《*AWS Command Line Interface 用户指南》*中的[筛选 AWS CLI 输出](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-filter.html)。

**示例：描述带有与指定标签键匹配的标签的 Auto Scaling 组**  
以下命令演示了如何筛选结果以仅显示带有 `environment` 标签的 Auto Scaling 组，并且不考虑标签值。

```
aws autoscaling describe-auto-scaling-groups \
  --filters Name=tag-key,Values=environment
```

**示例：描述带有与指定标签键集匹配的标签的 Auto Scaling 组**  
以下命令显示如何筛选结果以仅显示带有 `environment` 和 `project` 的标签的 Auto Scaling 组，并且不考虑标签值。

```
aws autoscaling describe-auto-scaling-groups \
  --filters Name=tag-key,Values=environment Name=tag-key,Values=project
```

**示例：描述具有与至少一个指定标签键匹配的标签的 Auto Scaling 组**  
以下命令显示如何筛选结果以仅显示带有 `environment` 或 `project` 的标签的 Auto Scaling 组，并且不考虑标签值。

```
aws autoscaling describe-auto-scaling-groups \
  --filters Name=tag-key,Values=environment,project
```

**示例：描述带有指定标签值的 Auto Scaling 组**  
以下命令展示了如何筛选结果以仅显示标签值为 `production` 的 Auto Scaling 组，并且不考虑标签键。

```
aws autoscaling describe-auto-scaling-groups \
  --filters Name=tag-value,Values=production
```

**示例：描述带有指定标签值集的 Auto Scaling 组**  
以下命令显示如何筛选结果以仅显示具有标签值 `production` 和 `development` 的 Auto Scaling 组，并且不考虑标签键。

```
aws autoscaling describe-auto-scaling-groups \
  --filters Name=tag-value,Values=production Name=tag-value,Values=development
```

**示例：描述带有与至少一个指定标签值匹配的标签的 Auto Scaling 组**  
以下命令展示了如何筛选结果以仅显示标签值为 `production` 或`development` 的 Auto Scaling 组，并且不考虑标签键。

```
aws autoscaling describe-auto-scaling-groups \
  --filters Name=tag-value,Values=production,development
```

**示例：描述带有与多个标签键和值匹配的标签的 Auto Scaling 组**  
您还可以组合筛选条件来创建自定义 AND 和 OR 逻辑，以执行更复杂的筛选。

以下命令显示如何筛选结果以仅显示具有特定标签集的 Auto Scaling 组。一个标签键是 `environment` AND，并且标签值是 (`production` OR `development`) AND；而另一个标签键是 `costcenter` AND，并且标签值是 `cc123`。

```
aws autoscaling describe-auto-scaling-groups \
  --filters Name=tag:environment,Values=production,development Name=tag:costcenter,Values=cc123
```

# 实例维护策略
<a name="ec2-auto-scaling-instance-maintenance-policy"></a>

您可以为自动扩缩组配置实例维护策略，以满足导致实例被替换的事件（例如实例刷新或运行状况检查过程）期间的特定容量要求。

例如，假设您有一个自动扩缩组，该组具有少量实例。当运行状况检查显示实例受损时，您需要避免因终止实例然后更换实例而造成的潜在中断。通过实例维护策略，您可以确保 Amazon EC2 Auto Scaling 首先启动一个新实例，然后等待其完全准备就绪，然后再终止运行状况不佳的实例。

实例维护策略还可以帮助您在同时更换多个实例时最大限度地减少任何潜在的中断。您可以为策略设置最低和最高运行正常百分比参数，并且在替换实例时，自动扩缩组只能在该最小-最大范围内增加和减少容量。范围越大，可以同时替换的实例的数量就会增加。

**Topics**
+ [自动扩缩组的实例维护策略](instance-maintenance-policy-overview-and-considerations.md)
+ [为自动扩缩组设置实例维护策略](set-instance-maintenance-policy-on-group.md)

# 自动扩缩组的实例维护策略
<a name="instance-maintenance-policy-overview-and-considerations"></a>

本主题概述了可用选项，并介绍了创建实例维护策略时需要考虑的内容。

**Topics**
+ [概述](#instance-maintenance-policy-overview)
+ [核心概念](#instance-maintenance-policy-core-concepts)
+ [实例预热](#instance-maintenance-policy-instance-warm-up)
+ [运行状况检查宽限期](#instance-maintenance-policy-health-check-grace-period)
+ [扩展您的自动扩缩组](#instance-maintenance-policy-scaling-limits)
+ [应用场景示例](#instance-maintenance-policy-scenarios)

## 概述
<a name="instance-maintenance-policy-overview"></a>

当您为自动扩缩组创建实例维护策略时，该策略会影响导致实例被替换的 Amazon EC2 Auto Scaling 事件。这样可以在同一自动扩缩组中实现更一致的替换行为。它还允许您根据需要优化群组的可用性或成本。

在控制台中，有以下配置选项可用：
+ **终止前启动** – 必须先配置新实例，然后才能终止现有实例。对于偏向于可用性而不是成本节约的应用程序来说，这种方法是一个不错的选择。
+ **终止并启动** – 在终止现有实例的同时配置新实例。对于偏向于节省成本而不是可用性的应用程序来说，这种方法是一个不错的选择。对于启动容量不应超过当前可用容量的应用程序来说，这也是一个不错的选择，即使在替换实例时也是如此。
+ **自定义策略** – 此选项允许您在替换实例时使用自定义的最小和最大容量范围来设置策略。这种方法可以帮助您在成本和可用性之间取得适当的平衡。

自动扩缩组的默认设置是没有实例维护策略，这会使它以默认行为响应实例维护事件。下表描述了默认行为。


**实例维护事件默认行为**  

|  事件  |  说明  |  默认 行为  | 
| --- | --- | --- | 
|  运行状况检查失败  |  当实例未通过运行状况检查时自动发生。Amazon EC2 Auto Scaling 替换运行状况检查失败的实例。有关运行状况检查失败的原因，请参阅 [自动扩缩组中实例的运行状况检查](ec2-auto-scaling-health-checks.md)。  |  终止并启动。  | 
|  实例刷新  |  在启动实例刷新时发生。根据您的配置，实例刷新可以一次替换一个实例，一次替换多个实例，也可以一次替换全部实例。有关更多信息，请参阅 [使用实例刷新更新自动扩缩组中的实例](asg-instance-refresh.md)。  |  终止并启动。  | 
|  最大实例生命周期  |  当实例达到您为自动扩缩组指定的最大实例生命周期时，会自动发生。Amazon EC2 Auto Scaling 替代已达到实例最大使用寿命的实例。有关更多信息，请参阅 [基于最大实例生命周期替换 Auto Scaling 实例](asg-max-instance-lifetime.md)。  |  终止并启动。  | 
|  再平衡  |  如果存在导致组不平衡的潜在变化，则会自动发生。Amazon EC2 Auto Scaling 在以下情况下重新平衡该组： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/autoscaling/ec2/userguide/instance-maintenance-policy-overview-and-considerations.html)  |  在终止之前启动。 Amazon EC2 Auto Scaling 最多可超出组的规模限制，最高可超过其*最大容量*的 10%。但是，如果您使用容量再平衡，则最多只能超过*所需容量*的 10%。  | 

在以下情况下，Amazon EC2 Auto Scaling 将继续默认终止并启动。因此，当其中一种情况发生时，您的组容量可能会低于您的实例维护策略的下限阈值。
+ 当实例意外终止时，例如由于人为行为。Amazon EC2 Auto Scaling 会立即替换不再运行的实例。有关更多信息，请参阅 [Amazon EC2 运行状况检查](health-checks-overview.md#instance-health-detection)。
+ 当 Amazon EC2 作为计划事件的一部分重启、停止或停用实例时，Amazon EC2 Auto Scaling 可以启动替代实例。有关这些事件的更多信息，请参阅《Amazon EC2 用户指南》**中的[实例的计划事件](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instances-status-check_sched.html)。
+ 当 Amazon EC2 竞价服务启动竞价型实例时会中断，竞价型实例随后被强制终止。

对于竞价型实例，如果您在自动扩缩组上启用了容量再平衡，则该实例可能已经有一个来自我们在启动竞价中断之前启动的不同竞价池中的待处理实例。有关容量重新平衡的工作方式的详细信息，请参阅 [Auto Scaling 进行容量再平衡以替换存在风险的竞价型实例](ec2-auto-scaling-capacity-rebalancing.md)。

但是，由于不能保证竞价型实例保持可用状态，并且可以在两分钟内发出竞价型实例中断通知后终止，因此，如果实例在新实例启动之前中断，则可能会超过您的实例维护政策的下限阈值。

## 核心概念
<a name="instance-maintenance-policy-core-concepts"></a>

在您开始之前，请熟悉以下核心概念和术语：

**所需容量**  
*所需容量*是自动扩缩组在创建时的容量。这也是该组在没有附加任何扩展条件时尝试保持的容量。

**实例维护政策**  
*实例维护策略*控制是否在因实例维护事件而终止现有实例之前先配置实例。它还决定了您的自动扩缩组可能在多大程度上低于或超过所需容量才能同时替换多个实例。

**最高运行正常百分比**  
*最高运行正常百分比*是替换实例时您的自动扩缩组可以增加到的所需容量的百分比。它表示组中可以处于运行状态且运行状况良好或待处理以支持您的工作负载的最大百分比。在控制台中，使用**终止前启动**选项或**自定义策略**选项时，您可以设置最高运行正常百分比。有效值为 100–200%。

**最低运行正常百分比**  
*最低运行正常百分比*是在替换实例时保持正常运行、运行良好且随时可用于支持您的工作负载的所需容量的百分比。成功完成首次运行状况检查并且经过指定的预热时间后，该实例被视为运行状况良好，可以随时使用。在控制台中，使用**终止并启动**选项或**自定义策略**选项时，您可以设置最低运行正常百分比。有效值为 0–100%。  
要更快地替换实例，您可以指定较低的最低运行正常百分比。但是，如果运行正常的实例不足，则可用性可能会降低。我们建议选择一个合理的值，以便在需要替换多个实例的情况下保持可用性。

## 实例预热
<a name="instance-maintenance-policy-instance-warm-up"></a>

如果您的实例在进入`InService`状态后需要时间进行初始化，请为您的自动扩缩组启用默认实例预热。使用默认实例预热，您可以防止实例在准备就绪之前计入最低运行正常百分比。这可以确保 Amazon EC2 Auto Scaling 在终止现有实例之前考虑需要多长时间才能有足够的容量来支持工作负载。

此外，启用默认实例预热功能后，您可以改进用于动态扩展的 Amazon CloudWatch 指标。如果您的 Auto Scaling 组有任何扩展策略，则当该组向外扩展时，它将使用相同的默认预热期，以防止在实例完成初始化之前将其计入 CloudWatch 指标。

有关更多信息，请参阅 [为 Auto Scaling 组设置原定设置实例预热](ec2-auto-scaling-default-instance-warmup.md)。

## 运行状况检查宽限期
<a name="instance-maintenance-policy-health-check-grace-period"></a>

Amazon EC2 Auto Scaling 会根据您的自动扩缩组所使用的运行状况检查的状态来确定实例是否运行正常。有关更多信息，请参阅 [自动扩缩组中实例的运行状况检查](ec2-auto-scaling-health-checks.md)。

为确保这些运行状况检查尽快开始，请勿将组的运行状况检查宽限期设置得过高，而应设置得足够高，以便 Elastic Load Balancing 运行状况检查确定目标是否可用于处理请求。有关更多信息，请参阅 [设置自动扩缩组的运行状况检查宽限期](health-check-grace-period.md)。

## 扩展您的自动扩缩组
<a name="instance-maintenance-policy-scaling-limits"></a>

实例维护策略仅适用于实例维护事件，并不阻止手动或自动扩缩组。

当您的自动扩缩组中附加了扩展策略或计划操作时，它们可以在实例维护事件发生时并行运行。在这种情况下，他们可以增加或减少组的所需容量，但只能在您定义的扩展限制范围内。有关这些限制的更多信息，请参阅[为自动扩缩组设置扩缩限制](asg-capacity-limits.md)。

## 应用场景示例
<a name="instance-maintenance-policy-scenarios"></a>

在典型情况下，您的实例维护策略和所需容量可能如下所示：
+ 最低运行正常百分比 = 90%
+ 最高运行正常百分比 = 120%
+ 所需容量 = 100

在任何实例维护事件中，您的自动扩缩组可能少则有 90 个实例，而多则有 120 个实例。事件发生后，该组恢复到拥有 100 个实例的状态。

当您对具有暖池的自动扩缩组使用实例维护策略时，最低和最高运行正常百分比将分别应用于自动扩缩组和暖池。

例如，假设这是您的配置：
+ 最低运行正常百分比 = 90%
+ 最高运行正常百分比 = 120%
+ 所需容量 = 100
+ 暖池大小 = 10

如果您启动实例刷新以回收该组的实例，Amazon EC2 Auto Scaling 会先替换自动扩缩组中的实例，然后替换温池中的实例。虽然 Amazon EC2 Auto Scaling 仍在努力替换自动扩缩组中的实例，但该组可能少则有 90 个实例，而多则有 120 个实例 完成组的操作后，Amazon EC2 Auto Scaling 可以替换暖池中的实例。发生这种情况时，温暖池可能少则有 9 个实例，而多则有 12 个实例。

# 为自动扩缩组设置实例维护策略
<a name="set-instance-maintenance-policy-on-group"></a>

您可以在创建自动扩缩组时创建实例维护策略。也可以为现有的组创建此功能。

通过为自动扩缩组设置实例维护策略，您不必再为实例刷新功能指定最低和最高运行正常百分比，除非您想覆盖实例维护策略。

在控制台中，Amazon EC2 Auto Scaling 提供了可帮助您入门的选项。

**Topics**
+ [设置实例维护政策](set-instance-maintenance-policy.md)
+ [删除实例维护策略](remove-instance-maintenance-policy.md)

# 设置实例维护政策
<a name="set-instance-maintenance-policy"></a>

要在自动扩缩组上设置实例维护策略，请使用以下方法之一：

------
#### [ Console ]

**为新的组设置实例维护策略（控制台）**

1. 按照 [使用启动模板创建 Auto Scaling 组](create-asg-launch-template.md) 中的说明完成过程中的每个步骤，直到步骤 11。

1. 在**配置组大小和扩展策略**中，对于**所需容量**，输入要启动的初始实例数。

1. 在**扩展**部分的**扩展限制**下，如果**所需容量**的新值大于**所需的最小容量**和**最大所需容量**，则**所需的最大容量**将自动增加到新的所需容量值。您可以按需更改这些限制。

1. 对于**自动扩缩**，请选择是否要创建目标跟踪扩展策略。您也可以在创建自动扩缩组后再创建此策略。

   如果您选择**目标跟踪扩展策略**，请按照 [创建目标跟踪扩缩策略](policy_creating.md) 中的说明创建策略。

1. 在**实例维护策略**部分，选择下列可用选项之一：
   + **终止前启动**：必须先配置新实例，然后才能终止现有实例。对于偏向于可用性而不是成本节约的应用程序来说，这是一个不错的选择。
   + **终止并启动**：在终止现有实例的同时配置新实例。对于偏向于节省成本而不是可用性的应用程序来说，这是一个不错的选择。对于启动容量不应超过当前可用容量的应用程序来说，它也是一个不错的选择。
   + **自定义策略**：此选项允许您在替换实例时使用自定义的最小和最大容量范围来设置策略。这可以帮助您在成本和可用性之间取得适当的平衡。

1. 对于**设置运行正常百分比**，为以下一个或两个字段输入值。根据您在上一步中选择的选项，启用的字段会有所不同。
   + **最小**：设置继续替换实例所需的最低运行正常百分比。
   + **最大**：设置替换实例时可能的最高运行正常百分比。

1. 展开**根据所需容量在更换期间查看容量**部分，以确认**最小值**和**最大值**的值如何适用于您的组。使用的确切值取决于所需的容量值，如果组发生扩缩，该值将发生变化。

1. 继续完成[使用启动模板创建 Auto Scaling 组](create-asg-launch-template.md)中的步骤。

------
#### [ AWS CLI ]

**为新组设置实例维护策略 (AWS CLI)**  
将该`--instance-maintenance-policy`选项添加到[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令中。以下示例对名为的新自动扩缩组设置实例维护策略`my-asg`。

```
aws autoscaling create-auto-scaling-group \
  --launch-template LaunchTemplateName=my-launch-template,Version='1' \
  --auto-scaling-group-name my-asg \
  --min-size 1 \
  --max-size 10 \
  --desired-capacity 5 \
  --default-instance-warmup 20 \
  --instance-maintenance-policy '{
      "MinHealthyPercentage": 90,
      "MaxHealthyPercentage": 120       
    }' \
  --vpc-zone-identifier "subnet-5e6example,subnet-613example,subnet-c93example"
```

------

------
#### [ Console ]

**为现有的组设置实例维护策略（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 在屏幕顶部的导航栏中，选择您在其中创建了自动扩缩组的 AWS 区域 。

1. 选中 Auto Scaling 组旁边的复选框。

   这时将在页面底部打开一个拆分窗格。

1. 在**详细信息**选项卡上，选择**实例维护策略**，**编辑**。

1. 要为组设置实例维护策略，请选择下列可用选项之一：
   + **终止前启动**：必须先配置新实例，然后才能终止现有实例。对于偏向于可用性而不是成本节约的应用程序来说，这是一个不错的选择。
   + **终止并启动**：在终止现有实例的同时配置新实例。对于偏向于节省成本而不是可用性的应用程序来说，这是一个不错的选择。对于启动容量不应超过当前可用容量的应用程序来说，它也是一个不错的选择。
   + **自定义策略**：此选项允许您在替换实例时使用自定义的最小和最大容量范围来设置策略。这可以帮助您在成本和可用性之间取得适当的平衡。

1. 对于**设置运行正常百分比**，为以下一个或两个字段输入值。根据您在上一步中选择的选项，启用的字段会有所不同。
   + **最小**：设置继续替换实例所需的最低运行正常百分比。
   + **最大**：设置替换实例时可能的最高运行正常百分比。

1. 展开**根据所需容量在更换期间查看容量**部分，以确认**最小值**和**最大值**的值如何适用于您的组。使用的确切值取决于所需的容量值，如果组发生扩缩，该值将发生变化。

1. 选择**更新**。

------
#### [ AWS CLI ]

**为现有组设置实例维护策略 (AWS CLI)**  
将该`--instance-maintenance-policy`选项添加到[update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html)命令中。以下示例为指定的自动扩缩组设置实例维护策略。

```
aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \
  --instance-maintenance-policy '{
      "MinHealthyPercentage": 90,
      "MaxHealthyPercentage": 120       
    }'
```

------

# 删除实例维护策略
<a name="remove-instance-maintenance-policy"></a>

如果您想停止在自动扩缩组使用实例维护策略，则可以将其删除。

------
#### [ Console ]

**删除实例维护策略（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 在屏幕顶部的导航栏中，选择您在其中创建了自动扩缩组的 AWS 区域 。

1. 选中 Auto Scaling 组旁边的复选框。

   这时将在页面底部打开一个拆分窗格。

1. 在**详细信息**选项卡上，选择**实例维护策略**，**编辑**。

1. 选择**无实例维护策略**。

1. 选择**更新**。

------
#### [ AWS CLI ]

**删除实例维护策略 (AWS CLI)**  
将该`--instance-maintenance-policy`选项添加到[update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html)命令中。以下示例从指定的自动扩缩组删除实例维护策略。

```
aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \
  --instance-maintenance-policy '{
      "MinHealthyPercentage": -1,
      "MaxHealthyPercentage": -1       
    }'
```

------

# Amazon EC2 Auto Scaling 生命周期钩子
<a name="lifecycle-hooks"></a>

Amazon EC2 Auto Scaling 能够将生命周期钩子添加到您的 Auto Scaling 组。这些钩子使 Auto Scaling 组可让您创建解决方案，这些解决方案了解 Auto Scaling 实例生命周期中的事件，然后在发生相应的生命周期事件时对实例执行自定义操作。生命周期钩子提供了指定的时间（预设情况下为 1 小时），以在实例转换到下一个状态之前等待操作完成。

作为将生命周期钩子与 Auto Scaling 实例一起使用的示例：
+ 在发生向外扩展事件时，您新启动的实例将完成其启动序列并转换到等待状态。该实例处于等待状态时，它将运行脚本以下载和安装您的应用程序所需的软件包，确保您的实例在开始接收流量前已完全准备好。脚本安装完软件后，它会发送 **complete-lifecycle-action** 命令以继续。
+ 发生缩减事件时，生命周期挂钩会在实例终止之前将其暂停，并使用 Amazon 向您发送通知。 EventBridge当实例处于等待状态时，您可以在实例完全终止之前调用 AWS Lambda 函数或连接到该实例来下载日志或其他数据。

生命周期钩子的一个常见用途是控制何时在 Elastic Load Balancing 中注册实例。通过向您的 Auto Scaling 组添加启动生命周期钩子，您可以确保引导启动脚本已成功完成，并且实例上的应用程序在生命周期钩子结束时准备好接受流量。

**Topics**
+ [生命周期钩子可用性](#lifecycle-hooks-availability)
+ [注意事项和限制](#lifecycle-hook-considerations)
+ [相关资源](#lifecycle-hook-related-resources)
+ [生命周期挂钩在自动扩缩组中如何工作](lifecycle-hooks-overview.md)
+ [做好准备添加生命周期钩子](prepare-for-lifecycle-notifications.md)
+ [使用实例生命周期策略控制实例保留](instance-lifecycle-policy.md)
+ [检索目标生命周期状态](retrieving-target-lifecycle-state-through-imds.md)
+ [向自动扩缩组添加生命周期挂钩](adding-lifecycle-hooks.md)
+ [在自动扩缩组中完成生命周期操作](completing-lifecycle-hooks.md)
+ [教程：使用实例元数据检索生命周期状态](tutorial-lifecycle-hook-instance-metadata.md)
+ [教程：配置调用 Lambda 函数的生命周期钩子](tutorial-lifecycle-hook-lambda.md)

## 生命周期钩子可用性
<a name="lifecycle-hooks-availability"></a>

下表列出了可用于各种方案的生命周期钩子。


| 事件 | 实例启动或终止¹ | [最大实例生命周期](asg-max-instance-lifetime.md)：替换实例 | [实例刷新](asg-instance-refresh.md)：替换实例 | [容量再平衡](ec2-auto-scaling-capacity-rebalancing.md)：替换实例 | [温水池](ec2-auto-scaling-warm-pools.md)：进入和离开温水池的实例 | 
| --- | --- | --- | --- | --- | --- | 
| 实例启动 | ✓ | ✓ | ✓ | ✓ | ✓ | 
| 实例终止 | ✓ | ✓ | ✓ | ✓ | ✓ | 

¹ 适用于所有启动和终止，无论是自动启动还是手动启动，例如当您调用 `SetDesiredCapacity` 或 `TerminateInstanceInAutoScalingGroup` 操作时。当您附加或分离实例、将实例移入或移出备用模式或使用强制删除选项删除组时，不适用。

## 生命周期钩子的注意事项和限制
<a name="lifecycle-hook-considerations"></a>

操作生命周期挂钩时，请记住以下注意事项和限制：
+ Amazon EC2 Auto Scaling 提供了自己的生命周期，以帮助管理 Auto Scaling 组。此生命周期与其他 EC2 实例的生命周期不同。有关更多信息，请参阅 [Amazon EC2 Auto Scaling 实例生命周期](ec2-auto-scaling-lifecycle.md)。暖池中的实例也有自己的生命周期，如 [暖池中实例的生命周期状态转换](warm-pool-instance-lifecycle.md#lifecycle-state-transitions) 中所述。
+  默认情况下，终止生命周期挂钩会尽力运行。如果终止生命周期挂钩超时或被放弃，Amazon EC2 Auto Scaling 会立即终止该实例。您可以将终止生命周期挂钩与用于实例保留的实例生命周期策略相结合。有关更多信息，请参阅 [使用实例生命周期策略控制实例保留](instance-lifecycle-policy.md)。
+ 您可以将生命周期钩子与竞价型实例一起使用，但生命周期钩子并不禁止在容量不再可用的情况下终止实例，这种情况会随时发生，并显示两分钟中断通知。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[竞价型实例中断情况](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)。但是，您可以启用“Capacity Rebalancing”（容量再平衡）以主动替换已从 Amazon EC2 Spot 服务获得再平衡建议的竞价型实例，该信号是在竞价型实例处于较高中断风险时发送的。有关更多信息，请参阅 [Auto Scaling 进行容量再平衡以替换存在风险的竞价型实例](ec2-auto-scaling-capacity-rebalancing.md)。
+ 实例可以在有限的时间里保持等待状态。生命周期钩子的默认超时时间为一小时（检测信号超时时间）。此外，还有一个全局超时时间，它指定您可以将实例保持在等待状态的最长时间。全局超时时间为 48 小时或检测信号超时时间的 100 倍，以较小者为准。
+ 生命周期挂钩的结果可以是放弃或继续。如果实例正在启动，继续指示您的操作已成功，并且 Amazon EC2 Auto Scaling组可将实例投入使用。否则，“放弃”指示您的自定义操作未成功，并且可终止并替代实例。如果实例正在终止，放弃和继续都允许终止实例。不过，放弃将停止任何剩余操作（例如，其他生命周期钩子），而继续将允许完成任何其他生命周期钩子。
+ Amazon EC2 Auto Scaling 会限制在生命周期钩子始终失败时允许实例启动的速率，因此请务必测试并修复生命周期操作中的任何永久性错误。
+ 使用 AWS CLI CloudFormation、或 SDK 创建和更新生命周期挂钩提供了从中创建生命周期挂钩时不可用的选项 AWS 管理控制台。例如，用于指定 SNS 主题或 SQS 队列的 ARN 的字段不会出现在控制台中，因为 Amazon EC2 Auto Scaling 已经向亚马逊发送了事件。 EventBridge可以根据需要筛选这些事件并将其重定向到 Lambda、Amazon SNS 和亚马逊 SQS 等 AWS 服务。
+ 您可以在创建 Auto Scaling 群组时向该组添加多个生命周期挂钩，方法是使用 AWS CLI CloudFormation、或 SDK 调用 [CreateAutoScalingGroup](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CreateAutoScalingGroup.html)API。但是，如果指定，每个钩子必须具有相同的通知目标和 IAM 角色。要创建具有不同通知目标和不同角色的生命周期挂钩，请在对 [PutLifecycleHook](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_PutLifecycleHook.html)API 的单独调用中逐个创建生命周期挂钩。
+ 如果您为实例启动添加了生命周期挂钩，那么运行状况检查宽限期将在实例达到 `InService` 状态时立即开始。有关更多信息，请参阅 [设置自动扩缩组的运行状况检查宽限期](health-check-grace-period.md)。

**扩展注意事项**
+ 动态扩展策略会根据跨多个实例聚合的 CloudWatch 指标数据（例如 CPU 和网络 I/O）向内和向外扩展。在横向扩展时，Amazon EC2 Auto Scaling 不会立即将新实例计入自动扩缩组的聚合实例指标。它会一直等到实例达到 `InService` 状态并且实例预热完成时再计入。有关默认实例预热主题的更多信息，请参阅 [扩缩性能注意事项](ec2-auto-scaling-default-instance-warmup.md#scaling-performance-considerations)。
+ 在横向缩减时，聚合实例指标可能无法立即反映出终止实例的移除情况。Amazon EC2 Auto Scaling 终止工作流程开始后不久，终止实例将停止作为该组聚合实例指标的一部分计入。
+ 如果调用生命周期挂钩，由简单扩缩策略引发的扩缩活动将暂停，直至生命周期操作完成并且冷却时间过期。为冷却时间设置较长的时间间隔意味着，恢复扩展将会需要更长的时间。有关更多信息，请参阅冷却主题中的[生命周期挂钩可能会导致额外的延迟](ec2-auto-scaling-scaling-cooldowns.md#cooldowns-lifecycle-hooks)。通常，如果您可以改用步进扩缩策略或目标跟踪扩缩策略，我们建议不要使用简单扩缩策略。

## 相关资源
<a name="lifecycle-hook-related-resources"></a>

有关介绍视频，请参阅 re [AWS : Invent 2018：开启 Amazon EC2 Auto Scaling 让容量管理变得简单](https://youtu.be/PideBMIcwBQ?t=469)。*YouTube*

我们提供了几个 JSON 和 YAML 模板片段，您可以使用它们来了解如何在 CloudFormation 堆栈模板中声明生命周期挂钩。有关更多信息，请参阅《*AWS CloudFormation 用户指南*》中的[AWS::AutoScaling::LifecycleHook](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html)参考资料。

您也可以访问我们的[GitHub存储库](https://github.com/aws-samples/amazon-ec2-auto-scaling-group-examples)，下载生命周期挂钩的示例模板和用户数据脚本。

有关生命周期挂钩的使用示例，请参阅以下博客帖子。
+ [使用 Lambda 和 Amazon EC2 运行命令为扩缩实例构建备用系统](https://aws.amazon.com/blogs/compute/building-a-backup-system-for-scaled-instances-using-aws-lambda-and-amazon-ec2-run-command/)
+ [在终止 EC2 Auto Scaling 实例之前运行代码](https://aws.amazon.com/blogs/infrastructure-and-automation/run-code-before-terminating-an-ec2-auto-scaling-instance/)。

# 生命周期挂钩在自动扩缩组中如何工作
<a name="lifecycle-hooks-overview"></a>

一个 Amazon EC2 实例从其启动一直到其终止，将经过不同的状态转换。您可以为您的自动扩缩组创建自定义操作，以便在实例因生命周期挂钩而转换到等待状态时执行操作。

下图显示使用生命周期挂钩进行横向扩展和横向缩减时，Auto Scaling 实例状态之间的转换。

![\[使用生命周期挂钩进行横向扩展和横向缩减时，Auto Scaling 实例状态之间的转换。\]](http://docs.aws.amazon.com/zh_cn/autoscaling/ec2/userguide/images/how-lifecycle-hooks-work.png)


如上图中所示：

1. Auto Scaling 组响应向外扩展事件并开始启动实例。

1. 生命周期钩子将实例置于等待状态 (`Pending:Wait`)，然后执行自定义操作。

   实例将保持等待状态，直到您完成生命周期操作，或者直到超时时段结束。预设情况下，实例将保持等待状态 1 小时，然后 Auto Scaling 组继续启动过程 (`Pending:Proceed`)。如果您需要更长时间，可通过记录检测信号来重新开始超时时段。如果您在自定义操作已完成且超时时段尚未到期时完成生命周期操作，则该时间段结束，Auto Scaling 组将继续启动过程。

1. 实例进入 `InService` 状态并开始运行状况检查宽限期。但是，在实例达到 `InService` 状态之前，如果 Auto Scaling 组与 Elastic Load Balancing 负载均衡器关联，则实例将在负载均衡器中注册，然后负载均衡器开始检查其运行状况。运行状况检查宽限期结束后，Amazon EC2 Auto Scaling 开始检查实例的运行状况。

1. Auto Scaling 组响应缩减事件并开始终止实例。如果 Auto Scaling 组与 Elastic Load Balancing 一起使用，则终止实例要首先从负载均衡器中取消注册。如果为负载均衡器启用了 Connection Draining，则实例将停止接受新连接并等待现有连接耗尽，然后再完成取消注册过程。

1. 生命周期钩子将实例置于等待状态 (`Terminating:Wait`)，然后执行自定义操作。

   该实例将保持等待状态，直到您完成生命周期操作，或者直至超时期结束（预设情况下为 1 小时）。完成生命周期钩子或超时时段过期后，实例将转换到下一个状态 (`Terminating:Proceed`)。

1. 实例已终止。

**重要**  
暖池中的实例也有自己的生命周期以及相对应的等待状态，如 [暖池中实例的生命周期状态转换](warm-pool-instance-lifecycle.md#lifecycle-state-transitions) 中所述。

## 正在更换根卷的实例的生命周期状态转换
<a name="rvr-lifecycle-state-transitions"></a>

下图显示了使用生命周期挂钩替换根卷时 Auto Scaling 实例状态之间的过渡：

![\[当您使用生命周期挂钩替换根卷时，Auto Scaling 实例状态之间的转换。\]](http://docs.aws.amazon.com/zh_cn/autoscaling/ec2/userguide/images/root-volume-replacement-lifecycle-states.png)


如上图中所示：

1. Auto Scaling 组对实例刷新做出响应，并选择一个实例进行根卷替换。实例进入`ReplacingRootVolume`状态。如果实例已向负载均衡器注册，则该实例将从负载均衡器中注销。

1. 生命周期钩子将实例置于等待状态 (`ReplacingRootVolume:Wait`)，然后执行自定义操作。实例将保持等待状态，直到您完成生命周期操作，或者直到超时时段结束。如果您在自定义操作已完成且超时时间尚未到期时完成生命周期操作，则超时期限将结束，Auto Scaling 组将继续根卷更换过程。

1. 实例完成根卷更换并进入`RootVolumeReplaced`状态。

1. 实例进入`Pending`状态。

1. 生命周期钩子将实例置于等待状态 (`Pending:Wait`)，然后执行自定义操作。在您完成生命周期操作或超时时间结束之前，实例将保持等待状态。完成生命周期钩子或超时时段过期后，实例将转换到下一个状态 (`Pending:Proceed`)。

1. 实例进入`InService`状态。但是，在实例进入`InService`状态之前，如果 Auto Scaling 组与 Elastic Load Balancing 负载均衡器相关联，则该实例已在负载均衡器中注册。

# 做好准备向 Auto Scaling 组添加生命周期钩子
<a name="prepare-for-lifecycle-notifications"></a>

在向 Auto Scaling 组添加生命周期钩子之前，请确保正确用户数据脚本或通知目标。
+ 要在实例启动时运行用户数据脚本以对实例执行自定义操作，无需配置通知目标。但是，您必须已创建指定用户数据脚本并将其与 Auto Scaling 组关联的启动模板或启动配置。有关用户数据脚本的更多信息，请参阅《Amazon EC2 用户指南》**中的[启动时在 Linux 实例上运行命令](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)。
+ 要在生命周期操作完成时向 Amazon EC2 Auto Scaling 发送信号，您必须将 [CompleteLifecycleAction](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CompleteLifecycleAction.html)API 调用添加到脚本中，并且必须手动创建一个 IAM 角色，其策略允许 Auto Scaling 实例调用此 API。您的启动模板或启动配置必须使用在启动时附加到 Amazon EC2 实例的 IAM 实例配置文件指定此角色。有关更多信息，请参阅[在自动扩缩组中完成生命周期操作](completing-lifecycle-hooks.md)和[在 Amazon EC2 实例上运行的应用程序的 IAM 角色](us-iam-role.md)。
+ 要允许 Lambda 在生命周期操作完成时向 Amazon EC2 Auto Scaling 发出信号，您必须在函数代码中添加 [CompleteLifecycleAction](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CompleteLifecycleAction.html)API 调用。您还必须将 IAM policy 附加到函数的执行角色，以授予 Lambda 完成生命周期操作的权限。有关更多信息，请参阅 [教程：配置调用 Lambda 函数的生命周期钩子](tutorial-lifecycle-hook-lambda.md)。
+ 要使用 Amazon SNS 或 Amazon SQS 之类的服务执行自定义操作，您必须已创建 SNS 主题或 SQS 队列并准备好其 Amazon Resource Name (ARN)。您还必须已创建允许 Amazon EC2 Auto Scaling 访问您的 SNS 主题或 SQS 目标的 IAM 角色，并已准备好其 ARN。有关更多信息，请参阅 [为生命周期通知配置通知目标](#lifecycle-hook-notification-target)。
**注意**  
默认情况下，当您在控制台中添加生命周期挂钩时，Amazon EC2 Auto Scaling 会向亚马逊发送生命周期事件通知 EventBridge。建议使用 EventBridge 或用户数据脚本。要创建直接向 Amazon SNS、Amazon SQS 或发送通知的生命周期挂钩，请使用 AWS CLI、 AWS Lambda或软件开发工具包添加生命周期挂钩。 AWS CloudFormation

## 为生命周期通知配置通知目标
<a name="lifecycle-hook-notification-target"></a>

您可以向 Auto Scaling 组添加生命周期钩子，以便在实例进入等待状态时执行自定义操作。您可以选择目标服务，以根据您的首选开发方法执行这些操作。

实现生命周期挂钩的通知目标有四种不同的方法：
+ **Amazon EventBridge** — 接收通知并执行您想要的操作。
+ **Amazon Simple Notiﬁcation Service（Amazon SNS）**：创建发布通知的主题。客户端可以订阅 SNS 主题并使用支持的协议接收已发布的消息。
+ **Amazon Simple Queue Service（Amazon** SQS）：通过轮询模型交换消息。
+ **AWS Lambda**：调用执行所需操作的 Lambda 函数。

作为最佳实践，我们建议您使用 EventBridge。发送到亚马逊 SNS 和 Amazon SQS 的通知包含的信息与 Amazon EC2 Auto Scaling 发送到的通知相同。 EventBridge以前 EventBridge，标准做法是向 SNS 或 SQS 发送通知，然后将其他服务与 SNS 或 SQS 集成以执行编程操作。如今，它 EventBridge 为您提供了更多可以定位的服务选项，并使使用无服务器架构更轻松地处理事件。

请记住，如果您的启动模板或启动配置中有在实例启动时配置实例的用户数据脚本，则无需接收通知即可对实例执行自定义操作。

以下过程介绍了如何设置通知目标。

**Topics**
+ [使用将通知发送到 Lambda EventBridge](#cloudwatch-events-notification)
+ [使用 Amazon SNS 接收通知](#sns-notifications)
+ [使用 Amazon SQS 接收通知](#sqs-notifications)
+ [将通知 AWS Lambda 直接发送到](#lambda-notification)
+ [测试通知消息示例](#notification-message-example)

**重要**  
与生命周期挂钩一起使用的 EventBridge 规则、Lambda 函数、Amazon SNS 主题和 Amazon SQS 队列必须始终位于您创建 Auto Scaling 组的同一区域。

### 使用将通知发送到 Lambda EventBridge
<a name="cloudwatch-events-notification"></a>

您可以配置 EventBridge 规则，以便在实例进入等待状态时调用 Lambda 函数。Amazon EC2 Auto Scaling 会向其发送 EventBridge 有关正在启动或终止的实例的生命周期事件通知，以及一个可用于控制生命周期操作的令牌。有关这些事件的示例，请参阅 [Amazon EC2 Auto Scaling 事件参考](ec2-auto-scaling-event-reference.md)。

**注意**  
当您使用创建事件规则时，控制台会自动添加授予 EventBridge 调用 Lambda 函数的权限所必需的 IAM 权限。 AWS 管理控制台 如果您使用 AWS CLI创建事件规则，则需要明确授予此权限。  
有关如何在 EventBridge 控制台中创建事件规则的信息，请参阅《[亚马逊* EventBridge 用户指南》中的创建对事件做出反应的 Amazon EventBridge* 规则](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html)。  
- 或者 -   
有关面向控制台用户的入门教程，请参阅[教程：配置调用 Lambda 函数的生命周期钩子](tutorial-lifecycle-hook-lambda.md)。本教程向您展示如何创建一个简单的 Lambda 函数，该函数用于监听启动事件并将其写入日志中。 CloudWatch 

**创建调用 Lambda 函数的 EventBridge 规则**

1. 通过使用 [Lambda 控制台](https://console.aws.amazon.com/lambda/home#/functions)创建 Lambda 函数，并记下其 Amazon Resource Name (ARN)。例如 `arn:aws:lambda:region:123456789012:function:my-function`。您需要使用 ARN 来创建目标。 EventBridge 有关更多信息，请参阅 *AWS Lambda 开发人员指南*中的 [Lambda 入门](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)。

1. 要创建匹配实例创建事件的规则，请使用以下 [put-rule](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/events/put-rule.html) 命令。

   ```
   aws events put-rule --name my-rule --event-pattern file://pattern.json --state ENABLED
   ```

   以下示例显示了实例启动生命周期操作的 `pattern.json`。将中的**italics**文本替换为您的 Auto Scaling 组的名称。

   ```
   {
     "source": [ "aws.autoscaling" ],
     "detail-type": [ "EC2 Instance-launch Lifecycle Action" ],
     "detail": {
         "AutoScalingGroupName": [ "my-asg" ]
      }
   }
   ```

   如果命令成功运行，则使用 EventBridge 规则的 ARN 进行响应。记下此 ARN。您需要在第 4 步中输入此信息。

   要创建与其他事件匹配的规则，请修改事件模式。有关更多信息，请参阅 [用于处理 EventBridge Auto Scaling 事件](automating-ec2-auto-scaling-with-eventbridge.md)。

1. 要指定要用作规则目标的 Lambda 函数，请使用以下 [put-targets](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/events/put-targets.html) 命令。

   ```
   aws events put-targets --rule my-rule --targets Id=1,Arn=arn:aws:lambda:region:123456789012:function:my-function
   ```

   在前面的命令中，*my-rule*是您在步骤 2 中为规则指定的名称，`Arn`参数的值是您在步骤 1 中创建的函数的 ARN。

1. 要添加允许规则调用您的 Lambda 函数的权限，请使用以下 Lambda [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) 命令。此命令将 EventBridge 服务主体 (`events.amazonaws.com`) 和范围权限信任到指定规则。

   ```
   aws lambda add-permission --function-name my-function --statement-id my-unique-id \
     --action 'lambda:InvokeFunction' --principal events.amazonaws.com --source-arn arn:aws:events:region:123456789012:rule/my-rule
   ```

   在上述命令中：
   + *my-function*是您希望规则用作目标的 Lambda 函数的名称。
   + *my-unique-id*是您定义的唯一标识符，用于描述 Lambda 函数策略中的语句。
   + `source-arn`是规则的 ARN。 EventBridge 

   如果命令成功运行，则您将收到类似于以下内容的输出：

   ```
   {
     "Statement": "{\"Sid\":\"my-unique-id\",
       \"Effect\":\"Allow\",
       \"Principal\":{\"Service\":\"events.amazonaws.com\"},
       \"Action\":\"lambda:InvokeFunction\",
       \"Resource\":\"arn:aws:lambda:us-west-2:123456789012:function:my-function\",
       \"Condition\":
         {\"ArnLike\":
           {\"AWS:SourceArn\":
            \"arn:aws:events:us-west-2:123456789012:rule/my-rule\"}}}"
   }
   ```

   `Statement` 值是已添加到 Lambda 函数策略的语句的 JSON 字符串版本。

1. 在遵循以上说明操作后，继续[向自动扩缩组添加生命周期挂钩](adding-lifecycle-hooks.md) 作为下一步。

### 使用 Amazon SNS 接收通知
<a name="sns-notifications"></a>

您可以使用 Amazon SNS 设置通知目标（SNS 主题），以便在生命周期操作发生时接收通知。然后，Amazon SNS 将通知发送给订阅的收件人。确认订阅前，向主题发布的通知不会发送至收件人。

**使用 Amazon SNS 设置通知**

1. 通过使用 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/)或以下 [create-topic](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/create-topic.html) 命令创建 Amazon SNS 主题。确保该主题与您使用的 Auto Scaling 组位于同一区域。有关更多信息，请参阅 *Amazon Simple Notification Service 开发人员指南*中的 [Amazon SNS 入门](https://docs.aws.amazon.com/sns/latest/dg/sns-getting-started.html)。

   ```
   aws sns create-topic --name my-sns-topic
   ```

1. 记录主题 Amazon Resource Name (ARN)，例如 `arn:aws:sns:region:123456789012:my-sns-topic`。您需要它来创建生命周期钩子。

1. 创建 IAM 服务角色，以授予 Amazon EC2 Auto Scaling 访问您的 Amazon SNS 通知目标的权限。

    **向 Amazon EC2 Auto Scaling 授予访问您的 SNS 主题的权限** 

   1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

   1. 在左侧的导航窗格中，选择**角色**。

   1. 选择**创建角色**。

   1. 对于**选择可信实体**，选择 **AWS 服务**。

   1. 对于您的使用案例，在**其他 AWS 服务的使用案例**下，选择 **EC2 Auto Scaling**，然后选择 **EC2 Auto Scaling 通知访问权限**。

   1. 选择 **Next**（下一步）两次，以前往 **Name, review, and create**（命名、检查和创建）页面。

   1. 对于 **Role name**（角色名称），输入角色的名称（例如 **my-notification-role**），然后选择 **Create role**（创建角色）。

   1. 在 **Roles (角色)** 页面中，选择刚刚创建的角色以打开 **Summary (摘要)** 页面。记下角色的 **ARN**。例如 `arn:aws:iam::123456789012:role/my-notification-role`。您需要它来创建生命周期钩子。

1. 在遵循以上说明操作后，继续[添加生命周期钩子 (AWS CLI)](adding-lifecycle-hooks.md#adding-lifecycle-hooks-aws-cli) 作为下一步。

### 使用 Amazon SQS 接收通知
<a name="sqs-notifications"></a>

您可以使用 Amazon SQS 设置通知目标以便在生命周期操作开始时接收消息。然后，队列使用者必须轮询 SQS 队列，以便对这些通知执行操作。

**重要**  
FIFO 队列与生命周期挂钩不兼容。

**使用 Amazon SQS 设置通知**

1. 使用 [Amazon SQS 控制台](https://console.aws.amazon.com/sqs/)创建 Amazon SQS 队列。确保队列与您正在使用的 Auto Scaling 组位于同一个区域。有关更多信息，请参阅 *Amazon Simple Queue Service 开发人员指南*中的 [Amazon SQS 入门](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-getting-started.html)。

1. 记录队列 ARN，例如 `arn:aws:sqs:us-west-2:123456789012:my-sqs-queue`。您需要它来创建生命周期钩子。

1. 创建 IAM 服务角色，以授予 Amazon EC2 Auto Scaling 访问您的 Amazon SQS 通知目标的权限。

    **向 Amazon EC2 Auto Scaling 授予您对 SQS 队列的访问权限** 

   1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

   1. 在左侧的导航窗格中，选择**角色**。

   1. 选择**创建角色**。

   1. 对于**选择可信实体**，选择 **AWS 服务**。

   1. 对于您的使用案例，在**其他 AWS 服务的使用案例**下，选择 **EC2 Auto Scaling**，然后选择 **EC2 Auto Scaling 通知访问权限**。

   1. 选择 **Next**（下一步）两次，以前往 **Name, review, and create**（命名、检查和创建）页面。

   1. 对于 **Role name**（角色名称），输入角色的名称（例如 **my-notification-role**），然后选择 **Create role**（创建角色）。

   1. 在 **Roles (角色)** 页面中，选择刚刚创建的角色以打开 **Summary (摘要)** 页面。记下角色的 **ARN**。例如 `arn:aws:iam::123456789012:role/my-notification-role`。您需要它来创建生命周期钩子。

1. 在遵循以上说明操作后，继续[添加生命周期钩子 (AWS CLI)](adding-lifecycle-hooks.md#adding-lifecycle-hooks-aws-cli) 作为下一步。

### 将通知 AWS Lambda 直接发送到
<a name="lambda-notification"></a>

在生命周期操作开始时，可以使用 Lambda 函数作为通知目标。

**将通知 AWS Lambda 直接发送到**

1. 打开 Lambda 控制台的[函数](https://console.aws.amazon.com/lambda/home#/functions)页面。

1. 选择所需的 Lambda 函数。

   若要创建新的 Lambda 函数，请参阅[创建 Lambda 函数](lambda-custom-termination-policy.md#lambda-custom-termination-policy-create-function)

1. 接下来，选择**配置**选项卡，然后选择**权限**。

1. 向下滚动到**基于资源的策略**，然后选择**添加权限**。基于资源的策略用于向在策略中指定的委托人授予调用函数的权限。在这种情况下，委托人将是与 Auto Scaling 组关联的 [Amazon EC2 Auto Scaling 服务关联角色](https://docs.aws.amazon.com/autoscaling/ec2/userguide/autoscaling-service-linked-role.html)。

1. 在**策略语句**部分中，配置您的权限：

   1. 选择 **AWS 账户**。

   1. 适用于**委托人**中，输入调用服务链接角色的 ARN，例如 **arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling**。

   1. 在 “**操作”** 中，选择 **lambda: InvokeFunction**。

   1. 对于**声明 ID**，输入唯一的声明 ID，如 **AllowInvokeByAutoScaling**。

   1. 选择**保存**。

1. 在遵循以上说明操作后，继续[添加生命周期钩子 (AWS CLI)](adding-lifecycle-hooks.md#adding-lifecycle-hooks-aws-cli) 作为下一步。

### 测试通知消息示例
<a name="notification-message-example"></a>

本节提供了亚马逊 SNS、亚马逊 SQS 和的通知示例。 AWS Lambda

当实例处于等待状态时，会向 Amazon SNS、Amazon SQS 和通知目标发布一条消息。 AWS Lambda 

消息包含以下信息：
+ `Origin`：EC2 实例的来源。
+ `Destination`：EC2 实例的目的地。
+ `LifecycleActionToken` — 生命周期操作令牌。
+ `AccountId`— AWS 账户 身份证。
+ `AutoScalingGroupName` — Auto Scaling 组的名称。
+ `LifecycleHookName` — 生命周期钩子的名称。
+ `EC2InstanceId` — EC2 实例的 ID。
+ `LifecycleTransition` — 生命周期钩子类型。
+ `NotificationMetadata` — 通知元数据。

以下是通知消息示例。

```
Service: AWS Auto Scaling
Time: 2021-01-19T00:36:26.533Z
RequestId: 18b2ec17-3e9b-4c15-8024-ff2e8ce8786a
Origin: EC2
Destination: AutoScalingGroup
LifecycleActionToken: 71514b9d-6a40-4b26-8523-05e7ee35fa40
AccountId: 123456789012
AutoScalingGroupName: my-asg
LifecycleHookName: my-hook
EC2InstanceId: i-0598c7d356eba48d7
LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING
NotificationMetadata: hook message metadata
```

#### 测试通知消息示例
<a name="test-notification-message-example"></a>

首次添加生命周期钩子时，将向通知目标发布测试通知消息。以下是测试通知消息示例。

```
Service: AWS Auto Scaling
Time: 2021-01-19T00:35:52.359Z
RequestId: 18b2ec17-3e9b-4c15-8024-ff2e8ce8786a
Event: autoscaling:TEST_NOTIFICATION
AccountId: 123456789012
AutoScalingGroupName: my-asg
AutoScalingGroupARN: arn:aws:autoscaling:us-west-2:123456789012:autoScalingGroup:042cba90-ad2f-431c-9b4d-6d9055bcc9fb:autoScalingGroupName/my-asg
```

**注意**  
有关从 Amazon EC2 Auto Scaling 发送到的事件的示例 EventBridge，请参阅[Amazon EC2 Auto Scaling 事件参考](ec2-auto-scaling-event-reference.md)。

# 使用实例生命周期策略控制实例保留
<a name="instance-lifecycle-policy"></a>

 实例生命周期策略提供保护，防止在终止生命周期操作被放弃时 Amazon EC2 Auto Scaling 终止。与单独的生命周期挂钩不同，实例生命周期策略旨在确保在正常关闭过程未成功完成时，实例会进入保留状态。

## 何时使用实例生命周期策略
<a name="when-to-use-instance-lifecycle-policies"></a>

 如果应用程序的正常关闭不是可选的，而是强制性的，并且失败的关闭需要手动干预，则使用实例生命周期策略。常见使用案例包括：
+  有状态的应用程序，在终止之前必须完成数据持久化。
+  需要延长耗尽时间且可能超过 48 小时生命周期挂钩超时上限的应用程序。
+  处理敏感数据的工作负载，如果清理失败或不完整，可能会导致数据丢失或损坏。
+  突然关闭会影响可用性的关键任务服务。

 有关如何优雅地处理实例终止的更多信息，请参阅[设计您的应用程序以妥善处理实例终止](gracefully-handle-instance-termination.md)。

## 实例生命周期策略如何与终止生命周期挂钩配合使用
<a name="how-instance-lifecycle-policies-work"></a>

 实例生命周期策略与终止生命周期挂钩结合使用，不能作为替代品。该过程分为几个阶段：

1.  **终止生命周期操作将执行。**当 Amazon EC2 Auto Scaling 选择要终止的实例时，系统会调用您的终止生命周期挂钩，并且该实例进入开始执行终止生命周期操作的`Terminating:Wait`状态。

1.  **优雅的关机尝试开始了。**您的应用程序，无论是在实例上运行还是通过控制平面运行，都会收到终止生命周期操作通知并开始正常关闭过程，例如耗尽连接、完成正在进行的工作或传输数据。

1.  **终止生命周期操作已完成。**终止生命周期操作可能以`CONTINUE`或`ABANDON`结果结束。

1.  **实例生命周期策略对情况进行评估。**如果未配置实例生命周期策略，即使终止生命周期操作已完成并`ABANDON`产生结果，实例也会立即终止。将实例生命周期策略配置为保持实例处于开启状态后`TerminateHookAbandon`，如果终止生命周期操作已完成并`ABANDON`产生结果，则实例将进入保留状态。

1.  **保留的实例等待手动操作。**处于保留状态的实例继续产生标准的 Amazon EC2 费用。这些实例不计入您的 Auto Scaling 组的所需容量，因此 Auto Scaling 会启动替换实例以保持所需的大小。Auto Scaling 功能（例如实例刷新和最大实例生命周期）也会忽略保留的实例。这允许您在手动终止实例之前手动完成清理程序、恢复数据或调查自动关闭失败的原因。

1.  **发生手动终止。**在您对保留的实例完成必要操作后，您需要调用 `TerminateInstanceInAutoScalingGroup` API 来终止该实例。

# 配置实例保留
<a name="configure-instance-retention"></a>

设置您的 Amazon EC2 Auto Scaling 组，以便在终止生命周期操作失败时保留实例。

 要在 Auto Scaling 组中使用实例生命周期策略，还必须配置终止生命周期挂钩。如果您配置了实例生命周期策略，但没有任何终止生命周期挂钩，则该策略无效。实例生命周期策略仅在终止生命周期操作被放弃时适用，而当终止生命周期操作成功完成并`CONTINUE`产生结果时不适用。

 实例生命周期策略使用保留触发器来确定何时保留实例。在几种情况下，`TerminateHookAbandon`触发器会导致留存：
+  当你使用`ABANDON`结果明确调用 [ CompleteLifecycleAction](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CompleteLifecycleAction.html)API 时。
+  当具有默认结果`ABANDON`的终止生命周期操作因未收到心跳超时而达到心跳超时时。
+  当终止生命周期操作达到全局超时时`ABANDON`，默认结果为 48 小时或心跳超时的 100 倍，以较小者为准 

------
#### [ Console ]

**配置实例保留**

1. 打开 Amazon EC2 Auto Scaling 控制台

1. 创建您的 Auto Scaling 组（实例生命周期策略默认为终止）

1. 前往您的 Auto Scaling 组详情页面，然后选择**实例管理**选项卡

1. 在**生命周期挂钩的实例生命周期策略**中，选择 Reta **in**

1. 使用以下方法创建终止生命周期挂钩：
   + 生命周期过渡设置为**实例终止**
   + 默认结果集为 “放**弃**”

------
#### [ AWS CLI ]

**配置实例保留**  
 将[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令与实例生命周期策略一起使用：

```
aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name my-asg \
--launch-template LaunchTemplateName=my-template,Version='$Latest' \
--min-size 1 \
--max-size 3 \
--desired-capacity 2 \
--vpc-zone-identifier subnet-12345678 \
--instance-lifecycle-policy file://lifecycle-policy.json
```

lifecycle-policy.json 的内容：

```
{
    "RetentionTriggers": {
        "TerminateHookAbandon": "retain"
    }
}
```

**添加终止生命周期钩子**  
使用 [put-lifecycle-hook](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-lifecycle-hook.html) 命令：

```
aws autoscaling put-lifecycle-hook \
--lifecycle-hook-name my-termination-hook \
--auto-scaling-group-name my-asg \
--lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING \
--default-result ABANDON \
--heartbeat-timeout 300
```

------

# 管理保留的实例
<a name="manage-retained-instances"></a>

 监控和控制已进入保留状态的 Amazon EC2 实例。使用 CloudWatch 指标来跟踪保留的实例，然后在完成自定义操作后手动终止保留的实例。

 保留的实例不计入您的 Amazon EC2 Auto Scaling 组的所需容量。当实例进入保留状态时，Auto Scaling 会启动替换实例以保持所需的容量。例如，假设您的 Auto Scaling 组的所需容量为 10。当实例进入`Terminating:Retained`状态时，Auto Scaling 会启动一个替换实例以保持所需的容量 10。现在，您总共有 11 个正在运行的实例：您的活动组中有 10 个实例，再加上 1 个保留的实例。在您手动终止保留的实例之前，将对所有 11 个实例收取标准 Amazon EC2 费用。

## 保留实例的实例生命周期状态
<a name="instance-lifecyle-states-of-retained-instances"></a>

 了解在使用实例生命周期策略时，实例是如何通过生命周期状态过渡的。实例遵循从正常终止到保留再到最终终止的特定路径。

*触发保留后，实例会进入以下状态：*

1. `Terminating`-正常终止开始

1. `Terminating:Wait`-生命周期挂钩执行

1. `Terminating:Proceed`-生命周期操作总结（无论成功还是失败）

1. `Terminating:Retained`-挂钩失败，实例保留以供手动干预

根据场景，温池实例采用不同的生命周期状态路径：

*向温池缩减的实例：*

1. `Warmed:Pending`-正常的温池过渡开始

1. `Warmed:Pending:Wait`-生命周期挂钩执行

1. `Warmed:Pending:Proceed`-生命周期操作总结（无论成功还是失败）

1. `Warmed:Pending:Retained`-挂钩失败，实例保留以供手动干预

*正在从温池中终止的实例：*

1. `Warmed:Terminating`-正常终止开始

1. `Warmed:Terminating:Wait`-生命周期挂钩执行

1. `Warmed:Terminating:Proceed`-生命周期操作总结（无论成功还是失败）

1. `Warmed:Terminating:Retained`-挂钩失败，实例保留以供手动干预

## 监控保留的实例
<a name="monitor-retained-instances"></a>

 由于保留的 Amazon EC2 实例会产生成本并需要手动干预，因此必须对其进行监控。Amazon EC2 Auto Scaling 提供了多种 CloudWatch 指标来跟踪保留的实例。

启用群组指标以跟踪保留的实例：

```
aws autoscaling enable-metrics-collection \
--auto-scaling-group-name my-asg \
--metrics GroupTerminatingRetainedInstances
```

可用指标有：
+  `GroupTerminatingRetainedInstances`显示处于该`Terminating:Retained`状态的实例数量。
+  `GroupTerminatingRetainedCapacity`显示`Terminating:Retained`状态下的实例所代表的容量单位。
+  `WarmPoolTerminatingRetainedCapacity`跟踪从温池中终止的保留实例。
+  `WarmPoolPendingRetainedCapacity`跟踪返回到温池的保留实例。

 您还可以查看您的 Amazon EC2 Auto Scaling 组的扩展活动，以了解保留实例的原因。查找带有`StatusCode: Cancelled`指示生命周期挂钩失败的状态原因消息的终止活动：

```
aws autoscaling describe-scaling-activities \
--auto-scaling-group-name my-asg
```

 我们建议根据这些指标创建 CloudWatch 警报，以便在实例进入保留状态时提醒您。这可以帮助您跟踪成本影响，并确保您不会忘记清理需要手动干预的实例。

## 终止保留的实例
<a name="terminate-retained-instances"></a>

完成自定义操作后，通过调用 [ TerminateInstanceInAutoScalingGroup](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_TerminateInstanceInAutoScalingGroup.html)API 终止您保留的实例：

```
aws autoscaling terminate-instance-in-auto-scaling-group \
--instance-id i-1234567890abcdef0 \
--no-should-decrement-desired-capacity
```

# 通过实例元数据检索目标生命周期状态
<a name="retrieving-target-lifecycle-state-through-imds"></a>

您启动的每个 Auto Scaling 实例都经历多个生命周期状态。如需从实例内调用作用于特定生命周期状态转换的自定义操作，则您必须通过实例元数据检索目标生命周期状态。

例如，您可能需要一种从实例内部检测实例终止的机制，以便在实例终止之前在实例上运行一些代码。为此，您可以编写代码，直接从实例中轮询实例的生命周期状态。然后，您可以向自动扩缩组添加生命周期挂钩，以保持实例运行，直到您的代码发送 **complete-lifecycle-action** 命令以继续。

Auto Scaling 实例生命周期有两个主要的稳定状态：`InService` 和 `Terminated`，还有两个附加的稳定状态：`Detached` 和 `Standby`。如果使用暖池，生命周期还有四个额外的稳定状态：`Warmed:Hibernated`、`Warmed:Running`、`Warmed:Stopped` 和 `Warmed:Terminated`。

当实例准备转换到之前的稳定状态之一时，Amazon EC2 Auto Scaling 会更新实例元数据项目 `autoscaling/target-lifecycle-state` 的值。要从实例内获取目标生命周期状态，必须使用实例元数据服务从实例元数据中检索它。

**注意**  
*实例元数据*是有关 Amazon EC2 实例的数据，应用程序可以用它来查询实例信息。*实例元数据服务*是实例上的组件，本地代码用它来访问实例元数据。本地代码可以包括实例上运行的用户数据脚本或应用程序。

本地代码可以使用以下两种方法之一从正在运行的实例访问实例元数据：实例元数据服务版本 1 (IMDSv1) 或实例元数据服务版本 2 (IMDSv2)。 IMDSv2使用面向会话的请求并缓解多种类型的漏洞，这些漏洞可用于尝试访问实例元数据。有关这两种方法的详细信息，请参阅 *Amazon EC2 用户指南 IMDSv2*中的[使用](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)。

------
#### [ IMDSv2 ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/autoscaling/target-lifecycle-state
```

------
#### [ IMDSv1 ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/autoscaling/target-lifecycle-state
```

------

下面是示例输出。

```
InService
```

目标生命周期状态是实例转换到的状态。当前生命周期状态是实例所处的状态。在生命周期操作完成并且实例完成向目标生命周期状态的转换之后，这两个状态可能是相同的。您无法从实例元数据中检索实例的当前生命周期状态。

Amazon EC2 Auto Scaling 于 2022 年 3 月 10 日开始生成目标生命周期状态。如果您的实例在该日期之后转换为其中一个目标生命周期状态，则您的实例元数据中将显示该目标生命周期状态项目。否则，它不存在，并且您会收到 HTTP 404 错误。

有关检索实例元数据的更多信息，请参阅《Amazon EC2 用户指南》**中的[检索实例元数据](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html)。

有关向您展示如何在使用目标生命周期状态的用户数据脚本中使用自定义操作创建生命周期钩子的教程，请参阅 [教程：使用数据脚本和实例元数据检索生命周期状态](tutorial-lifecycle-hook-instance-metadata.md)。

**重要**  
为确保您可以尽快调用自定义操作，您的本地代码应经常轮询 IMDS，并在出现错误时重试。

# 向自动扩缩组添加生命周期挂钩
<a name="adding-lifecycle-hooks"></a>

要将 Auto Scaling 实例置于等待状态并对它们执行自定义操作，您可以向 Auto Scaling 组添加生命周期钩子。自定义操作将在实例启动时或其终止之前执行。实例将保持等待状态，直到您完成生命周期操作，或者直到超时时段结束。

从创建 Auto Scaling 组后 AWS 管理控制台，您可以向该组添加一个或多个生命周期挂钩，总共可添加最多 50 个生命周期挂钩。您还可以在创建 Auto Scaling 组时使用 AWS CLI CloudFormation、或 SDK 向 Auto Scaling 组添加生命周期挂钩。

默认情况下，当您在控制台中添加生命周期挂钩时，Amazon EC2 Auto Scaling 会向亚马逊发送生命周期事件通知 EventBridge。建议使用 EventBridge 或用户数据脚本。要创建直接向 Amazon SNS、Amazon SQS 发送通知的生命周期挂钩， AWS Lambda 也可以使用命令，如[put-lifecycle-hook](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-lifecycle-hook.html)本主题的示例所示。

**Topics**
+ [添加生命周期钩子（控制台）](#adding-lifecycle-hooks-console)
+ [添加生命周期钩子 (AWS CLI)](#adding-lifecycle-hooks-aws-cli)

## 添加生命周期钩子（控制台）
<a name="adding-lifecycle-hooks-console"></a>

请按照以下步骤向您的自动扩缩组添加生命周期挂钩。要添加用于横向扩展（实例启动）和横向缩减（实例终止或返回至暖池）的生命周期挂钩，您必须创建两个单独的钩子。

如 [做好准备向 Auto Scaling 组添加生命周期钩子](prepare-for-lifecycle-notifications.md) 中所述，请在开始之前确认已设置自定义操作。

**为横向扩展添加生命周期挂钩**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中您的自动扩缩组旁边的复选框。这时将在页面底部打开一个拆分窗格。

1. 在 **Instance management (实例管理)** 选项卡的 **Lifecycle hooks (生命周期挂钩)** 中，选择 **Create lifecycle hook (创建生命周期挂钩)**。

1. 要为横向扩展（实例启动）定义生命周期挂钩，请执行以下操作：

   1. 对于 **Lifecycle hook name (生命周期挂钩名称)**，请指定生命周期挂钩的名称。

   1. 对于**生命周期转换**，请选择**实例启动**。

   1. 对于**检测信号超时时间**，请在钩子超时之前，指定实例在横向扩展时保持等待状态的时长（以秒为单位）。范围从 `30` 到 `7200` 秒。设置的超时时段越长，完成您的自定义操作的时间越长。然后，如果您在超时期限结束之前完成，请发送[complete-lifecycle-action](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/complete-lifecycle-action.html)命令以允许实例进入下一个状态。

   1. 对于**默认结果**，指定在生命周期钩子超时结束或发生意外故障时要执行的操作。您可以选择**继续**或**放弃**。
      + 如果您选择**继续**，自动扩缩组可以继续执行任何其他生命周期挂钩，然后将实例投入使用。
      + 如果选择 **放弃**，自动扩缩组停止任何剩余操作并立即终止实例。

   1. （可选）对于**通知元数据**，请指定您希望在 Amazon EC2 Auto Scaling 向通知目标发送消息时包含的其他信息。

1. 选择**创建**。

**为横向缩减添加生命周期挂钩**

1. 选择**创建生命周期挂钩**，以从为横向扩展创建生命周期挂钩而中断的地方继续操作。

1. 要为横向缩减定义生命周期挂钩（实例终止或返回到暖池），请执行以下操作：

   1. 对于 **Lifecycle hook name (生命周期挂钩名称)**，请指定生命周期挂钩的名称。

   1. 对于**生命周期转换**，请选择**实例终止**。

   1. 对于**检测信号超时时间**，请在钩子超时之前，指定实例在横向扩展时保持等待状态的时长（以秒为单位）。我们建议将超时时间缩短`30`为`120`几秒，具体取决于执行任何最终任务（例如从中提取 EC2 日志）所需的时间 CloudWatch。

   1. 对于 **Default result**（默认结果），请指定超时结束或发生意外故障时 Auto Scaling 组执行的操作。**ABANDON**（放弃）和 **CONTINUE**（继续）都允许终止实例。
      + 如果您选择 **CONTINUE**（继续），Auto Scaling 组可以在终止之前继续执行任何剩余操作（如其他生命周期钩子）。
      + 如果选择 **放弃**，自动扩缩组将立即终止实例。

   1. （可选）对于**通知元数据**，请指定您希望在 Amazon EC2 Auto Scaling 向通知目标发送消息时包含的其他信息。

1. 选择**创建**。

## 添加生命周期钩子 (AWS CLI)
<a name="adding-lifecycle-hooks-aws-cli"></a>

使用 [put-lifecycle-hook](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-lifecycle-hook.html) 命令创建和更新生命周期挂钩。

要执行扩展操作，请使用以下命令。

```
aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-launch-hook  \
  --auto-scaling-group-name my-asg \
  --lifecycle-transition autoscaling:EC2_INSTANCE_LAUNCHING
```

要执行缩减操作，请使用以下命令。

```
aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-termination-hook  \
  --auto-scaling-group-name my-asg \
  --lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING
```

要使用 Amazon SNS 或 Amazon SQS 接收通知，请添加 `--notification-target-arn` 和 `--role-arn` 选项。要使用接收通知 AWS Lambda，请添加`--notification-target-arn`。

以下示例中创建了一个生命周期钩子，用于指定名为的 `my-sns-topic` 的 SNS 主题作为通知目标。

```
aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-termination-hook  \
  --auto-scaling-group-name my-asg \
  --lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING \
  --notification-target-arn arn:aws:sns:region:123456789012:my-sns-topic \
  --role-arn arn:aws:iam::123456789012:role/my-notification-role
```

该主题将使用以下键/值对接收测试通知。

```
"Event": "autoscaling:TEST_NOTIFICATION"
```

默认情况下，该[put-lifecycle-hook](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-lifecycle-hook.html)命令会创建心跳超时为`3600`秒（一小时）的生命周期挂钩。

要更改现有生命周期钩子的检测信号超时时间，请添加 `--heartbeat-timeout` 选项，如以下示例所示。

```
aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-termination-hook \
  --auto-scaling-group-name my-asg --heartbeat-timeout 120
```

如果实例已经处于等待状态，则可以使用 [record-lifecycle-action-heartbeat](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/record-lifecycle-action-heartbeat.html)CLI 命令记录心跳来防止生命周期挂钩超时。这会将超时时间增加到您创建生命周期挂钩时指定的超时值。如果您在超时期限结束之前完成，则可以发送 [complete-lifecycle-action](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/complete-lifecycle-action.html)CLI 命令以允许实例进入下一个状态。有关更多信息以及示例，请参阅 [在自动扩缩组中完成生命周期操作](completing-lifecycle-hooks.md)。

# 在自动扩缩组中完成生命周期操作
<a name="completing-lifecycle-hooks"></a>

当 Auto Scaling 组响应生命周期事件时，它会将实例置于等待状态并发送事件通知。当实例处于等待状态时，您可以执行自定义操作。

如果您在超时周期过期之前完成生命周期操作，那么以 `CONTINUE` 的结果完成生命周期操作会很有帮助。如果您未完成生命周期操作，则生命周期挂钩将在超时周期结束后进入您为**默认结果**指定的状态。

**Topics**
+ [完成生命周期操作（手动）](#completing-lifecycle-hooks-aws-cli)
+ [完成生命周期操作（自动）](#completing-lifecycle-hooks-automatic)

## 完成生命周期操作（手动）
<a name="completing-lifecycle-hooks-aws-cli"></a>

以下过程适用于命令行界面，在控制台中不受支持。必须替换的信息（如实例 ID 或 Auto Scaling 组的名称）以斜体显示。

**完成生命周期操作 (AWS CLI)**

1. 如果需要更多时间以完成自定义操作，请使用 [record-lifecycle-action-heartbeat](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/record-lifecycle-action-heartbeat.html) 命令重新开始超时时段，并将实例保持为等待状态。例如，如果超时时段为一小时，而您在 30 分钟后调用该命令，则实例将继续保持等待状态一小时（总共为 90 分钟）。

   您可以指定随[通知](prepare-for-lifecycle-notifications.md#notification-message-example)一起接收的生命周期操作令牌，如以下命令所示。

   ```
   aws autoscaling record-lifecycle-action-heartbeat --lifecycle-hook-name my-launch-hook \
     --auto-scaling-group-name my-asg --lifecycle-action-token bcd2f1b8-9a78-44d3-8a7a-4dd07d7cf635
   ```

   或者，您可以指定随[通知](prepare-for-lifecycle-notifications.md#notification-message-example)一起接收的实例的 ID，如以下命令所示。

   ```
   aws autoscaling record-lifecycle-action-heartbeat --lifecycle-hook-name my-launch-hook \
     --auto-scaling-group-name my-asg --instance-id i-1a2b3c4d
   ```

1. 如果您在超时期限结束之前完成了自定义操作，请使用[complete-lifecycle-action](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/complete-lifecycle-action.html)命令以便 Auto Scaling 组可以继续启动或终止实例。您可以指定生命周期操作令牌，如以下命令所示。

   ```
   aws autoscaling complete-lifecycle-action --lifecycle-action-result CONTINUE \
     --lifecycle-hook-name my-launch-hook --auto-scaling-group-name my-asg \
     --lifecycle-action-token bcd2f1b8-9a78-44d3-8a7a-4dd07d7cf635
   ```

   或者，您可以指定实例的 ID，如以下命令所示。

   ```
   aws autoscaling complete-lifecycle-action --lifecycle-action-result CONTINUE \
     --instance-id i-1a2b3c4d --lifecycle-hook-name my-launch-hook \
     --auto-scaling-group-name my-asg
   ```

## 完成生命周期操作（自动）
<a name="completing-lifecycle-hooks-automatic"></a>

如果您拥有在实例启动后配置这些实例的用户数据脚本，则无需手动完成生命周期操作。您可以将[complete-lifecycle-action](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/complete-lifecycle-action.html)命令添加到脚本中。该脚本可以从实例元数据中检索实例 ID，并在引导启动脚本成功完成后向 Amazon EC2 Auto Scaling 发出信号。

如果您尚未这样做，请更新脚本，从实例元数据中检索实例的实例 ID。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[检索实例元数据](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html)。

如果您使用 Lambda，则还可以在函数的代码中设置回调，以便在自定义操作成功时能让实例的生命周期继续。有关更多信息，请参阅 [教程：配置调用 Lambda 函数的生命周期钩子](tutorial-lifecycle-hook-lambda.md)。

# 教程：使用数据脚本和实例元数据检索生命周期状态
<a name="tutorial-lifecycle-hook-instance-metadata"></a>

为生命周期挂钩创建自定义操作的一种常见方法是使用 Amazon EC2 Auto Scaling 发送到其他服务（例如亚马逊）的通知 EventBridge。但是，您可以避免创建额外的基础设施，方法是使用用户数据脚本将配置实例并完成生命周期操作的代码移动到实例本身中。

以下教程介绍如何开始使用用户数据脚本和实例元数据。您可以使用读取您组中实例的[目标周期状态](retrieving-target-lifecycle-state-through-imds.md)并在实例生命周期的特定阶段执行回调操作以继续启动过程的用户数据脚本来创建基本 Auto Scaling 组配置。

下图总结了使用用户数据脚本执行自定义操作时横向扩展事件的流程。实例启动后，实例的生命周期将暂停，直到生命周期挂钩完成（超时或 Amazon EC2 Auto Scaling 收到继续的信号）。

![\[使用用户数据脚本执行自定义操作时横向扩展事件的流程。\]](http://docs.aws.amazon.com/zh_cn/autoscaling/ec2/userguide/images/lifecycle-hook-user-data-script.png)


**Topics**
+ [步骤 1：创建具有完成生命周期操作权限的 IAM 角色](#instance-metadata-create-iam-role)
+ [步骤 2：创建启动模板并包含 IAM 角色和用户数据脚本](#instance-metadata-create-hello-world-function)
+ [步骤 3：创建 Auto Scaling 组](#instance-metadata-create-auto-scaling-group)
+ [步骤 4：添加生命周期钩子](#instance-metadata-add-lifecycle-hook)
+ [步骤 5：测试和验证功能](#instance-metadata-testing-hook)
+ [步骤 6：清除](#instance-metadata-lifecycle-hooks-tutorial-cleanup)
+ [相关资源](#instance-metadata-lifecycle-hooks-tutorial-related-resources)

## 步骤 1：创建具有完成生命周期操作权限的 IAM 角色
<a name="instance-metadata-create-iam-role"></a>

当您使用 AWS CLI 或 AWS 软件开发工具包发送回调以完成生命周期操作时，必须使用具有完成生命周期操作权限的 IAM 角色。

**创建策略**

1. 打开 IAM 控制台的[策略](https://console.aws.amazon.com/iam/home?#/policies)页面，然后选择**创建策略**。

1. 请选择 **JSON** 选项卡。

1. 在**策略文档**框中，将以下策略文档复制并粘贴到框中。将**sample text**替换为您的账号和您要创建的 Auto Scaling 群组的名称 (**TestAutoScalingEvent-group**)。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "autoscaling:CompleteLifecycleAction"
         ],
         "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/TestAutoScalingEvent-group"
       }
     ]
   }
   ```

------

1. 选择**下一步**。

1. 对于**策略名称**，输入 **TestAutoScalingEvent-policy**。选择**创建策略**。

完成创建策略之后，您可以创建一个使用该策略的角色。

**创建角色**

1. 在左侧的导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 对于**选择可信实体**，选择 **AWS 服务**。

1. 对于您的使用案例，选择 **EC2**，然后选择 **Next**（下一步）。

1. 在 “**添加权限**” 下，选择您创建的策略（**TestAutoScalingEvent-policy**）。然后选择**下一步**。

1. 在 **Name, review, and create**（命名、检查并创建）页面上，对于 **Role name**（角色名称），输入 **TestAutoScalingEvent-role**，然后选择 **Create role**（创建角色）。

## 步骤 2：创建启动模板并包含 IAM 角色和用户数据脚本
<a name="instance-metadata-create-hello-world-function"></a>

创建用于 Auto Scaling 组的启动模板。包含您创建的 IAM 角色和提供的示例用户数据脚本。

**创建启动模板**

1. 打开 Amazon EC2 控制台的[启动模板页面](https://console.aws.amazon.com/ec2/v2/#LaunchTemplates)。

1. 选择**Create launch template**（创建启动模板）。

1. 对于 **Launch template name**（启动模板名称），输入 **TestAutoScalingEvent-template**。

1. 在 **Auto Scaling guidance**（Auto Scaling 指导）下，选中复选框。

1. 对于 **Application and OS Images (Amazon Machine Image)** [应用程序和操作系统镜像（Amazon Machine Image）]，请从 **Quick Start**（快速启动）列表中选择 Amazon Linux 2 (HVM)、SSD Volume Type（SSD 卷类型）、64-bit (x86) [64 位（x86）]。

1. 对于 **Instance type**（实例类型），选择一种 Amazon EC2 实例类型（例如“t2.micro”）。

1. 对于**高级详细信息**，展开该节以查看字段。

1. 对于 **IAM 实例配置文件**，请选择您的 IAM 角色（**TestAutoScalingEvent-** role）的 IAM 实例配置文件名称。实例配置文件是 IAM 角色的容器，在实例启动时允许 Amazon EC2 将 IAM 角色传递到实例。

   使用 IAM 控制台创建 IAM 角色时，控制台自动创建实例配置文件，按相应的角色为文件命名。

1. 对于 **User data**（用户数据），将下面的实例用户数据脚本粘贴到字段。将的示例文本替换为您`group_name`要创建的 Auto Scaling 组的`region`名称以及 AWS 区域 您想让 Auto Scaling 组使用的名称。

   ```
   #!/bin/bash
   
   function token {
       echo "X-aws-ec2-metadata-token: $(curl -X PUT 'http://169.254.169.254/latest/api/token' -H 'X-aws-ec2-metadata-token-ttl-seconds: 21600')"
   }
   
   function get_target_state {
       echo $(curl -H "$(token)" -s http://169.254.169.254/latest/meta-data/autoscaling/target-lifecycle-state)
   }
   
   function get_instance_id {
       echo $(curl -H "$(token)" -s http://169.254.169.254/latest/meta-data/instance-id)
   }
   
   function complete_lifecycle_action {
       instance_id=$(get_instance_id)
       group_name='TestAutoScalingEvent-group'
       region='us-west-2'
    
       echo $instance_id
       echo $region
       echo $(aws autoscaling complete-lifecycle-action \
         --lifecycle-hook-name TestAutoScalingEvent-hook \
         --auto-scaling-group-name $group_name \
         --lifecycle-action-result CONTINUE \
         --instance-id $instance_id \
         --region $region)
   }
   
   function main {
       while true
       do
           target_state=$(get_target_state)
           if [ \"$target_state\" = \"InService\" ]; then
               # Change hostname
               export new_hostname="${group_name}-$instance_id"
               hostname $new_hostname
               # Send callback
               complete_lifecycle_action
               break
           fi
           echo $target_state
           sleep 5
       done
   }
   
   main
   ```

   此简单用户数据脚本将执行以下操作：
   + 调用实例元数据以从实例元数据中检索目标生命周期状态和实例 ID
   + 重复检索目标生命周期状态，直到它变为 `InService`
   + 如果目标生命周期状态为 `InService`，则将实例的主机名更改为实例 ID 前面加上 Auto Scaling 组名称
   + 通过调用 **complete-lifecycle-action** CLI 命令向 Amazon EC2 Auto Scaling 发出信号以 `CONTINUE` EC2 启动过程来发送回调

1. 选择**Create launch template**（创建启动模板）。

1. 在确认页面上，选择 **Create Auto Scaling group**（创建 Auto Scaling 组）。

**注意**  
有关可用作开发用户数据脚本的参考的其他示例，请参阅 Amazon EC2 Auto Scaling 的[GitHub 存储库](https://github.com/aws-samples/amazon-ec2-auto-scaling-group-examples)。

## 步骤 3：创建 Auto Scaling 组
<a name="instance-metadata-create-auto-scaling-group"></a>

创建启动模板后，创建 Auto Scaling 组。

**创建 自动扩缩组**

1. 在 **Choose launch template or configuration**（选择启动模板或配置）页面上，对于 **Auto Scaling group name**（Auto Scaling 组名称），输入 Auto Scaling 组的名称 (**TestAutoScalingEvent-group**)。

1. 选择 **Next**（下一步）转至 **Choose instance launch options**（选择实例启动选项）页面。

1. 对于 **Network**（网络），选择 VPC。

1. 对于 **Availability Zones and subnets**（可用区和子网），请从一个或多个可用区中选择一个或多个子网。

1. 在 **Instance type requirements**（实例类型要求）部分中，使用默认设置简化此步骤。（请勿覆盖启动模板。） 在本教程中，您将仅使用启动模板中指定的实例类型启动一个按需型实例。

1. 在屏幕的底部选择 **Skip to review**（跳至审核）。

1. 在 **Review**（审核）页面中，检查 Auto Scaling 组的详细信息，然后选择 **Create Auto Scaling group**（创建 Auto Scaling 组）。

## 步骤 4：添加生命周期钩子
<a name="instance-metadata-add-lifecycle-hook"></a>

添加生命周期钩子以将实例保持在等待状态，直到您的生命周期操作完成。

**添加生命周期挂钩**

1. 打开 Amazon EC2 控制台中的 [自动扩缩组页面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)。

1. 选中您的自动扩缩组旁边的复选框。这时将在页面底部打开一个拆分窗格。

1. 在下方窗格中，在**实例管理**选项卡的**生命周期钩子**中，选择**创建生命周期钩子**。

1. 要为横向扩展（实例启动）定义生命周期挂钩，请执行以下操作：

   1. 对于**生命周期钩子名称**，请输入 **TestAutoScalingEvent-hook**。

   1. 对于**生命周期转换**，请选择**实例启动**。

   1. 对于 **Heartbeat timeout**（检测信号超时），输入 **300** 以获取等待用户数据脚本回调的秒数。

   1. 对于**默认结果**，请选择**放弃**。如果钩子超时而未收到来自您用户数据脚本的回调，Auto Scaling 组将终止新实例。

   1. （可选）将 **Notification metadata**（通知元数据）留空。

1. 选择**创建**。

## 步骤 5：测试和验证功能
<a name="instance-metadata-testing-hook"></a>

要测试功能，请通过将 Auto Scaling 组的所需容量增加 1 来更新 Auto Scaling 组。用户数据脚本运行并在实例启动后立即开始检查实例的目标生命周期状态。当目标生命周期状态为 `InService` 时，脚本会更改主机名并发送回调操作。完成此操作通常仅需要几秒钟时间。

**增加您的 Auto Scaling 组的大小**

1. 打开 Amazon EC2 控制台中的 [自动扩缩组页面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)。

1. 选中您的自动扩缩组旁边的复选框。在下方窗格中查看详细信息，同时仍然可以看到上方窗格的顶部几行。

1. 在下方窗格中的**详细信息**选项卡上，选择**组详细信息**、**编辑**。

1. 对于 **Desired capacity (所需容量)**，将当前值增加 1。

1. 选择**更新**。启动实例时，上方窗格中的**状态**列会显示*正在更新容量*状态。

在增加所需容量后，您可以通过扩缩活动的描述来验证您的实例是否已成功启动且未终止。

**查看扩展活动**

1. 返回到 **Auto Scaling 组**页面并选择您的组。

1. 在**活动**选项卡上的**活动历史记录**下，**状态**列显示您的 Auto Scaling 组是否已成功启动实例。

1. 如果用户数据脚本失败，则在超时时段过后，您会看到状态为 `Canceled` 且状态消息为 `Instance failed to complete user's Lifecycle Action: Lifecycle Action with token e85eb647-4fe0-4909-b341-a6c42EXAMPLE was abandoned: Lifecycle Action Completed with ABANDON Result` 的扩缩活动。

## 步骤 6：清除
<a name="instance-metadata-lifecycle-hooks-tutorial-cleanup"></a>

如果您已完成为本教程创建的资源，请使用以下步骤将其删除。

**删除生命周期钩子**

1. 打开 Amazon EC2 控制台中的 [自动扩缩组页面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)。

1. 选中您的自动扩缩组旁边的复选框。

1. 在**实例管理**选项卡的**生命周期钩子**中，选择生命周期钩子 (`TestAutoScalingEvent-hook`)。

1. 依次选择**操作**和**删除**。

1. 再次选择**删除**以确认。

**要删除启动模板**

1. 打开 Amazon EC2 控制台的[启动模板页面](https://console.aws.amazon.com/ec2/v2/#LaunchTemplates)。

1. 选择启动模板 (`TestAutoScalingEvent-template`)，然后依次选择 **Actions**（操作）、**Delete template**（删除模板）。

1. 当系统提示进行确认时，键入 **Delete** 以确认删除指定启动模板，然后选择 **Delete**（删除）。

如果您已完成使用此示例 Auto Scaling 组，请将其删除。您还可以删除您创建的 IAM 角色和权限策略。

**要删除 Auto Scaling 组**

1. 打开 Amazon EC2 控制台中的 [自动扩缩组页面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)。

1. 选中 Auto Scaling 组 (`TestAutoScalingEvent-group`) 旁边的复选框并选择 **Delete**（删除）。

1. 当系统提示进行确认时，键入 **delete** 以确认删除指定自动扩缩组，然后选择 **Delete**（删除）。

   **Name**（名称）列中的加载图标指示 Auto Scaling 组正在被删除。终止实例并删除组需要几分钟时间。

**要删除 IAM 角色**

1. 打开 IAM 控制台的 [Roles page](https://console.aws.amazon.com/iam/home?#/roles)（角色页面）。

1. 选择函数的角色 (`TestAutoScalingEvent-role`)。

1. 选择**删除**。

1. 在系统提示进行确认时，键入角色的名称，然后选择 **Delete**（删除）。

**删除 IAM policy**

1. 打开 IAM 控制台的 [Policies（策略）页面](https://console.aws.amazon.com/iam/home?#/policies)。

1. 选择您创建的策略 (`TestAutoScalingEvent-policy`)。

1. 依次选择**操作**和**删除**。

1. 在系统提示进行确认时，键入策略的名称，然后选择 **Delete**（删除）。

## 相关资源
<a name="instance-metadata-lifecycle-hooks-tutorial-related-resources"></a>

以下相关主题可能有助于您开发基于实例元数据中可用数据而调用实例操作的代码。
+ [通过实例元数据检索目标生命周期状态](retrieving-target-lifecycle-state-through-imds.md). 本节介绍其他使用案例的生命周期状态，例如实例终止。
+ [添加生命周期钩子（控制台）](adding-lifecycle-hooks.md#adding-lifecycle-hooks-console). 此过程向您演示如何为横向扩展（实例启动）和横向缩减（实例终止或返回到暖池）添加生命周期挂钩。
+ 《Amazon EC2 用户指南》**中的[实例元数据类别](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-categories)。本主题列出了可用于调用 EC2 实例操作的所有类别的实例元数据。

有关向您展示如何使用 Amazon EventBridge 创建规则，根据您的 Auto Scaling 组中实例发生的事件调用 Lambda 函数的教程，请参阅。[教程：配置调用 Lambda 函数的生命周期钩子](tutorial-lifecycle-hook-lambda.md)

# 教程：配置调用 Lambda 函数的生命周期钩子
<a name="tutorial-lifecycle-hook-lambda"></a>

在本练习中，您将创建一条包含筛选模式的 Amazon EventBridge 规则，匹配该模式后，将调用一个 AWS Lambda 函数作为规则目标。我们提供了要使用的筛选条件模式和示例函数代码。

如果一切配置正确，则在本教程结束时，Lambda 函数将在实例启动时执行自定义操作。自定义操作只是在与 Lambda 函数关联的 CloudWatch 日志日志流中记录事件。

Lambda 函数还执行回调，以便在此操作成功时继续执行实例的生命周期，但允许实例放弃启动并在操作失败时终止。

下图总结了使用 Lambda 函数执行自定义操作时横向扩展事件的流程。实例启动后，实例的生命周期将暂停，直到生命周期挂钩完成（超时或 Amazon EC2 Auto Scaling 收到继续的信号）。

![\[使用 Lambda 函数执行自定义操作时横向扩展事件的流程。\]](http://docs.aws.amazon.com/zh_cn/autoscaling/ec2/userguide/images/lifecycle-hook-lambda-function.png)


**注意**  
根据您的用例，您可以按照以下步骤配置生命周期挂钩并创建 EventBridge 规则。或者，您可以使用 Lambda 函数直接配置生命周期挂钩，而无需创建 EventBridge 规则。

**Topics**
+ [前提条件](#lambda-hello-world-tutorial-prerequisites)
+ [步骤 1：创建具有完成生命周期操作权限的 IAM 角色](#lambda-create-iam-role)
+ [第 2 步：创建 Lambda 函数](#lambda-create-hello-world-function)
+ [步骤 3：创建 EventBridge 规则](#lambda-create-rule)
+ [步骤 4：添加生命周期钩子](#lambda-add-lifecycle-hook)
+ [步骤 5：测试和验证事件](#lambda-testing-hook-notifications)
+ [步骤 6：清除](#lambda-lifecycle-hooks-tutorial-cleanup)
+ [相关资源](#lambda-lifecycle-hooks-tutorial-related-resources)

## 前提条件
<a name="lambda-hello-world-tutorial-prerequisites"></a>

在开始本教程前，请创建 Auto Scaling 组（如果您还没有 Auto Scaling 组）。若要创建 自动扩缩组，请打开 Amazon EC2 控制台中的 [自动扩缩组页面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)，然后选择**创建自动扩缩组**。

## 步骤 1：创建具有完成生命周期操作权限的 IAM 角色
<a name="lambda-create-iam-role"></a>

在创建 Lambda 函数之前，必须首先创建执行角色和权限策略，以允许 Lambda 完成生命周期钩子。

**创建策略**

1. 打开 IAM 控制台的[策略](https://console.aws.amazon.com/iam/home?#/policies)页面，然后选择**创建策略**。

1. 请选择 **JSON** 选项卡。

1. 在 “**政策文档**” 框中，将以下策略文档粘贴到框中，将中的**italics**文本替换为您的账号和 Auto Scaling 组的名称。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "autoscaling:CompleteLifecycleAction"
         ],
         "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/my-asg"
       }
     ]
   }
   ```

------

1. 选择**下一步**。

1. 对于**策略名称**，输入 **LogAutoScalingEvent-policy**。选择**创建策略**。

完成创建策略之后，您可以创建一个使用该策略的角色。

**创建角色**

1. 在左侧的导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 对于**选择可信实体**，选择 **AWS 服务**。

1. 对于您的使用案例，选择 **Lambda**，然后选择 **Next**（下一步）。

1. 在 “**添加权限**” 下，选择您创建的策略（**LogAutoScalingEvent-policy**）和名为**AWSLambdaBasicExecutionRole**的策略。然后选择**下一步**。
**注意**  
该**AWSLambdaBasicExecutionRole**策略具有该函数将日志写入 CloudWatch 日志所需的权限。

1. 在 **Name, review, and create**（命名、检查并创建）页面上，对于 **Role name**（角色名称），输入 **LogAutoScalingEvent-role**，然后选择 **Create role**（创建角色）。

## 第 2 步：创建 Lambda 函数
<a name="lambda-create-hello-world-function"></a>

创建 Lambda 函数以用作事件的目标。用 Node.js 编写的示例 Lambda 函数是在亚马逊 EC2 Auto Scaling 发出匹配事件 EventBridge 时调用的。

**创建 Lambda 函数**

1. 打开 Lambda 控制台的[函数](https://console.aws.amazon.com/lambda/home#/functions)页面。

1. 选择 **Create function**（创建函数），然后选择 **Author from scratch**（从头开始创作）。

1. 在**基本信息** 下，对于**函数名称**，输入 **LogAutoScalingEvent**。

1. 对于**运行时系统**，选择 **Node.js 18.x**。

1. 向下滚动并选择**更改默认执行角色**，然后对于**执行角色**，选择**使用现有角色**。

1. 对于**现有角色**，选择 **LogAutoScalingEvent-role**。

1. 保留其他默认值。

1. 选择**创建函数**。您将返回到函数的代码和配置。

1. 当 `LogAutoScalingEvent` 函数在控制台中保持打开状态时，在编辑器中的 **代码资源**下，将以下示例代码复制到名为 index.mjs 的文件中。

   ```
   import { AutoScalingClient, CompleteLifecycleActionCommand } from "@aws-sdk/client-auto-scaling";
   export const handler = async(event) => {
     console.log('LogAutoScalingEvent');
     console.log('Received event:', JSON.stringify(event, null, 2));
     var autoscaling = new AutoScalingClient({ region: event.region });
     var eventDetail = event.detail;
     var params = {
       AutoScalingGroupName: eventDetail['AutoScalingGroupName'], /* required */
       LifecycleActionResult: 'CONTINUE', /* required */
       LifecycleHookName: eventDetail['LifecycleHookName'], /* required */
       InstanceId: eventDetail['EC2InstanceId'],
       LifecycleActionToken: eventDetail['LifecycleActionToken']
     };
     var response;
     const command = new CompleteLifecycleActionCommand(params);
     try {
       var data = await autoscaling.send(command);
       console.log(data); // successful response
       response = {
         statusCode: 200,
         body: JSON.stringify('SUCCESS'),
       };
     } catch (err) {
       console.log(err, err.stack); // an error occurred
       response = {
         statusCode: 500,
         body: JSON.stringify('ERROR'),
       };
     }
     return response;
   };
   ```

   此代码仅记录事件，以便在本教程结束时，您可以看到与此 Lambda 函数关联的事件出现在 CloudWatch 日志日志流中。

1. 选择**部署**。

## 步骤 3：创建 EventBridge 规则
<a name="lambda-create-rule"></a>

创建一条 EventBridge 规则来运行您的 Lambda 函数。有关使用 EventBridge 的更多信息，请参阅[用于处理 EventBridge Auto Scaling 事件](automating-ec2-auto-scaling-with-eventbridge.md)。

**使用控制台创建规则**

1. 打开 [EventBridge 控制台](https://console.aws.amazon.com/events/)。

1. 在导航窗格中，选择**规则**。

1. 选择**创建规则**。

1. 对于**定义规则详细信息**，请执行以下操作：

   1. 对于**名称**，请输入 **LogAutoScalingEvent-rule**。

   1. 对于**事件总线**，选择**默认**。当您的账户 AWS 服务 中的某项生成事件时，它始终会转到您账户的默认事件总线。

   1. 对于**规则类型**，选择**具有事件模式的规则**。

   1. 选择**下一步**。

1. 对于 **Build event pattern**（构建事件模式），执行以下操作：

   1. 对于**事件来源**，选择**AWS 事件或 EventBridge 合作伙伴事件**。

   1. 向下滚动到 **事件模式**，然后执行以下操作：

   1. 

      1. 对于**事件源**，选择 **AWS 服务**。

      1. 对于 **AWS 服务**，选择 **Auto Scaling**。

      1. 对于 **Event Type (事件类型)**，选择 **Instance Launch and Terminate (实例启动和终止)**。

      1. 默认情况下，该规则会与任何横向缩减或横向扩展事件匹配。要创建在发生横向扩展事件并且因生命周期挂钩而使实例被置于等待状态时通知您的规则，请选择 **Specific instance event(s)**（特定实例事件），然后选择 **EC2 Instance-launch Lifecycle Action**（EC2 实例启动生命周期操作）。

      1. 默认情况下，该规则与区域中任何 Auto Scaling 组匹配。若要使该规则与特定自动扩缩组匹配，请选择 **特定组名称**并选择组。

      1. 选择**下一步**。

1. 对于 **Select target(s)**（选择目标），请执行以下操作：

   1. 对于 **Target types**（目标类型），选择 **AWS 服务**。

   1. 对于 **Select a target**（选择目标），选择 **Lambda function**（Lambda 函数）。

   1. 对于 “**函数**”，选择**LogAutoScalingEvent**。

   1. 选择**下一步**两次。

1. 请在 **审核和创建**页面上，选择 **创建**。

## 步骤 4：添加生命周期钩子
<a name="lambda-add-lifecycle-hook"></a>

在本节中，您将添加一个生命周期钩子，以便 Lambda 在启动时在实例上运行函数。

**添加生命周期挂钩**

1. 打开 Amazon EC2 控制台中的 [自动扩缩组页面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)。

1. 选中您的自动扩缩组旁边的复选框。这时将在页面底部打开一个拆分窗格。

1. 在下方窗格中，在**实例管理**选项卡的**生命周期钩子**中，选择**创建生命周期钩子**。

1. 要为横向扩展（实例启动）定义生命周期挂钩，请执行以下操作：

   1. 对于**生命周期钩子名称**，请输入 **LogAutoScalingEvent-hook**。

   1. 对于**生命周期转换**，请选择**实例启动**。

   1. 对于**检测信号超时**，输入 **300** 以获取等待 Lambda 函数回调的秒数。

   1. 对于**默认结果**，请选择**放弃**。这意味着，如果钩子超时而未收到 Lambda 函数的回调，Auto Scaling 组将终止新实例。

   1. （可选）将**通知元数据**留空。我们传递给的事件数据 EventBridge 包含调用 Lambda 函数所需的所有必要信息。

1. 选择**创建**。

## 步骤 5：测试和验证事件
<a name="lambda-testing-hook-notifications"></a>

要测试事件，请通过将 Auto Scaling 组的所需容量增加 1 来更新 Auto Scaling 组。您的 Lambda 函数在增加所需容量后几秒钟内调用。

**增加您的 Auto Scaling 组的大小**

1. 打开 Amazon EC2 控制台中的 [自动扩缩组页面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)。

1. 选中 Auto Scaling 组旁边的复选框可在下方窗格中查看详细信息，并且仍然可以看到上方窗格的顶行。

1. 在下方窗格中的**详细信息**选项卡上，选择**组详细信息**、**编辑**。

1. 对于 **Desired capacity (所需容量)**，将当前值增加 1。

1. 选择**更新**。启动实例时，上方窗格中的**状态**列会显示*正在更新容量*状态。

增加所需的容量后，可验证是否已调用 Lambda 函数。

**查看 Lambda 函数的输出**

1. 打开 CloudWatch 控制台的[日志组页面](https://console.aws.amazon.com/cloudwatch/home#logs:)。

1. 选择您的 Lambda 函数 (`/aws/lambda/LogAutoScalingEvent`) 的日志组的名称。

1. 选择日志流的名称，以查看由生命周期操作的函数提供的数据。

接下来，您可以通过扩展活动的描述来验证您的实例是否已成功启动。

**查看扩展活动**

1. 返回到 **Auto Scaling 组**页面并选择您的组。

1. 在**活动**选项卡上的**活动历史记录**下，**状态**列显示您的 Auto Scaling 组是否已成功启动实例。
   + 如果操作成功，扩展活动的状态将为“成功”。
   + 如果失败，在等待几分钟后，您将看到状态为“已取消”的扩展活动，并显示状态消息“实例无法完成用户的生命周期操作：使用令牌 e85eb647-4fe0-4909-b341-a6c42EXAMPLE 的生命周期操作已放弃：使用“放弃”结果完成的生命周期操作”。

**减少您的 Auto Scaling 组的大小**  
如果您不需要您为此测试启动的其他实例，则可以打开**详细信息**选项卡并将**所需容量**减少 1。

## 步骤 6：清除
<a name="lambda-lifecycle-hooks-tutorial-cleanup"></a>

如果您已完成仅为本教程创建的资源，请使用以下步骤将其删除。

**删除生命周期钩子**

1. 打开 Amazon EC2 控制台中的 [自动扩缩组页面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)。

1. 选中您的自动扩缩组旁边的复选框。

1. 在**实例管理**选项卡的**生命周期钩子**中，选择生命周期钩子 (`LogAutoScalingEvent-hook`)。

1. 依次选择**操作**和**删除**。

1. 再次选择**删除**以确认。

**删除 Amazon EventBridge 规则**

1. 在 Amazon EventBridge 控制台中打开 “[规则” 页面](https://console.aws.amazon.com/events/home?#/rules)。

1. 在**事件总线**下，选择与规则 (`Default`) 关联的事件总线。

1. 然后选中您的规则 (`LogAutoScalingEvent-rule`) 旁边的复选框。

1. 选择**删除**。

1. 在系统提示进行确认时，键入规则的名称，然后选择 **Delete**（删除）。

如果您已完成使用此示例函数，请将其删除。您还可以删除存储函数日志的日志组以及您创建的执行角色和权限策略。

**要删除 Lambda 函数**

1. 打开 Lambda 控制台的 [Functions（函数）页面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 选择函数 (`LogAutoScalingEvent`)。

1. 依次选择**操作**和**删除**。

1. 当系统提示进行确认时，键入 **delete** 以确认删除指定函数，然后选择 **Delete**（删除）。

**删除日志组**

1. 打开 CloudWatch 控制台的[日志组页面](https://console.aws.amazon.com/cloudwatch/home#logs:)。

1. 选择函数的日志组 (`/aws/lambda/LogAutoScalingEvent`)。

1. 依次选择 **Actions**（操作）和 **Delete log group(s)**（删除日志组）。

1. 在 **Delete log group(s)**（删除日志组）对话框中，选择 **Delete**（删除）。

**删除执行角色**

1. 打开 IAM 控制台的 [Roles page](https://console.aws.amazon.com/iam/home?#/roles)（角色页面）。

1. 选择函数的角色 (`LogAutoScalingEvent-role`)。

1. 选择**删除**。

1. 在系统提示进行确认时，键入角色的名称，然后选择 **Delete**（删除）。

**删除 IAM policy**

1. 打开 IAM 控制台的 [Policies（策略）页面](https://console.aws.amazon.com/iam/home?#/policies)。

1. 选择您创建的策略 (`LogAutoScalingEvent-policy`)。

1. 依次选择**操作**和**删除**。

1. 在系统提示进行确认时，键入策略的名称，然后选择 **Delete**（删除）。

## 相关资源
<a name="lambda-lifecycle-hooks-tutorial-related-resources"></a>

当您根据发生在 Auto Scaling 组中的实例的事件创建 EventBridge 规则时，以下相关主题可能会有所帮助。
+ [用于处理 EventBridge Auto Scaling 事件](automating-ec2-auto-scaling-with-eventbridge.md). 本节向您演示其他使用案例的事件示例，包括针对横向缩减的事件。
+ [添加生命周期钩子（控制台）](adding-lifecycle-hooks.md#adding-lifecycle-hooks-console). 此过程向您演示如何为横向扩展（实例启动）和横向缩减（实例终止或返回到暖池）添加生命周期挂钩。

有关向您演示如何使用实例元数据服务 (IMDS) 从实例本身内部调用操作的教程，请参阅 [教程：使用数据脚本和实例元数据检索生命周期状态](tutorial-lifecycle-hook-instance-metadata.md)。

# 使用暖池减少启动时间较长的应用程序的延迟
<a name="ec2-auto-scaling-warm-pools"></a>

暖池使您能够减少引导时间非常长的应用程序的延迟，例如，因为实例需要将大量数据写入磁盘。使用暖池，您不再需要过度配置 Auto Scaling 组来管理延迟以提高应用程序性能。有关更多信息，请参阅以下博客文章 [利用 EC2 Auto Scaling 暖池更快地扩展您的应用程序](https://aws.amazon.com/blogs/compute/scaling-your-applications-faster-with-ec2-auto-scaling-warm-pools/)。

**重要**  
在不需要的情况下创建暖池可能会导致不必要的成本。如果您的首次启动时间不会给您的应用程序带来明显的延迟问题，则您可能不需要使用暖池。

**Topics**
+ [核心概念](#warm-pool-core-concepts)
+ [先决条件](#warm-pool-prerequisites)
+ [更新暖池中的实例](#update-warm-pool)
+ [相关资源](#warm-pools-related-resources)
+ [限制](#warm-pools-limitations)
+ [使用生命周期钩子](warm-pool-instance-lifecycle.md)
+ [为自动扩缩组创建一个暖池](create-warm-pool.md)
+ [查看运行状况检查状态](warm-pools-health-checks-monitor-view-status.md)
+ [AWS CLI 使用温水池的示例](examples-warm-pools-aws-cli.md)

## 核心概念
<a name="warm-pool-core-concepts"></a>

在您开始之前，请熟悉以下核心概念：

**暖池**  
暖池是预初始化的 EC2 实例的池，它位于 Auto Scaling 组旁边。无论何时您的应用程序需要向外扩展，自动扩缩组都可以在暖池上绘制，以满足其新的所需容量。它可帮助您确保实例准备好快速开启为应用程序提供流量，从而加快对横向扩展事件的响应。当实例离开暖池时，它们将计入该组的所需容量。这称为*热启动*。  
当实例处于预热池中时，仅当处于 `InService` 状态的实例的指标值大于扩缩策略的告警阈值上限（与目标跟踪扩缩策略的目标利用率相同）时，扩缩策略才会横向扩展。

**暖池大小**  
默认情况下，暖池的大小以 Auto Scaling 组的最大容量与其所需容量之差来计算。例如，如果 Auto Scaling 组的所需容量为 6 且最大容量为 10，则当您首次设置暖池并且该池正在初始化时，暖池的大小将为 4。  
要单独指定暖池的最大容量，请使用自定义规格（`MaxGroupPreparedCapacity`）选项，并为暖池设置一个大于该组当前容量的自定义值。如果您提供自定义值，则暖池的大小将计算为自定义值与组当前所需容量之间的差值。例如，如果自动扩缩组的所需容量为 6，最大容量为 20 且自定义值为 8，则当您首次设置暖池并且该池初始化时，暖池的大小将为 2。  
仅当使用大自动扩缩组时，才可能需要使用自定义规格（`MaxGroupPreparedCapacity`）选项来管理拥有暖池的成本效益。例如，与在暖池中持续预留 500 个实例以备未来使用的方案相比，拥有 1,000 个实例的自动扩缩组、最大容量为 1,500（用于为紧急流量峰值提供额外容量）和拥有 100 个实例的暖池方案可能有利于更好地实现目标。

**最小暖池大小**  
考虑使用最小大小设置来静态设置（`MinSize`）要在暖池中保留的最少实例数。默认情况下，没有设置最小大小。`MinSize` 设置适用于指定 `MaxGroupPreparedCapacity` 以确保暖池中保持最少实例数的情况，即使自动扩缩组的所需容量高于 `MaxGroupPreparedCapacity`。

**暖池实例状态**  
您可以将暖池中的实例保持在以下三种状态之一：`Stopped`、`Running` 或 `Hibernated`。将实例保持在 `Stopped` 状态是一个有效的方法，以最大限度地降低成本。对于已停止的实例，您只需为您使用的卷和已附加到实例的弹性 IP 地址付费。  
或者，您也可以将实例保持在 `Hibernated` 状态，以停止实例而不删除其内存内容 (RAM)。当某个实例处于休眠状态时，这表示操作系统会将 RAM 的内容保存到 Amazon EBS 根卷中。当再次开启此实例时，会将此根卷还原到其之前的状态，还将重新加载 RAM 内容。当实例处于休眠状态时，您只需为 EBS 卷（包括 RAM 内容的存储空间，以及已附加到实例的弹性 IP 地址）付费。  
此外还可以将暖池中的实例保持在 `Running` 状态，但我们强烈建议不要这样操作，以避免产生不必要的费用。当实例停止或休眠时，您可以节省实例本身的成本。您仅在实例正在运行时为它们付费。

**生命周期钩子**  
您使用[生命周期挂钩](warm-pool-instance-lifecycle.md)来将实例置于等待状态，以便您可以对实例执行自定义操作。自定义操作将在实例启动时或其终止之前执行。  
在暖池配置中，生命周期挂钩可以延迟实例停止或休眠以及延迟在横向扩展事件期间投入使用，直到它们完成初始化。如果您在没有生命周期钩子的情况下向 Auto Scaling 组添加暖池，则需要很长时间才能完成初始化的实例可能会停止或休眠，然后在准备就绪之前在横向扩展事件期间投入使用。

**实例再使用策略**  
默认情况下，Amazon EC2 Auto Scaling 会在您的 Auto Scaling 组横向缩减时终止您的实例。然后，它会将新实例启动到暖池中，以替换已终止的实例。  
而如果您希望将实例返回到暖池，则可以指定实例再使用策略。这使您可以再使用这些已配置为给应用程序提供流量的实例。为了确保您的暖池不会过度预置，当暖池中的实例大小根据其设置超出必要时，Amazon EC2 Auto Scaling 可以终止这些实例，以减小其大小。当终止暖池中的实例时，它会使用[默认终止策略](ec2-auto-scaling-termination-policies.md#default-termination-policy)来选择首先终止哪些实例。  
如果您希望在横向缩减时休眠实例，并且 Auto Scaling 组中有现有实例，则它们必须满足实例休眠的要求。如果不这样做，当实例返回到暖池时，它们将回退到停止状态，而不是休眠状态。
目前，您只能通过使用 AWS CLI 或 SDK 来指定实例再使用策略。此功能在控制台中不可用。

## 先决条件
<a name="warm-pool-prerequisites"></a>

在为自动扩缩组创建暖池之前，请决定如何使用生命周期挂钩将新实例初始化为适当的初始状态。

要在实例因生命周期挂钩而处于等待状态时对其执行自定义操作，您有两种选择：
+ 对于您希望在启动时对实例运行命令的简单场景，可以在为 Auto Scaling 组创建启动模板或启动配置时包含用户数据脚本。用户数据脚本只是在您的实例开启时由 cloud-init 运行的普通 Shell 脚本或 cloud-init 指令。该脚本还可通过使用实例（该脚本运行所在的实例）的 ID 来控制您的实例何时转换到下一个状态。如果您尚未这样做，请更新脚本，从实例元数据中检索实例的实例 ID。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[访问实例元数据](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html)。
**提示**  
要在实例重新开启时运行用户数据脚本，用户数据必须采用 MIME 多段格式，并在用户数据的 `#cloud-config` 部分中指定以下内容：  

  ```
  #cloud-config
  cloud_final_modules:
   - [scripts-user, always]
  ```
+ 对于需要服务的高级场景，例如 AWS Lambda 在实例进入或离开温池时执行某项操作，您可以为 Auto Scaling 组创建生命周期挂钩，并将目标服务配置为根据生命周期通知执行自定义操作。有关更多信息，请参阅 [支持的通知目标](warm-pool-instance-lifecycle.md#warm-pools-supported-notification-targets)。

**使实例为休眠做好准备**  
要使自动扩缩实例为使用 `Hibernated` 池状态做好准备，请按照《Amazon EC2 用户指南》**中的[休眠先决条件](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hibernating-prerequisites.html)主题中所述，创建正确设置的新启动模板或启动配置，以支持实例休眠。然后，将新启动模板或启动配置与 Auto Scaling 组关联起来，并开启实例刷新，以替换与之前的启动模板或启动配置关联的实例。有关更多信息，请参阅 [使用实例刷新更新自动扩缩组中的实例](asg-instance-refresh.md)。

## 更新暖池中的实例
<a name="update-warm-pool"></a>

如需更新暖池中的实例，您可以创建新的启动模板或启动配置，并将其与自动扩缩组关联起来。所有新实例都将使用新 AMI 和在启动模板或启动配置中指定的其他更新启动，但现有实例不受影响。

要强制启动使用新启动模板或启动配置的替换暖池实例，您可以启动实例刷新，对您的组进行滚动更新。实例刷新首先将替换 `InService` 实例。然后，它将替换暖池中的实例。有关更多信息，请参阅 [使用实例刷新更新自动扩缩组中的实例](asg-instance-refresh.md)。

## 相关资源
<a name="warm-pools-related-resources"></a>

您可以访问我们的[GitHub存储库](https://github.com/aws-samples/amazon-ec2-auto-scaling-group-examples)，查看温池生命周期挂钩的示例。

## 限制
<a name="warm-pools-limitations"></a>
+ 针对采用混合实例类型的自动扩缩组的暖池限制：
  + 加权混合实例组不支持暖池。如果自动扩缩组使用了实例权重，则无法添加暖池。
  + 暖池不支持混合实例组中的竞价型实例。只有在使用暖池时，才需要为按需型实例配置混合实例策略。
  + 使用混合实例组处于休眠状态的暖池时，必须在启动模板中配置 `HibernationOptions`。
+ 仅当 Amazon EC2 Auto Scaling 将 Amazon EBS 卷作为其根设备时，前者才可将实例置于 `Stopped` 或 `Hibernated` 状态。无法停止或休眠对根设备使用实例存储的实例。
+ 仅当满足《Amazon EC2 用户指南》**内的[休眠先决条件](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hibernating-prerequisites.html)主题中列出的所有要求时，Amazon EC2 Auto Scaling 才可将实例置于 `Hibernated` 状态。
+ 如果您的暖池在发生向外扩展事件时耗尽，则实例将直接启动到 Auto Scaling 组（*冷启动*)。如果可用区容量不足，您也可能会遇到冷启动。
+ 如果暖池中的实例在启动过程中遇到问题，导致其无法进入 `InService` 状态，则该实例将被视为启动失败并已终止。无论根本原因是什么（例如容量不足错误或任何其他因素），此情况都适用。
+ 如果您尝试将暖池与 Amazon Elastic Kubernetes Service (Amazon EKS) 托管节点组一起使用，则仍在初始化的实例可能会注册到您的 Amazon EKS 集群。因此，在准备停止或休眠时，集群可能会在实例上安排作业。
+ 同样，如果您尝试将暖池与 Amazon ECS 集群一起使用，则实例可能会在完成初始化之前注册到集群。要解决此问题，您必须配置启动模板或启动配置，使其包含用户数据中的特殊代理配置变量。有关更多信息，请参阅 *《Amazon Elastic Container Service 开发人员指南》*中的[为自动扩缩组使用暖池](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/asg-capacity-providers.html#using-warm-pool)。

# 在自动扩缩组中将生命周期挂钩与暖池一起使用
<a name="warm-pool-instance-lifecycle"></a>

暖池中的实例将保持自己独立的生命周期，以帮助您为每次转换创建适当的自定义操作。此生命周期旨在帮助您在实例仍在初始化之时以及将其投入使用之前，调用目标服务（例如，Lambda 函数）中的操作。

**注意**  
不会更改用于添加和管理生命周期钩子以及完成生命周期操作的 API 操作。只会更改实例生命周期。

有关添加生命周期钩子的更多信息，请参阅 [向自动扩缩组添加生命周期挂钩](adding-lifecycle-hooks.md)。有关完成生命周期操作的更多信息，请参阅 [在自动扩缩组中完成生命周期操作](completing-lifecycle-hooks.md)。

对于进入暖池的实例，出于以下原因之一，您可能需要生命周期钩子：
+ 您希望从 AMI 启动 EC2 实例，这需要很长时间才能完成初始化。
+ 您希望运行用户数据脚本来引导启动 EC2 实例。

对于离开暖池的实例，出于以下原因之一，您可能需要生命周期钩子：
+ 您可以使用一些额外的时间准备 EC2 实例以供使用。例如，您可能有这样的服务，它们必须在实例重新开启时开启，然后您的应用程序才能正常工作。
+ 您希望预填充缓存数据，以使新服务器不会使用空缓存启动。
+ 您希望使用配置管理服务将新实例注册为托管实例。

## 暖池中实例的生命周期状态转换
<a name="lifecycle-state-transitions"></a>

作为其生命周期的组成部分，Auto Scaling 实例可在多种状态之间转换。

下图显示了在您使用暖池时 Auto Scaling 状态之间的转换：

![\[暖池中实例的生命周期状态转换。\]](http://docs.aws.amazon.com/zh_cn/autoscaling/ec2/userguide/images/warm-pools-lifecycle-diagram.png)


¹ 此状态因暖池的池状态设置而异。如果将池状态设置为 `Running`，则此状态为 `Warmed:Running`。如果将池状态设置为 `Hibernated`，则此状态为 `Warmed:Hibernated`。

添加生命周期钩子时，请考虑以下事项：
+ 为 `autoscaling:EC2_INSTANCE_LAUNCHING` 生命周期操作配置生命周期挂钩时，新启动的实例在到达 `Warmed:Pending:Wait` 状态时会先暂停以执行自定义操作，然后在实例重启并到达 `Pending:Wait` 状态时再次重复上述操作。
+ 为 `EC2_INSTANCE_TERMINATING` 生命周期操作配置生命周期挂钩，终止的实例在到达 `Terminating:Wait` 状态时会暂停以执行自定义操作。但是，如果您指定了实例重用策略来将实例大规模返回到暖池，而不是终止它们，则对于 `EC2_INSTANCE_TERMINATING` 生命周期操作，返回暖池的实例将在 `Warmed:Pending:Wait` 状态暂停以执行自定义操作。
+ 如果对您的应用程序的需求耗尽了暖池，则 Amazon EC2 Auto Scaling 可以直接将实例启动到 Auto Scaling 组，前提条件是该组尚未达到其最大容量。如果实例直接启动到该组中，则这些实例仅在 `Pending:Wait` 状态中暂停以执行自定义奥做。
+ 要控制实例在转换到下一个状态之前保持等待状态的时间，请将您的自定义操作配置为使用 **complete-lifecycle-action** 命令。使用生命周期挂钩，实例将保持等待状态，直到您通知 Amazon EC2 Auto Scaling 指定的生命周期操作已完成，或者直至超时期结束（默认为 1 小时）。

以下总结了横向扩展事件的流程。

![\[横向扩展事件事的流图。\]](http://docs.aws.amazon.com/zh_cn/autoscaling/ec2/userguide/images/warm-pools-scale-out-event-diagram.png)


当实例达到等待状态时，Amazon EC2 Auto Scaling 将发送通知。本指南的 EventBridge 部分提供了这些通知的示例。有关更多信息，请参阅 [暖池示例事件类型和模式](warm-pools-eventbridge-events.md)。

## 支持的通知目标
<a name="warm-pools-supported-notification-targets"></a>

Amazon EC2 Auto Scaling 支持将以下任意内容定义为生命周期通知的通知目标：
+ EventBridge 规则
+ Amazon SNS 主题 
+ Amazon SQS 队列
+ AWS Lambda 函数

**重要**  
如果您的启动模板或启动配置中有在实例启动时配置实例的用户数据（cloud-init）脚本，则无需接收通知即可对正在启动或重启的实例执行自定义操作。

以下各节包含多个链接，它们指向描述如何配置通知目标的文档：

**EventBridge 规则** — 要在 Amazon EC2 Auto Scaling 将实例置于等待状态时运行代码，您可以创建 EventBridge 规则并指定一个 Lambda 函数作为其目标。要根据不同的生命周期通知调用不同的 Lambda 函数，您可以创建多条规则，并将每条规则与特定的事件模式和 Lambda 函数关联起来。有关更多信息，请参阅 [为温水池活动创建 EventBridge 规则](warm-pool-events-eventbridge-rules.md)。

**Amazon SNS 主题**：要在实例处于等待状态时接收通知，您可以创建 Amazon SNS 主题，然后设置 Amazon SNS 消息筛选，以根据消息属性以不同的方式传送生命周期通知。有关更多信息，请参阅 [使用 Amazon SNS 接收通知](prepare-for-lifecycle-notifications.md#sns-notifications)。

**Amazon SQS 队列**：要为生命周期通知设置传送点，使相关使用者可以接收并处理它们，您可以创建 Amazon SQS 队列和处理来自 SQS 队列的消息的队列使用者。如果您希望队列使用者根据消息属性以不同方式处理生命周期通知，则还必须设置队列使用者以解析消息，然后在特定属性与所需值匹配时对消息执行操作。有关更多信息，请参阅 [使用 Amazon SQS 接收通知](prepare-for-lifecycle-notifications.md#sqs-notifications)。

**AWS Lambda 函数** — 要在 Amazon EC2 Auto Scaling 将实例置于等待状态时运行自定义代码，您可以将 Lambda 函数指定为通知目标。Lambda 函数使用生命周期通知数据调用，允许您执行自定义操作，例如实例配置、应用程序设置或与其他 AWS 服务的集成。必须配置 Lambda 函数基于资源的策略，这样 Auto Scaling 服务相关角色才能调用该函数。有关更多信息，请参阅 [将通知 AWS Lambda 直接发送到](prepare-for-lifecycle-notifications.md#lambda-notification)。

# 为自动扩缩组创建一个暖池
<a name="create-warm-pool"></a>

本主题介绍如何为自动扩缩组创建暖池。

**重要**  
在您继续操作之前，请先完成创建暖池的[先决条件](ec2-auto-scaling-warm-pools.md#warm-pool-prerequisites)，并确认您已为自动扩缩组创建了生命周期挂钩。

## 创建暖池
<a name="create-a-warm-pool"></a>

使用以下步骤为您的自动扩缩组创建暖池。

**创建暖池（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中现有组旁边的复选框。

   这时将在页面底部打开一个拆分窗格。

1. 选择**实例管理**选项卡。

1. 在**暖池**下，选择**创建暖池**。

1. 要配置暖池，请执行以下操作：

   1. 对于**暖池实例状态**，选择要在实例进入暖池时将其转换为哪个状态。默认值为 `Stopped`。

   1. 对于**最小暖池大小**，输入要在暖池中保留的最少实例数。

   1. 对于**实例重用**，请选中**在横向缩减上重复使用**复选框，以允许自动扩缩组中的实例在横向缩减时可以退回暖池。

   1. 对于**暖池大小**，请选择可用选项之一：
      + **默认规格**：暖池的大小由自动扩缩组的最大容量与所需容量之差来确定。此选项简化了暖池管理。创建暖池后，只需调整组的最大容量即可轻松更新其大小。
      + **自定义规格**：暖池的大小由自定义值与自动扩缩组所需容量之差来确定。此选项使您可以灵活地独立于组的最大容量来管理暖池的大小。

1. 查看**基于当前设置估计暖池大小**部分，以确认默认或自定义规格如何应用于暖池大小。请记住，暖池的大小取决于自动扩缩组的所需容量；如果该组发生扩缩，则该容量将发生变化。

1. 选择**创建**。

## 使用混合实例组的实例类型选择
<a name="warm-pool-mixed-instance-types"></a>

当您的组配置了混合实例策略时，Auto Scaling 会在扩缩事件期间优先考虑已处于暖池中的实例类型。启动行为：

1. Auto Scaling 尝试使用暖池中的可用实例类型来启动实例。

1. 如果热启动失败，Auto Scaling 会尝试使用混合实例策略中所有剩余的实例类型进行冷启动。

**Example**  
**示例**  
如果将自动扩缩组配置为 10 种实例类型，而暖池包含其中 6 种实例类型。在横向扩展期间，Auto Scaling 会先尝试暖池中的 6 种实例类型。如果不成功，Auto Scaling 会通过冷启动尝试所有配置的实例类型。

这使您在可能的情况下获得暖池的性能优势，同时保持完整混合实例配置的灵活性。

## 删除暖池
<a name="delete-warm-pool"></a>

当您不再需要暖池时，您可以使用以下步骤将其删除。

**要删除暖池（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中现有组旁边的复选框。

   这时将在页面底部打开一个拆分窗格。

1. 选择**实例管理**选项卡。

1. 对于 **Warm pool**（暖池），选择 **Actions**（操作）、**Delete**（删除）。

1. 当系统提示进行确认时，选择 **Delete（删除）**。

# 查看运行状况检查状态以及运行状况检查失败的原因
<a name="warm-pools-health-checks-monitor-view-status"></a>

运行健康状况检查允许 Amazon EC2 Auto Scaling 确定实例何时运行状况不佳并应终止。对于保持在 `Stopped` 状态的暖池实例，它采用了 Amazon EBS 拥有的 `Stopped` 实例的可用性知识来识别运行状况不佳的实例。它通过调用 `DescribeVolumeStatus` API 以确定附加到实例的 EBS 卷的状态来执行此操作。对于保存在 `Running` 状态的暖池实例，它依赖 EC2 状态检查来确定实例运行状况。虽然暖池实例没有运行状况检查宽限期，但 Amazon EC2 Auto Scaling 在生命周期钩子结束之前不会开始检查实例运行状况。

当发现实例运行状况不佳时，Amazon EC2 Auto Scaling 会自动删除运行状况不佳的实例，并创建一个新实例来替换它。实例通常在运行状况检查失败后几分钟内终止。有关更多信息，请参阅 [查看运行状况检查失败原因](replace-unhealthy-instance.md)。

还支持自定义运行状况检查。如果您拥有自己的运行状况检查系统，该系统可以检测实例的运行状况并将此信息发送到 Amazon EC2 Auto Scaling，则这将非常有用。有关更多信息，请参阅 [为您的自动扩缩组设置自定义运行状况检查](set-up-a-custom-health-check.md)。

在 Amazon EC2 Auto Scaling 控制台中，您可以查看暖池实例的状态（运行状况良好或运行状况不佳)。您也可以使用 AWS CLI 或其中一个来查看他们的健康状态 SDKs。

**查看暖池实例的状态（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中 Auto Scaling 组旁边的复选框。

   这时将在 **Auto Scaling groups**（Auto Scaling 组）页面底部打开一个拆分窗格。

1. 在**实例管理**选项卡的**暖池实例**下，**生命周期**列显示实例的状态。

   **运行状况**列显示了 Amazon EC2 Auto Scaling 对实例运行状况所做的评估。
**注意**  
新实例开始运行状况良好。在生命周期钩子完成之前，不会检查实例的运行状况。

**查看运行状况检查失败原因（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中 Auto Scaling 组旁边的复选框。

   这时将在 **Auto Scaling groups**（Auto Scaling 组）页面底部打开一个拆分窗格。

1. 在**活动**选项卡的**活动历史记录**下，**状态**列显示您的 Auto Scaling 组是否已成功启动或终止实例。

   如果它终止了任何运行状况不佳的实例，**原因**列显示终止的日期和时间以及运行状况检查失败的原因。例如，“在 2021-04-01T21:48:35Z 时，实例因 EBS 卷运行状况检查失败而停止服务”。

**查看暖池实例的状态 (AWS CLI)**  
使用以下[describe-warm-pool](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-warm-pool.html)命令查看 Auto Scaling 组的温池。

```
aws autoscaling describe-warm-pool --auto-scaling-group-name my-asg
```

输出示例。

```
{
    "WarmPoolConfiguration": {
        "MinSize": 0,
        "PoolState": "Stopped"
    },
    "Instances": [
        {
            "InstanceId": "i-0b5e5e7521cfaa46c",
            "InstanceType": "t2.micro",
            "AvailabilityZone": "us-west-2a",
            "LifecycleState": "Warmed:Stopped",
            "HealthStatus": "Healthy",
            "LaunchTemplate": {
                "LaunchTemplateId": "lt-08c4cd42f320d5dcd",
                "LaunchTemplateName": "my-template-for-auto-scaling",
                "Version": "1"
            }
        },
        {
            "InstanceId": "i-0e21af9dcfb7aa6bf",
            "InstanceType": "t2.micro",
            "AvailabilityZone": "us-west-2a",
            "LifecycleState": "Warmed:Stopped",
            "HealthStatus": "Healthy",
            "LaunchTemplate": {
                "LaunchTemplateId": "lt-08c4cd42f320d5dcd",
                "LaunchTemplateName": "my-template-for-auto-scaling",
                "Version": "1"
            }
        }
    ]
}
```

**查看运行状况检查失败原因 (AWS CLI)**  
使用以下 [describe-scaling-activities](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-scaling-activities.html) 命令。

```
aws autoscaling describe-scaling-activities --auto-scaling-group-name my-asg
```

以下为示例响应，其中 `Description` 表示您的 Auto Scaling 组已终止实例，`Cause` 指示运行状况检查失败的原因。

扩展活动按开始时间排序。首先描述仍在进行的活动。

```
{
  "Activities": [
    {
      "ActivityId": "4c65e23d-a35a-4e7d-b6e4-2eaa8753dc12",
      "AutoScalingGroupName": "my-asg",
      "Description": "Terminating EC2 instance: i-04925c838b6438f14",
      "Cause": "At 2021-04-01T21:48:35Z an instance was taken out of service in response to EBS volume health check failure.",
      "StartTime": "2021-04-01T21:48:35.859Z",
      "EndTime": "2021-04-01T21:49:18Z",
      "StatusCode": "Successful",
      "Progress": 100,
      "Details": "{\"Subnet ID\":\"subnet-5ea0c127\",\"Availability Zone\":\"us-west-2a\"...}",
      "AutoScalingGroupARN": "arn:aws:autoscaling:us-west-2:123456789012:autoScalingGroup:283179a2-f3ce-423d-93f6-66bb518232f7:autoScalingGroupName/my-asg"
    },
...
  ]
}
```

# 使用创建和管理温池的示例 AWS CLI
<a name="examples-warm-pools-aws-cli"></a>

您可以使用 AWS 管理控制台、 AWS Command Line Interface (AWS CLI) 或创建和管理温池 SDKs。

以下示例向您演示如何使用 AWS CLI创建和管理暖池。

**Topics**
+ [示例 1：将实例保持在 `Stopped` 状态](#warm-pool-configuration-ex1)
+ [示例 2：将实例保持在 `Running` 状态](#warm-pool-configuration-ex2)
+ [示例 3：将实例保持在 `Hibernated` 状态](#warm-pool-configuration-ex3)
+ [示例 4：在横向缩减时将实例返回到暖池](#warm-pool-configuration-ex4)
+ [示例 5：指定暖池中的最小实例数](#warm-pool-configuration-ex5)
+ [示例 6：使用自定义规格定义暖池大小](#warm-pool-configuration-ex6)
+ [示例 7：定义绝对暖池大小](#warm-pool-configuration-ex7)
+ [示例 8：删除暖池](#delete-warm-pool-cli)

## 示例 1：将实例保持在 `Stopped` 状态
<a name="warm-pool-configuration-ex1"></a>

以下[put-warm-pool](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-warm-pool.html)示例创建了一个使实例保持`Stopped`状态的温池。

```
aws autoscaling put-warm-pool --auto-scaling-group-name my-asg /
  --pool-state Stopped
```

## 示例 2：将实例保持在 `Running` 状态
<a name="warm-pool-configuration-ex2"></a>

以下[put-warm-pool](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-warm-pool.html)示例创建了一个使实例保持`Running`状态而不是`Stopped`状态的温池。

```
aws autoscaling put-warm-pool --auto-scaling-group-name my-asg /
  --pool-state Running
```

## 示例 3：将实例保持在 `Hibernated` 状态
<a name="warm-pool-configuration-ex3"></a>

以下[put-warm-pool](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-warm-pool.html)示例创建了一个使实例保持`Hibernated`状态而不是`Stopped`状态的温池。这使您可以停止实例，而无需删除其内存内容 (RAM)。

```
aws autoscaling put-warm-pool --auto-scaling-group-name my-asg /
  --pool-state Hibernated
```

## 示例 4：在横向缩减时将实例返回到暖池
<a name="warm-pool-configuration-ex4"></a>

以下[put-warm-pool](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-warm-pool.html)示例创建了一个使实例保持`Stopped`状态的温池，并包含`--instance-reuse-policy`选项。实例再使用策略值 `'{"ReuseOnScaleIn": true}'` 将在 Auto Scaling 组横向缩减时，通知 Amazon EC2 Auto Scaling 将实例返回到暖池。

```
aws autoscaling put-warm-pool --auto-scaling-group-name my-asg /
  --pool-state Stopped --instance-reuse-policy '{"ReuseOnScaleIn": true}'
```

## 示例 5：指定暖池中的最小实例数
<a name="warm-pool-configuration-ex5"></a>

以下[put-warm-pool](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-warm-pool.html)示例创建了一个至少维护 4 个实例的温池，因此至少有 4 个实例可用于处理流量高峰。

```
aws autoscaling put-warm-pool --auto-scaling-group-name my-asg /
  --pool-state Stopped --min-size 4
```

## 示例 6：使用自定义规格定义暖池大小
<a name="warm-pool-configuration-ex6"></a>

默认情况下，Amazon EC2 Auto Scaling 将暖池大小管理为自动扩缩组的最大容量与所需容量之差。但是，您可以使用 `--max-group-prepared-capacity` 选项管理暖池的大小，使其独立于组的最大容量。

以下[put-warm-pool](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-warm-pool.html)示例创建了一个温池，并设置了在温池和 Auto Scaling 组中可以同时存在的最大实例数。如果组的所需容量为 800，则运行此命令后初始化时，暖池的初始大小为 100。

```
aws autoscaling put-warm-pool --auto-scaling-group-name my-asg /
  --pool-state Stopped --max-group-prepared-capacity 900
```

要在暖池中保留最少数量的实例，请使用命令包含 `--min-size` 选项，如下所示。

```
aws autoscaling put-warm-pool --auto-scaling-group-name my-asg /
  --pool-state Stopped --max-group-prepared-capacity 900 --min-size 25
```

## 示例 7：定义绝对暖池大小
<a name="warm-pool-configuration-ex7"></a>

如果您为 `--max-group-prepared-capacity` 和 `--min-size` 选项设置了相同的值，则暖池将具有绝对大小。以下[put-warm-pool](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-warm-pool.html)示例创建了一个保持 10 个实例的恒定温池大小的温池。

```
aws autoscaling put-warm-pool --auto-scaling-group-name my-asg /
  --pool-state Stopped --min-size 10 --max-group-prepared-capacity 10
```

## 示例 8：删除暖池
<a name="delete-warm-pool-cli"></a>

使用以下[delete-warm-pool](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/delete-warm-pool.html)命令删除温池。

```
aws autoscaling delete-warm-pool --auto-scaling-group-name my-asg
```

如果温池中有实例，或者扩展活动正在进行中，请使用带`--force-delete`选项的[delete-warm-pool](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/delete-warm-pool.html)命令。此选项还将终止 Amazon EC2 实例和任何未完成的生命周期操作。

```
aws autoscaling delete-warm-pool --auto-scaling-group-name my-asg --force-delete
```

# Auto Scaling 组的区域偏移
<a name="ec2-auto-scaling-zonal-shift"></a>

区域转移是 Amazon 应用程序恢复控制器 (ARC) 中的一项功能。通过区域切换，您只需一个操作即可快速从可用区中的应用程序损坏中恢复。当您为 Auto Scaling 组启用区域偏移时，该组将在 ARC 区域偏移服务中注册。然后，您可以使用、或 API 开始区域移动 AWS 管理控制台 AWS CLI，Auto Scaling 组会将处于活动区域偏移状态的可用区视为受损。

## Auto Scaling 分组区域偏移概念
<a name="asg-zonal-shift-concepts"></a>

在继续操作之前，请确保您熟悉以下与与 ARC 区域偏移集成相关的核心概念。

**ARC 区域偏移**  
启用 Auto Scaling 功能后，Auto Scaling 可以将 Auto Scaling 组注册为 ARC 区域偏移。注册后，您可以使用 [ARC `ListManagedResources`](https://docs.aws.amazon.com/arc-zonal-shift/latest/api/API_ListManagedResources.html) API 查看您的资源。有关更多信息，请参阅《*Amazon 应用程序恢复控制器 (ARC) 开发人员指南》中的 ARC* [中的区域偏移](https://docs.aws.amazon.com/r53recovery/latest/dg/arc-zonal-shift.html)。

**可用区再平衡**  
Auto Scaling 会尝试保持每个可用区域的容量平衡。当可用区之间出现不平衡时，Auto Scaling 会自动尝试修复不平衡问题。有关更多信息，请参阅 [实例分配](auto-scaling-benefits.md#AutoScalingBehavior.Rebalancing)。

**动态扩展**  
动态扩展会根据您在扩展策略中选择的指标来扩展 Auto Scaling 组的所需容量。有关更多信息，请参阅 [Amazon EC2 Auto Scaling 的动态扩缩](as-scale-based-on-demand.md)。

**运行状况检查**  
Auto Scaling 会定期检查 Auto Scaling 组内所有实例的运行状况，以确保它们正在运行且状态良好。当检测到运行状况不佳的实例时，Auto Scaling 会将其标记为替换。有关更多信息，请参阅 [自动扩缩组中实例的运行状况检查](ec2-auto-scaling-health-checks.md)。

**实例刷新**  
您可以使用实例刷新以更新自动扩缩组中的实例。实例刷新开始后，Auto Scaling 会尝试替换 Auto Scaling 组中的所有实例。有关更多信息，请参阅 [使用实例刷新更新自动扩缩组中的实例](asg-instance-refresh.md)。

**已预先缩放**  
您可以容忍单个可用区的损失，因为剩余的可用区中有足够的容量供应用程序使用。

**横向扩展**  
当您增加 Auto Scaling 组的所需容量时，Auto Scaling 会尝试启动其他实例以满足新的所需容量。默认情况下，Auto Scaling 以平衡的方式启动实例，以在 Auto Scaling 组中每个已启用的可用区域中保持相等的容量。

## Auto Scaling 群组的区域偏移是如何运作的
<a name="asg-zonal-shift-how-it-works"></a>

假设您有一个包含以下可用区域的 Auto Scaling 组：
+ `us-east-1a`
+ `us-east-1b`
+ `us-east-1c`

您已在所有可用区域中启用区域移动，并注意到其中出现故障`us-east-1a`，因此可以触发区域偏移。当触发区域偏移时，会发生以下行为。`us-east-1a`
+ 向@@ **外扩展** — Auto Scaling 将在运行状况良好的可用区（`us-east-1b`和`us-east-1c`）中启动所有新的容量请求。
+ **动态扩展** — Auto Scaling 将阻止扩展策略减少所有可用区域中的所需容量。Auto Scaling 不会阻止扩展策略增加所有可用区域中的所需容量。
+ **实例刷新** — Auto Scaling 将延长在区域偏移处于活动状态时延迟的任何实例刷新过程的超时时间。

下表描述了触发区域偏移时每个选项的运行状况检查行为。`us-east-1a`


| 可用区运行状况检查行为选择受损 | Health Check 行为 | 
| --- | --- | 
|  替换不健康的  |  所有可用区（`us-east-1a`、`us-east-1b`和`us-east-1c`）中显示运行状况不佳的实例将被替换。  | 
|  忽略不健康  |  显示为运行状况不佳的实例将在`us-east-1b`和`us-east-1c`中替换。可用区中的实例不会被有效的区域移动 (`us-east-1a`) 所取代。  | 

## 使用区域偏移的最佳实践
<a name="asg-zonal-shift-best-practices"></a>

为了在使用区域转移时保持应用程序的高可用性，我们建议采用以下最佳实践：
+ 监控 EventBridge 通知以确定何时出现持续的可用区损坏事件。有关更多信息，请参阅 [用于处理 EventBridge Auto Scaling 事件](automating-ec2-auto-scaling-with-eventbridge.md)。
+ 使用具有适当阈值的扩展策略，确保您有足够的容量来容忍可用区的损失。
+ 将实例维护策略设置为最低健康百分比为 100。使用此设置，Auto Scaling 会等待新实例准备就绪，然后再终止运行状况不佳的实例。

对于预先缩放的客户，我们还建议采取以下措施：
+ 选择 I **gnore un** healthy 作为受损可用区的运行状况检查行为，因为在受损事件期间，您无需更换运行状况不佳的实例。
+ 在 ARC 中为你的 Auto Scaling 组使用分区自动移位。ARC 中的区域自动切换功能允许在 AWS 检测 AWS 到可用区存在障碍时将资源的流量从可用区转移出去。有关更多信息，请参阅《A *mazon 应用程序恢复控制器 (ARC) 开发人员指南》中的 ARC* [中的区域自动切换](https://docs.aws.amazon.com/r53recovery/latest/dg/arc-zonal-autoshift.html)。

对于禁用跨区域负载均衡器的客户，我们还建议采取以下措施：
+ **仅在可用区分配中使用平衡**。
+ 如果您在 Auto Scaling 组和负载均衡器上都使用区域偏移，请先取消您的 Auto Scaling 组的区域偏移。然后，等待所有可用区域的容量均衡，然后再取消负载均衡器上的区域切换。
+ 由于启用区域转移并使用禁用跨区域的负载均衡器时可能会出现容量不平衡，因此 Auto Scaling 包含一个额外的验证步骤。如果您遵循最佳实践，则可以通过选中 AWS 管理控制台 复选框或使用`CreateAutoScalingGroup``UpdateAutoScalingGroup`、或中的`skip-zonal-shift-validation`标志来确认这种可能性`AttachTrafficSources`。

有关在 Auto Scaling 群组中使用区域偏移的更多信息，请参阅 AWS 计算博客在 [Amazon Aut EC2 o Scaling 中使用区域偏移](https://aws.amazon.com/blogs/compute/using-zonal-shift-with-amazon-ec2-auto-scaling/)。

# 使用 AWS 管理控制台 或启用区域偏移 AWS CLI
<a name="asg-zonal-shift-enable"></a>

要启用区域偏移，请使用以下方法之一。

------
#### [ Console ]

**在新群组上启用区域切换（控制台）**

1. 按照中的[使用启动模板创建 Auto Scaling 组](create-asg-launch-template.md)说明完成过程中的每个步骤，直到步骤 10。

1. 在**与其他服务集成**页面上，对于**应用程序恢复控制器 (ARC) 区域切换，选中复选框以启用区域移动**。

1. 对于**运行状况检查行为**，请选择 “忽略不健康状况” 或 “替换不健康”。有关更多信息，请参阅 [Auto Scaling 群组的区域偏移是如何运作的](ec2-auto-scaling-zonal-shift.md#asg-zonal-shift-how-it-works)。

1. 继续完成[使用启动模板创建 Auto Scaling 组](create-asg-launch-template.md)中的步骤。

------
#### [ AWS CLI ]

**要在新群组上启用区域偏移 ()AWS CLI**  
向 [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) 命令添加 `--availability-zone-impairment-policy` 参数。

该`--availability-zone-impairment-policy`参数有两个选项：
+ **ZonalShiftEnabled**— 如果设置为`true`，Auto Scaling 将使用 ARC 区域偏移注册 Auto Scaling 组[，您可以在 ARC 控制台上启动、更新或取消区域偏移](https://docs.aws.amazon.com/r53recovery/latest/dg/arc-zonal-shift.start-cancel.html)。如果设置为`false`，则 Auto Scaling 会从 ARC 区域偏移中取消注册 Auto Scaling 组。必须已启用区域偏移才能将其设置为。`false`
+ **ImpairedZoneHealthCheckBehavior**— 如果设置为`replace-unhealthy`，则可用区中运行状况不佳的实例将替换为有效的区域切换。如果设置为`ignore-unhealthy`，则可用区中运行状况不佳的实例不会被活跃的区域转移所取代。有关更多信息，请参阅 [Auto Scaling 群组的区域偏移是如何运作的](ec2-auto-scaling-zonal-shift.md#asg-zonal-shift-how-it-works)。

以下示例对名`my-asg`为的新 Auto Scaling 组启用区域偏移。

```
aws autoscaling create-auto-scaling-group \
  --launch-template LaunchTemplateName=my-launch-template,Version='1' \
  --auto-scaling-group-name my-asg \
  --min-size 1 \
  --max-size 10 \
  --desired-capacity 5 \
  --availability-zones us-east-1a us-east-1b us-east-1c \
  --availability-zone-impairment-policy '{
      "ZonalShiftEnabled": true,
      "ImpairedZoneHealthCheckBehavior": IgnoreUnhealthy       
    }'
```

------

------
#### [ Console ]

**在现有群组上启用区域切换（控制台）**

1. 在上打开亚马逊 EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 在屏幕顶部的导航栏中，选择您在其中创建了自动扩缩组的 AWS 区域 。

1. 选中 Auto Scaling 组旁边的复选框。

   这时将在页面底部打开一个拆分窗格。

1. **在**集成选项卡的****应用程序恢复控制器 (ARC) 区域偏移**下，选择编辑。**

1. 选中该复选框以启用区域移动。

1. 对于**运行状况检查行为**，请选择 “忽略不健康状况” 或 “替换不健康”。有关更多信息，请参阅 [Auto Scaling 群组的区域偏移是如何运作的](ec2-auto-scaling-zonal-shift.md#asg-zonal-shift-how-it-works)。

1. 选择**更新**。

------
#### [ AWS CLI ]

**要在现有群组上启用区域偏移 ()AWS CLI**  
向 [update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html) 命令添加 `--availability-zone-impairment-policy` 参数。

该`--availability-zone-impairment-policy`参数有两个选项：
+ **ZonalShiftEnabled**— 如果设置为`true`，Auto Scaling 将使用 ARC 区域偏移注册 Auto Scaling 组[，您可以在 ARC 控制台上启动、更新或取消区域偏移](https://docs.aws.amazon.com/r53recovery/latest/dg/arc-zonal-shift.start-cancel.html)。如果设置为`false`，则 Auto Scaling 会从 ARC 区域偏移中取消注册 Auto Scaling 组。必须已启用区域偏移才能将其设置为。`false`
+ **ImpairedZoneHealthCheckBehavior**— 如果设置为`replace-unhealthy`，则可用区中运行状况不佳的实例将替换为有效的区域切换。如果设置为`ignore-unhealthy`，则可用区中运行状况不佳的实例不会被活跃的区域转移所取代。有关更多信息，请参阅 [Auto Scaling 群组的区域偏移是如何运作的](ec2-auto-scaling-zonal-shift.md#asg-zonal-shift-how-it-works)。

以下示例在指定的 Auto Scaling 组上启用区域偏移。

```
aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \
  --availability-zone-impairment-policy '{
      "ZonalShiftEnabled": true,
      "ImpairedZoneHealthCheckBehavior": IgnoreUnhealthy       
    }'
```

------

# 自动扩缩组可用区分配
<a name="ec2-auto-scaling-availability-zone-balanced"></a>

以下信息描述了自动扩缩组的可用区域策略。

**尽力平衡**  
Auto Scaling 在各个启用的可用区保持相同数量的实例。如果在某个可用区中尝试启动失败，Auto Scaling 会尝试在另一个可用区中启动实例。该策略对于需要可用区冗余但不受组不平衡影响的应用程序非常重要。

**仅平衡**  
Auto Scaling 在各个启用的可用区保持相同数量的实例。如果在某个可用区中尝试启动失败，Auto Scaling 会继续尝试在该可用区中启动实例。该策略对于满足某些要求（例如基于仲裁的工作负载）非常重要，或者对自动扩缩组因剩余可用区中有足够容量而能够容忍可用区损失的情况也非常重要。

可用区分发策略选择位于的 “**网络**” 部分中， AWS 管理控制台 或者您可以使用[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)或[update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html)命令。

有关更多信息，请参阅 [使用启动模板创建自动扩缩组](create-auto-scaling-groups-launch-template.md)。

# 从自动扩缩组中分离或附加实例
<a name="ec2-auto-scaling-detach-attach-instances"></a>

您可以从自动扩缩组中分离实例。分离实例后，该实例将变为独立，可以自行管理，也可以附加到与其所属原始组分开的其他自动扩缩组。例如，当您想要使用已经运行应用程序的现有实例执行测试时，这可能很有用。

本主题提供有关如何分离和附加实例的说明。附加实例时，您也可以使用现有实例而不是已分离的实例。

建议使用备用程序将实例暂时从组中删除，而不是将实例分离然后重新附加到同一个组。有关更多信息，请参阅 [临时从 Auto Scaling 组中移除实例](as-enter-exit-standby.md)。

**Topics**
+ [分离实例的注意事项](#detach-instances-considerations)
+ [附加实例的注意事项](#attach-instances-considerations)
+ [使用分离和附加将实例移至其他组](#detach-attach-instances)

## 分离实例的注意事项
<a name="detach-instances-considerations"></a>

分离实例时，请记住以下几点：
+ 仅当实例处于 `InService` 或 `StandBy` 状态时，您才能将其分离。如果您要分离的实例位于 `StandBy` 状态，请谨慎行事。将实例置于 `StandBy` 状态后尝试分离实例时，在 API 调用中添加 `ShouldDecrementDesiredCapacity` 标志可能会导致其他实例意外终止。
+ 分离实例后，该实例会继续运行并产生费用。为避免不必要的费用，请确保在不再需要时重新附加或终止已分离的实例。
+ 您可以选择按照要分离的实例数量递减所需容量。如果您选择不递减容量，Amazon EC2 Auto Scaling 会启动新实例替换分离的实例以维持所需容量。
+ 如果要分离的实例数将使自动扩缩组容量降到低于其最小容量，则必须递减最小容量。
+ 如果在未递减所需容量的情况下从同一可用区分离多个实例，除非暂停 `AZRebalance` 进程，否则组将自行重新平衡。有关更多信息，请参阅 [暂停和恢复 Amazon EC2 Auto Scaling 进程](as-suspend-resume-processes.md)。
+ 如果您将实例从已附加负载均衡器目标组或经典负载均衡器的 Auto Scaling 组分离，则将从该负载均衡器取消注册实例。如果为负载均衡器启用了连接耗尽（取消注册延迟），则 Amazon EC2 Auto Scaling 会等待未送达请求完成。

## 附加实例的注意事项
<a name="attach-instances-considerations"></a>

附加实例时应注意以下几点：
+ Amazon EC2 Auto Scaling 对附加的实例与组本身启动的实例同等对待。这意味着，如果选择了附加的实例，则可以在横向缩减事件期间将其终止。AWSServiceRoleForAutoScaling 服务相关角色授予的权限允许 Amazon EC2 Auto Scaling 执行此操作。
+ 当您附加实例时，该组的所需容量将增加要附加的实例数。如果添加新实例后的所需容量超出了组的最大大小，则附加更多实例的请求会失败。
+ 如果您向组中添加实例，导致跨可用区分布不均衡，Amazon EC2 Auto Scaling 会重新平衡该组以重新建立均衡分配，除非您暂停 `AZRebalance` 流程。有关更多信息，请参阅 [暂停和恢复 Amazon EC2 Auto Scaling 进程](as-suspend-resume-processes.md)。
+ 如果您将实例附加到已附加负载均衡器目标组或经典负载均衡器的 Auto Scaling 组，则会将实例注册到该负载均衡器。

对于要附加的实例，必须满足以下条件：
+ 该实例通过 Amazon EC2 处于 `running` 的状态。
+ 用于启动实例的 AMI 必须仍然存在。
+ 实例不是其他 Auto Scaling 组的成员。
+ 实例会启动到自动扩缩组中定义的可用区之一。
+ 如果 Auto Scaling 组具有附加的负载均衡器目标组或经典负载均衡器，则实例和负载均衡器必须都位于同一 VPC 中。

## 使用分离和附加将实例移至其他组
<a name="detach-attach-instances"></a>

使用以下程序之一将实例与自动扩缩组分离，然后将其附加到其他自动扩缩组。

要从分离的实例创建新的自动扩缩组，请参阅[使用现有实例创建 Auto Scaling 组 AWS CLI](create-asg-from-instance.md)（不推荐，创建启动配置）。

------
#### [ Console ]

**将实例与自动扩缩组分离**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中您的自动扩缩组旁边的复选框。

   这时将在页面底部打开一个拆分窗格。

1. 在 **Instance management**（实例管理）选项卡上的 **Instances**（实例）中，选择一个实例，然后选择 **Actions**（操作）、**Detach**（分离）。

1. 在**分离实例**对话框中，保持**替换实例**复选框处于选中状态以启动替换实例。清除该复选框可减少所需容量。

1. 当系统提示进行确认时，键入 **detach** 以确认从自动扩缩组中删除指定的实例，然后选择 **Detach instance**。

现在，您可以将该实例附加到其他自动扩缩组。

**将实例附加到自动扩缩组**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. （可选）在导航窗格上的 **Auto Scaling** 下，选择 **Auto Scaling Groups**（Auto Scaling 组）。选择 Auto Scaling 组并验证 Auto Scaling 组的最大大小足以再添加一个实例。否则，在 **Details**（详细信息）选项卡上，增加最大容量。

1. 在导航窗格上的 **Instances**（实例）下，选择 **Instances**（实例），然后选择一个实例。

1. 依次选择**操作**、**实例设置**和**附加到 Auto Scaling 组**。

1. 在**附加到 Auto Scaling 组**页面上，为 **Auto Scaling 组**，输入组名称，然后选择**附加**。

1. 如果实例不符合条件，则会显示一条错误消息并提供详细信息。例如，实例可能没有位于与 Auto Scaling 组相同的可用区中。选择**关闭**并使用符合条件的自动扩缩组重试。

------
#### [ AWS CLI ]

要分离和附加实例，请使用以下示例命令。将每个 *user input placeholder* 替换为您自己的信息。

**将实例与自动扩缩组分离**

1. 要描述当前实例，请使用以下[describe-auto-scaling-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-instances.html)命令。

   ```
   aws autoscaling describe-auto-scaling-instances \
     --query 'AutoScalingInstances[?AutoScalingGroupName==`my-asg`]'
   ```

   下面的示例显示运行此命令时产生的输出。

   记下您打算从该组中移除的实例的 ID。在下一步骤中，您需要用到此 ID。

   ```
   {
       "AutoScalingInstances": [
           {
               "ProtectedFromScaleIn": false,
               "AvailabilityZone": "us-west-2a",
               "LaunchTemplate": {
                   "LaunchTemplateName": "my-launch-template",
                   "Version": "1",
                   "LaunchTemplateId": "lt-050555ad16a3f9c7f"
               },
               "InstanceId": "i-05b4f7d5be44822a6",
               "InstanceType": "t3.micro",
               "AutoScalingGroupName": "my-asg",
               "HealthStatus": "HEALTHY",
               "LifecycleState": "InService"
           },
           {
               "ProtectedFromScaleIn": false,
               "AvailabilityZone": "us-west-2a",
               "LaunchTemplate": {
                   "LaunchTemplateName": "my-launch-template",
                   "Version": "1",
                   "LaunchTemplateId": "lt-050555ad16a3f9c7f"
               },
               "InstanceId": "i-0c20ac468fa3049e8",
               "InstanceType": "t3.micro",
               "AutoScalingGroupName": "my-asg",
               "HealthStatus": "HEALTHY",
               "LifecycleState": "InService"
           },
           {
               "ProtectedFromScaleIn": false,
               "AvailabilityZone": "us-west-2a",
               "LaunchTemplate": {
                   "LaunchTemplateName": "my-launch-template",
                   "Version": "1",
                   "LaunchTemplateId": "lt-050555ad16a3f9c7f"
               },
               "InstanceId": "i-0787762faf1c28619",
               "InstanceType": "t3.micro",
               "AutoScalingGroupName": "my-asg",
               "HealthStatus": "HEALTHY",
               "LifecycleState": "InService"
           },
           {
               "ProtectedFromScaleIn": false,
               "AvailabilityZone": "us-west-2a",
               "LaunchTemplate": {
                   "LaunchTemplateName": "my-launch-template",
                   "Version": "1",
                   "LaunchTemplateId": "lt-050555ad16a3f9c7f"
               },
               "InstanceId": "i-0f280a4c58d319a8a",
               "InstanceType": "t3.micro",
               "AutoScalingGroupName": "my-asg",
               "HealthStatus": "HEALTHY",
               "LifecycleState": "InService"
           }
       ]
   }
   ```

1. 要分离实例而不递减所需容量，请使用以下 [detach-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/detach-instances.html) 命令。

   ```
   aws autoscaling detach-instances --instance-ids i-05b4f7d5be44822a6 \
     --auto-scaling-group-name my-asg
   ```

   要分离实例并递减所需容量，请包含 `--should-decrement-desired-capacity` 选项。

   ```
   aws autoscaling detach-instances --instance-ids i-05b4f7d5be44822a6 \
     --auto-scaling-group-name my-asg --should-decrement-desired-capacity
   ```

现在，您可以将该实例附加到其他自动扩缩组。

**将实例附加到自动扩缩组**

1. 要将实例附加到其他自动扩缩组，请使用以下 [attach-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/attach-instances.html) 命令。

   ```
   aws autoscaling attach-instances --instance-ids i-05b4f7d5be44822a6 --auto-scaling-group-name my-asg-for-testing
   ```

1. 要在连接实例后验证 Auto Scaling 组的大小，请使用以下[describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html)命令。

   ```
   aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg-for-testing
   ```

   以下示例响应显示该组有两个正在运行的实例，其中一个是您附加的实例。

   ```
   {
       "AutoScalingGroups": [
           {
               "AutoScalingGroupName": "my-asg-for-testing",
               "AutoScalingGroupARN": "arn",
               "LaunchTemplate": {
                   "LaunchTemplateName": "my-launch-template",
                   "Version": "2",
                   "LaunchTemplateId": "lt-050555ad16a3f9c7f"
               },
               "MinSize": 1,
               "MaxSize": 5,
               "DesiredCapacity": 2,
               ...
               "Instances": [
                   {
                       "ProtectedFromScaleIn": false,
                       "AvailabilityZone": "us-west-2a",
                       "LaunchTemplate": {
                           "LaunchTemplateName": "my-launch-template",
                           "Version": "1",
                           "LaunchTemplateId": "lt-050555ad16a3f9c7f"
                       },
                       "InstanceId": "i-05b4f7d5be44822a6",
                       "InstanceType": "t3.micro",
                       "HealthStatus": "Healthy",
                       "LifecycleState": "InService"
                   },
                   {
                       "ProtectedFromScaleIn": false,
                       "AvailabilityZone": "us-west-2a",
                       "LaunchTemplate": {
                           "LaunchTemplateName": "my-launch-template",
                           "Version": "2",
                           "LaunchTemplateId": "lt-050555ad16a3f9c7f"
                       },
                       "InstanceId": "i-00dcdfffdf5175890",
                       "InstanceType": "t3.micro",
                       "HealthStatus": "Healthy",
                       "LifecycleState": "InService"
                   }
               ],
               ...
           }
       ]
   }
   ```

------

# 临时从 Auto Scaling 组中移除实例
<a name="as-enter-exit-standby"></a>

您可以将处于 `InService` 状态的实例置于 `Standby` 状态，更新实例或排查实例问题，然后将实例恢复运行状态。处于备用状态的实例仍是 Auto Scaling 组的一部分，但它们不会主动处理负载均衡器流量。

此功能可帮助您停止和启动实例或重新启动实例，而无需担心 Amazon EC2 Auto Scaling 在运行状况检查过程中或在扩展事件期间终止实例。

例如，您可以随时更改启动模板或启动配置，以更改 Auto Scaling 组的 Amazon Machine Image (AMI)。Auto Scaling 组启动的任何后续实例都使用此 AMI。不过，Auto Scaling 组不会更新当前正在运行的实例。您可以终止这些实例并让 Amazon EC2 Auto Scaling 替换它们，或者使用实例刷新功能终止和替换实例。或者，您可以将实例置于备用状态，更新软件，然后将实例恢复运行。

从 Auto Scaling 组中分离实例类似于将实例置于备用状态。如果要将实例附加到不同的组，或像管理独立 EC2 实例一样管理实例并可能终止它们，则分离实例可能会很有用。有关更多信息，请参阅 [从自动扩缩组中分离或附加实例](ec2-auto-scaling-detach-attach-instances.md)。

**Topics**
+ [备用状态的工作方式](#standby-state)
+ [注意事项](#standby-instance-considerations)
+ [处于备用状态的实例的运行状况](#standby-instance-health-status)
+ [通过将实例设置为备用来暂时移除实例](#standby-state)

## 备用状态的工作方式
<a name="standby-state"></a>

备用状态按如下方式工作以帮助您临时从 Auto Scaling 组中删除实例：

1. 将实例置于备用状态。实例保持此状态，直至您退出备用状态。

1. 如果已有负载均衡器目标组或经典负载均衡器附上 Auto Scaling 组，则会将实例取消注册到该负载均衡器。如果为负载均衡器启用了 Connection Draining，预设情况下，Elastic Load Balancing 会等待 300 秒，然后再完成注销过程，这有助于正在进行的请求的完成。

1. 您可以更新实例或排查实例的问题。

1. 可通过退出备用状态，将实例恢复运行状态。

1. 如果已有负载均衡器目标组或经典负载均衡器附上 Auto Scaling 组，则会将实例注册到该负载均衡器。

有关自动扩缩组中实例的生命周期的更多信息，请参阅 [Amazon EC2 Auto Scaling 实例生命周期](ec2-auto-scaling-lifecycle.md)。

## 注意事项
<a name="standby-instance-considerations"></a>

以下是将实例移入和移出备用状态时的注意事项：
+ 当您将实例置于备用状态时，可以通过此操作减少所需容量，也可以将其保持不变。
  + 如果您选择不减少自动扩缩组的所需容量，Amazon EC2 Auto Scaling 会启动一个实例来替换处于备用状态的实例。这样做是为了帮助您在一个或多个实例处于备用状态时保持应用程序的容量。
  + 如果您选择减少自动扩缩组的所需容量，这样会阻止启动实例来替换处于备用状态的实例。
+ 将实例重新投入使用后，所需容量会增加，以反映自动扩缩组中有多少个实例。
+ 要进行增加（和减少）操作，新的所需容量必须介于最小和最大组大小之间。否则，该操作将失败。
+ 如果在将实例置于备用状态或通过退出备用状态使实例恢复服务后，发现您的自动扩缩组在可用区之间不均衡，Amazon EC2 Auto Scaling 会通过重新平衡可用区来进行补偿，除非您暂停 `AZRebalance` 过程。有关更多信息，请参阅 [暂停和恢复 Amazon EC2 Auto Scaling 进程](as-suspend-resume-processes.md)。
+ 您需为处于备用状态的实例付费。

## 处于备用状态的实例的运行状况
<a name="standby-instance-health-status"></a>

Amazon EC2 Auto Scaling 不对处于备用状态的实例执行运行状况检查。当实例处于备用状态时，其运行状况将反映您将实例置于备用状态之前，实例具有的状态。Amazon EC2 Auto Scaling 不对实例执行运行状况检查，直至您将实例恢复运行。

例如，如果您将运行正常的实例置于备用状态，然后终止该实例，则 Amazon EC2 Auto Scaling 会继续将实例报告为运行正常。如果您尝试将处于备用状态的已终止实例重新投入使用，则 Amazon EC2 Auto Scaling 将对实例执行运行状况检查，确定其正在终止且运行状况不佳，并启动替换实例。有关更多信息，请参阅 [自动扩缩组中实例的运行状况检查](ec2-auto-scaling-health-checks.md)。

## 通过将实例设置为备用来暂时移除实例
<a name="standby-state"></a>

使用以下程序之一，通过将实例置于备用状态来暂时停止使用。

------
#### [ Console ]

**临时删除实例**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中 Auto Scaling 组旁边的复选框。

   这时将在页面底部打开一个拆分窗格。

1. 在 **Instance management**（实例管理）选项卡的 **Instances**（实例）中，选择实例。

1. 选择 **Actions**（操作）和 **Set to Standby**（设置为备用）。

1. 在**设置为备用**对话框上，保持**替代实例** 复选框为选中状态，以启动替代实例。清除该复选框可减少所需容量。

1. 当系统提示您进行确认时，键入 **standby** 以确认将指定实例置于 `Standby` 状态，然后选择**设置为备用**。

1. 您可以根据需要更新实例或排查实例的问题。当您完成后，请继续下一步以将实例恢复运行。

1. 选择实例，选择**操作**，**设置为 InService**。在 “**设置为 InService**” 对话框中，选择 “**设置为**” InService。

------
#### [ AWS CLI ]

要从自动扩缩组中暂时移除实例，请使用以下示例命令。将每个 *user input placeholder* 替换为您自己的信息。

**临时删除实例**

1. 使用以下 [describe-auto-scaling-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-instances.html) 命令确定要更新的实例。

   ```
   aws autoscaling describe-auto-scaling-instances \
     --query 'AutoScalingInstances[?AutoScalingGroupName==`my-asg`]'
   ```

   下面的示例显示运行此命令时产生的输出。

   记下您打算从该组中移除的实例的 ID。在下一步骤中，您需要用到此 ID。

   ```
   {
       "AutoScalingInstances": [
           {
               "ProtectedFromScaleIn": false,
               "AvailabilityZone": "us-west-2a",
               "LaunchTemplate": {
                   "LaunchTemplateName": "my-launch-template",
                   "Version": "1",
                   "LaunchTemplateId": "lt-050555ad16a3f9c7f"
               },
               "InstanceId": "i-05b4f7d5be44822a6",
               "InstanceId": "t3.micro",
               "AutoScalingGroupName": "my-asg",
               "HealthStatus": "HEALTHY",
               "LifecycleState": "InService"
           },
          ...
       ]
   }
   ```

1. 将实例移动到 `Standby` 状态使用以下 [enter-standby](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/enter-standby.html) 命令。`--should-decrement-desired-capacity` 选项将减少所需容量以使 Auto Scaling 组不再启动替代实例。

   ```
   aws autoscaling enter-standby --instance-ids i-05b4f7d5be44822a6 \
     --auto-scaling-group-name my-asg --should-decrement-desired-capacity
   ```

   以下为响应示例。

   ```
   {
       "Activities": [
           {
               "ActivityId": "3b1839fe-24b0-40d9-80ae-bcd883c2be32",
               "AutoScalingGroupName": "my-asg",
               "Description": "Moving EC2 instance to Standby: i-05b4f7d5be44822a6",
               "Cause": "At 2023-12-15T21:31:26Z instance i-05b4f7d5be44822a6 was moved to standby 
                 in response to a user request, shrinking the capacity from 4 to 3.",
               "StartTime": "2023-12-15T21:31:26.150Z",
               "StatusCode": "InProgress",
               "Progress": 50,
               "Details": "{\"Subnet ID\":\"subnet-c934b782\",\"Availability Zone\":\"us-west-2a\"}"
           }
       ]
   }
   ```

1. （可选）使用以下 [describe-auto-scaling-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-instances.html) 命令验证实例是否处于 `Standby`。

   ```
   aws autoscaling describe-auto-scaling-instances --instance-ids i-05b4f7d5be44822a6
   ```

   以下为响应示例。注意，实例状态此时为 `Standby`。

   ```
   {
       "AutoScalingInstances": [
           {
               "ProtectedFromScaleIn": false,
               "AvailabilityZone": "us-west-2a",
               "LaunchTemplate": {
                   "LaunchTemplateName": "my-launch-template",
                   "Version": "1",
                   "LaunchTemplateId": "lt-050555ad16a3f9c7f"
               },
               "InstanceId": "i-05b4f7d5be44822a6",
               "InstanceType": "t3.micro",
               "AutoScalingGroupName": "my-asg",
               "HealthStatus": "HEALTHY",
               "LifecycleState": "Standby"
           },
          ...
       ]
   }
   ```

1. 您可以根据需要更新实例或排查实例的问题。当您完成后，请继续下一步以将实例恢复运行。

1. 使用以下 [exit-standby](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/exit-standby.html) 命令使实例恢复运行：

   ```
   aws autoscaling exit-standby --instance-ids i-05b4f7d5be44822a6 --auto-scaling-group-name my-asg
   ```

   以下为响应示例。

   ```
   {
       "Activities": [
           {
               "ActivityId": "db12b166-cdcc-4c54-8aac-08c5935f8389",
               "AutoScalingGroupName": "my-asg",
               "Description": "Moving EC2 instance out of Standby: i-05b4f7d5be44822a6",
               "Cause": "At 2023-12-15T21:46:14Z instance i-05b4f7d5be44822a6 was moved out of standby in
                  response to a user request, increasing the capacity from 3 to 4.",
               "StartTime": "2023-12-15T21:46:14.678Z",
               "StatusCode": "PreInService",
               "Progress": 30,
               "Details": "{\"Subnet ID\":\"subnet-c934b782\",\"Availability Zone\":\"us-west-2a\"}"
           }
       ]
   }
   ```

1. （可选）使用以下 `describe-auto-scaling-instances` 命令验证实例是否已恢复运行。

   ```
   aws autoscaling describe-auto-scaling-instances --instance-ids i-05b4f7d5be44822a6
   ```

   以下为响应示例。请注意，实例状态为 `InService`。

   ```
   {
       "AutoScalingInstances": [
           {
               "ProtectedFromScaleIn": false,
               "AvailabilityZone": "us-west-2a",
               "LaunchTemplate": {
                   "LaunchTemplateName": "my-launch-template",
                   "Version": "1",
                   "LaunchTemplateId": "lt-050555ad16a3f9c7f"
               },
               "InstanceId": "i-05b4f7d5be44822a6",
               "InstanceType": "t3.micro",
               "AutoScalingGroupName": "my-asg",
               "HealthStatus": "HEALTHY",
               "LifecycleState": "InService"
           },
          ...
       ]
   }
   ```

------

# 删除 Auto Scaling 基础设施
<a name="as-process-shutdown"></a>

要完全删除您的扩展基础设施，请完成以下任务。

**Topics**
+ [删除 Auto Scaling 组](#as-shutdown-lbs-delete-asg-cli)
+ [（可选）删除启动配置](#as-shutdown-lbs-delete-lc-cli)
+ [（可选）删除启动模板](#as-shutdown-lbs-delete-lt-cli)
+ [（可选）删除负载均衡器和目标组](#as-shutdown-lbs-delete-lbs-cli)
+ [（可选）删除 CloudWatch 警报](#as-shutdown-delete-alarms-cli)
+ [为您的 Amazon EC2 Auto Scaling 资源配置删除保护](resource-deletion-protection.md)

## 删除 Auto Scaling 组
<a name="as-shutdown-lbs-delete-asg-cli"></a>

当您删除 Auto Scaling 组时，其所需值、最小值和最大值设置为 0。因此，将会终止实例。删除实例还会删除任何关联的日志或数据，以及该实例上的任何卷。如果不想终止一个或多个实例，您可在删除 Auto Scaling 组之前分离它们。如果组具有扩展策略，则在删除组时，将会删除策略、基础警报操作以及不再具有关联操作的任何警报。

**删除 Auto Scaling 组（控制台）**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中自动扩缩组旁边的复选框并选择**操作**，**删除**。

1. 当系统提示进行确认时，键入 **delete** 以确认删除指定自动扩缩组，然后选择 **Delete**（删除）。

   **Name**（名称）列中的加载图标指示 Auto Scaling 组正在被删除。**所需**、**最小**和**最大**列显示自动扩缩组具有 `0` 个实例。终止实例并删除组需要几分钟时间。刷新列表以查看当前状态。

**要删除 Auto Scaling 组 (AWS CLI)**  
使用以下[delete-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/delete-auto-scaling-group.html)命令删除 Auto Scaling 组。如果该组有任何 EC2 实例，则此操作不起作用；它仅适用于具有零个实例的组。

```
aws autoscaling delete-auto-scaling-group --auto-scaling-group-name my-asg
```

如果该组正在进行实例或扩展活动，请使用带`--force-delete`选项的[delete-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/delete-auto-scaling-group.html)命令。这同时将终止 EC2 实例。当您从 Amazon EC2 Auto Scaling 控制台中删除自动扩缩组时，控制台使用此操作终止所有 EC2 实例并同时删除该组。

```
aws autoscaling delete-auto-scaling-group --auto-scaling-group-name my-asg --force-delete
```

## （可选）删除启动配置
<a name="as-shutdown-lbs-delete-lc-cli"></a>

要保留启动配置以备将来使用，可跳过此步骤。

**删除启动配置（控制台）**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在左侧导航窗格的**自动扩缩**下方，选择**自动扩缩组**。

1. 在页面顶部附近，选择**启动配置**。当提示您确认时，选择**查看启动配置**以确认您要查看**启动配置**页面。

1. 选择启动配置，选择 **操作**，然后单击 **删除启动配置**。

1. 当系统提示进行确认时，选择 **Delete（删除）**。

**删除启动配置 (AWS CLI)**  
使用以下 [delete-launch-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/delete-launch-configuration.html) 命令。

```
aws autoscaling delete-launch-configuration --launch-configuration-name my-launch-config
```

## （可选）删除启动模板
<a name="as-shutdown-lbs-delete-lt-cli"></a>

您可以删除启动模板或仅删除启动模板的某个版本。在删除启动模板时，将删除其所有版本。

您可以跳过此步骤来保留启动模板以供将来使用。

**删除启动模板（控制台）**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中的**实例**下，选择**启动模板**。

1. 选择启动模板，然后执行下列操作之一：
   + 选择 **Actions**（操作），然后选择 **Delete template**（删除模板）。当系统提示进行确认时，键入 **Delete** 以确认删除指定启动模板，然后选择 **Delete**（删除）。
   + 选择 **Actions**（操作），然后选择 **Delete template version**（删除模板版本）。选择要删除的版本，然后选择 **Delete (删除)**。

**删除启动模板 (AWS CLI)**  
使用以下 [delete-launch-template](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/delete-launch-template.html) 命令可删除您的模板及其所有版本。

```
aws ec2 delete-launch-template --launch-template-id lt-068f72b72934aff71
```

或者，您也可以使用 [delete-launch-template-versions](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/delete-launch-template-versions.html) 命令删除启动模板的特定版本。

```
aws ec2 delete-launch-template-versions --launch-template-id lt-068f72b72934aff71 --versions 1
```

## （可选）删除负载均衡器和目标组
<a name="as-shutdown-lbs-delete-lbs-cli"></a>

如果未在 Elastic Load Balancing 负载均衡器中关联 Auto Scaling 组，或者要保留负载均衡器以供将来使用，请跳过该步骤。

**删除您的负载均衡器（控制台）**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格上的 **Load Balancing**（负载均衡）下，选择 **Load Balancers**（负载均衡器）。

1. 选择负载均衡器，然后依次选择 **Actions**（操作）和 **Delete**（删除）。

1. 当系统提示进行确认时，选择 **Yes, Delete**（是，删除）。

**删除目标组（控制台）**

1. 在导航窗格上的**负载均衡**下，选择**目标组**。

1. 选择目标组，然后依次选择 **Actions**（操作）、**Delete**（删除）。

1. 当系统提示进行确认时，选择 **Yes, Delete**（是，删除）。

**删除与 Auto Scaling 组关联的负载均衡器 (AWS CLI)**  
对于应用程序负载均衡器和网络负载均衡器，请使用以下[delete-load-balancer](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/elbv2/delete-load-balancer.html)和命令。[delete-target-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/elbv2/delete-target-group.html)

```
aws elbv2 delete-load-balancer --load-balancer-arn my-load-balancer-arn
aws elbv2 delete-target-group --target-group-arn my-target-group-arn
```

对于经典负载均衡器，请使用以下[delete-load-balancer](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/elb/delete-load-balancer.html)命令。

```
aws elb delete-load-balancer --load-balancer-name my-load-balancer
```

## （可选）删除 CloudWatch 警报
<a name="as-shutdown-delete-alarms-cli"></a>

要删除与您的 Auto Scaling 组关联的 CloudWatch 警报，请完成以下步骤。例如，您可能有与步进扩缩策略或简单扩缩策略相关的警报。

**注意**  
删除 Auto Scaling 组会自动删除 Amazon EC2 Auto Scaling 为目标跟踪扩展策略管理的 CloudWatch 警报。

如果您的 Auto Scaling 组未与任何 CloudWatch 警报关联，或者您想保留警报以备将来使用，则可以跳过此步骤。

**删除 CloudWatch 警报（控制台）**

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1. 在导航窗格上，选择 **Alarms**（警报）。

1. 选择警报，然后选择 **Action**（操作）、**Delete**（删除）。

1. 当系统提示进行确认时，选择 **Delete**（删除）。

**删除 CloudWatch 警报 (AWS CLI)**  
使用 [delete-alarms](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudwatch/delete-alarms.html) 命令。您可以一次删除一个或多个警报。例如，使用以下命令可删除 `Step-Scaling-AlarmHigh-AddCapacity` 和 `Step-Scaling-AlarmLow-RemoveCapacity` 警报：

```
aws cloudwatch delete-alarms --alarm-name Step-Scaling-AlarmHigh-AddCapacity Step-Scaling-AlarmLow-RemoveCapacity
```

# 为您的 Amazon EC2 Auto Scaling 资源配置删除保护
<a name="resource-deletion-protection"></a>

 通过配置多层保护，保护您的 Amazon EC2 Auto Scaling 基础设施免遭意外删除。Auto Scaling 提供了多种方法来防止您的 Auto Scaling 群组及其管理的 Amazon EC2 实例删除不必要的资源。

**Topics**
+ [配置 Auto Scaling 群组删除保护](#asg-deletion-protection)
+ [使用 IAM 策略控制删除权限](#deletion-protection-iam-policies)

## 配置 Auto Scaling 群组删除保护
<a name="asg-deletion-protection"></a>

 删除保护是一种资源级设置，可防止您的 Amazon EC2 Auto Scaling 组被意外删除。启用删除保护后，会阻止 [ DeleteAutoScalingGroup](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_DeleteAutoScalingGroup.html)API 操作成功，要求您先将删除保护设置更新到限制较少的级别，然后才能删除 Auto Scaling 组。

Amazon EC2 Auto Scaling 提供三个级别的删除保护：

**无**（默认）  
 未启用删除保护，这意味着无论是否使用该`ForceDelete`选项，都可以删除您的 Auto Scaling 组。使用时，由您`ForceDelete`的 Auto Scaling 组管理的所有 Amazon EC2 实例也将被强制终止，而不执行终止生命周期挂钩。

**防止强制删除**  
 使用该`ForceDelete`选项时，无法删除您的 Auto Scaling 群组。此配置允许删除空的 Auto Scaling 组（没有实例的组）。对于希望防止大规模实例终止但允许清理空组的生产工作负载，建议使用此选项。

**阻止所有删除**  
 无论是否使用该`ForceDelete`选项，都无法删除您的 Auto Scaling 群组。此选项为防止意外删除提供了最强的保护。在删除您的 Auto Scaling 组之前，需要明确禁用删除保护。对于很少或永远不应该删除的任务关键型 Auto Scaling 组，建议使用此选项。

### 删除保护的工作原理
<a name="deletion-protection-how-it-works"></a>

 当你在启用删除保护的情况下尝试 [ DeleteAutoScalingGroup](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_DeleteAutoScalingGroup.html)API 操作时：

1.  Amazon EC2 Auto Scaling 会在处理请求之前验证删除保护设置。

1.  如果配置的删除保护级别阻止了删除尝试，则 Amazon EC2 Auto Scaling 会返回`ValidationError`。

1.  您的 Auto Scaling 组及其 Amazon EC2 实例保持不变。

1.  必须先将删除保护设置更新到限制较少的级别，然后才能删除 Auto Scaling 组。

 删除保护不会阻止其他操作，例如：
+  更新 Auto Scaling 组配置。
+  终止单个实例。
+  缩放操作（手动或自动）。
+  暂停或恢复进程。

 有关如何优雅地处理实例终止的更多信息，请参阅[设计您的应用程序以妥善处理实例终止](gracefully-handle-instance-termination.md)。

### 配置删除保护
<a name="configure-deletion-protection"></a>

 在创建 Auto Scaling 组或更新现有 Auto Scaling 组的设置时，可以设置删除保护。

------
#### [ Console ]

**创建具有删除保护的 Auto Scaling 组**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选择 **Create Auto Scaling group**（创建 Auto Scaling 组）。

1. 完成您的 Auto Scaling 组的配置步骤。

1. 在**配置群组大小和缩放比例**页面上，展开**其他设置**。

1. 对于 **Auto Scaling 组删除保护**，请选择所需的保护级别：
   + **无**-无删除保护（默认）
   + **防止强制删除**-阻止强制删除操作
   + **阻止所有删除**-阻止所有删除操作

1. 完成其余步骤以创建您的 Auto Scaling 组。

**更新现有 Auto Scaling 组的删除保护**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中您的自动扩缩组旁边的复选框。

1. 选择 **Actions**（操作）和 **Edit**（编辑）。

1. 在 **“其他设置”** 下，更新 **Auto Scaling 组删除保护**设置。

1. 选择**更新**。

------
#### [ AWS CLI ]

**创建具有删除保护的 Auto Scaling 组**  
将 [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html) 命令与 `--deletion-protection` 参数一起使用：

```
aws autoscaling create-auto-scaling-group \
    --auto-scaling-group-name my-asg \
    --launch-template LaunchTemplateName=my-template,Version='$Latest' \
    --min-size 1 \
    --max-size 5 \
    --desired-capacity 2 \
    --vpc-zone-identifier "subnet-12345678,subnet-87654321" \
    --deletion-protection prevent-force-deletion
```

的有效值`--deletion-protection`为：`none`\$1 `prevent-force-deletion` \$1 `prevent-all-deletion`

**更新现有 Auto Scaling 组的删除保护**  
使用 [update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html) 命令：

```
aws autoscaling update-auto-scaling-group \
    --auto-scaling-group-name my-asg \
    --deletion-protection prevent-all-deletion
```

**禁用删除保护**  
将删除保护设置为`none`：

```
aws autoscaling update-auto-scaling-group \
    --auto-scaling-group-name my-asg \
    --deletion-protection none
```

**验证删除保护状态**  
使用 [describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html) 命令：

```
aws autoscaling describe-auto-scaling-groups \
    --auto-scaling-group-names my-asg
```

------

## 使用 IAM 策略控制删除权限
<a name="deletion-protection-iam-policies"></a>

 使用 AWS Identity and Access Management (IAM) 策略控制哪些用户和角色可以删除 Auto Scaling 群组。基于 IAM 的控件通过限制身份级别的权限来提供额外的安全保护。

当您想执行以下操作时，IAM 策略特别有用：
+  允许不同的用户对不同级别的 Auto Scaling 操作进行访问。
+  阻止特定用户使用该`ForceDelete`选项，即使他们可以执行其他 Auto Scaling 操作。
+  将删除权限限制为特定的 Auto Scaling 群组。

 以下策略仅允许在自动扩缩组具有标签时删除该组`environment=development`。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [{
      "Effect": "Allow",
      "Action": "autoscaling:DeleteAutoScalingGroup",
      "Resource": "*",
      "Condition": {
          "StringEquals": { "aws:ResourceTag/environment": "development" }
      }
   }]
}
```

------

 以下策略使用`autoscaling:ForceDelete`条件密钥来控制对 `DeleteAutoScalingGroup` API 操作的访问权限。这可能会阻止某些用户使用该`ForceDelete`操作，该操作会终止 Auto Scaling 组中的所有 Amazon EC2 实例。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Effect": "Deny",
        "Action": "autoscaling:DeleteAutoScalingGroup",
        "Resource": "*",
        "Condition": {
            "Bool": {
                "autoscaling:ForceDelete": "true"
            }
        }
    }]
}
```

------

 或者，如果您不使用条件键来控制对 Auto Scaling 组 ARNs 的访问，则可以改为指定`Resource`元素中的资源来控制访问权限。

 以下策略向用户授予使用 `DeleteAutoScalingGroup` API 操作的权限，但仅适用于名称以开头的 Auto Scaling 群组`devteam-`。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "autoscaling:DeleteAutoScalingGroup",
            "Resource": "arn:aws:autoscaling:us-east-1:111122223333:autoScalingGroup:*:autoScalingGroupName/devteam-*"
        }
    ]
}
```

------

 您也可以 ARNs 通过将它们包含在列表中来指定多个。包括 UUID 可确保将访问权授予特定的 Auto Scaling 组。新群组的 UUID 与已删除的同名群组的 UUID 不同。

```
"Resource": [
    "arn:aws:autoscaling:region:account-id:autoScalingGroup:uuid:autoScalingGroupName/devteam-1",
    "arn:aws:autoscaling:region:account-id:autoScalingGroup:uuid:autoScalingGroupName/devteam-2",
    "arn:aws:autoscaling:region:account-id:autoScalingGroup:uuid:autoScalingGroupName/devteam-3"
]
```

 有关 Amazon EC2 Auto Scaling 的 IAM 策略的其他示例，包括控制删除权限的策略，请参阅[基于身份的策略示例](security_iam_id-based-policy-examples.md)。