View a markdown version of this page

从自动扩缩组中分离或附加实例 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

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

从自动扩缩组中分离或附加实例

您可以从自动扩缩组中分离实例。分离实例后,该实例将变为独立,可以自行管理,也可以附加到与其所属原始组分开的其他自动扩缩组。例如,当您想要使用已经运行应用程序的现有实例执行测试时,这可能很有用。

本主题提供有关如何分离和附加实例的说明。附加实例时,您也可以使用现有实例而不是已分离的实例。

建议使用备用程序将实例暂时从组中删除,而不是将实例分离然后重新附加到同一个组。有关更多信息,请参阅 临时从 Auto Scaling 组中移除实例。

分离实例的注意事项

分离实例时,请记住以下几点:

  • 仅当实例处于 InService 或 StandBy 状态时,您才能将其分离。如果您要分离的实例位于 StandBy 状态,请谨慎行事。将实例置于 StandBy 状态后尝试分离实例时,在 API 调用中添加 ShouldDecrementDesiredCapacity 标志可能会导致其他实例意外终止。

  • 分离实例后,该实例会继续运行并产生费用。为避免不必要的费用,请确保在不再需要时重新附加或终止已分离的实例。

  • 您可以选择按照要分离的实例数量递减所需容量。如果您选择不递减容量,Amazon EC2 Auto Scaling 会启动新实例替换分离的实例以维持所需容量。

  • 如果要分离的实例数将使自动扩缩组容量降到低于其最小容量,则必须递减最小容量。

  • 如果在未递减所需容量的情况下从同一可用区分离多个实例,除非暂停 AZRebalance 进程,否则组将自行重新平衡。有关更多信息,请参阅 暂停和恢复 Amazon EC2 Auto Scaling 进程。

  • 如果您将实例从已附加负载均衡器目标组或经典负载均衡器的 Auto Scaling 组分离,则将从该负载均衡器取消注册实例。如果为负载均衡器启用了连接耗尽(取消注册延迟),则 Amazon EC2 Auto Scaling 会等待未送达请求完成。

附加实例的注意事项

附加实例时应注意以下几点:

  • Amazon EC2 Auto Scaling 对附加的实例与组本身启动的实例同等对待。这意味着,如果选择了附加的实例,则可以在横向缩减事件期间将其终止。AWSServiceRoleForAutoScaling 服务相关角色授予的权限允许 Amazon EC2 Auto Scaling 执行此操作。

  • 当您附加实例时,该组的所需容量将增加要附加的实例数。如果添加新实例后的所需容量超出了组的最大大小,则附加更多实例的请求会失败。

  • 如果您向组中添加实例,导致跨可用区分布不均衡,Amazon EC2 Auto Scaling 会重新平衡该组以重新建立均衡分配,除非您暂停 AZRebalance 流程。有关更多信息,请参阅 暂停和恢复 Amazon EC2 Auto Scaling 进程。

  • 如果您将实例附加到已附加负载均衡器目标组或经典负载均衡器的 Auto Scaling 组,则会将实例注册到该负载均衡器。

对于要附加的实例,必须满足以下条件:

  • 该实例通过 Amazon EC2 处于 running 的状态。

  • 用于启动实例的 AMI 必须仍然存在。

  • 实例不是其他 Auto Scaling 组的成员。

  • 实例会启动到自动扩缩组中定义的可用区之一。

  • 如果 Auto Scaling 组具有附加的负载均衡器目标组或经典负载均衡器,则实例和负载均衡器必须都位于同一 VPC 中。

使用分离和附加将实例移至其他组

使用以下程序之一将实例与自动扩缩组分离,然后将其附加到其他自动扩缩组。

要从分离的实例创建新的自动扩缩组,请参阅使用现有实例创建 Auto Scaling 组 Amazon CLI(不推荐,创建启动配置)。

Console
将实例与自动扩缩组分离
  1. 在上打开 Amazon EC2 控制台 https://console.aws.amazon.com/ec2/,然后从导航窗格中选择 A uto Scaling Gro ups。

  2. 选中您的自动扩缩组旁边的复选框。

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

  3. 在 Instance management(实例管理)选项卡上的 Instances(实例)中,选择一个实例,然后选择 Actions(操作)、Detach(分离)。

  4. 在分离实例对话框中,保持替换实例复选框处于选中状态以启动替换实例。清除该复选框可减少所需容量。

  5. 当系统提示进行确认时,键入 detach 以确认从自动扩缩组中删除指定的实例,然后选择 Detach instance。

现在,您可以将该实例附加到其他自动扩缩组。

将实例附加到自动扩缩组
  1. 打开位于 https://console.aws.amazon.com/ec2/ 的 Amazon EC2 控制台。

  2. (可选)在导航窗格上的 Auto Scaling 下,选择 Auto Scaling Groups(Auto Scaling 组)。选择 Auto Scaling 组并验证 Auto Scaling 组的最大大小足以再添加一个实例。否则,在 Details(详细信息)选项卡上,增加最大容量。

  3. 在导航窗格上的 Instances(实例)下,选择 Instances(实例),然后选择一个实例。

  4. 依次选择操作、实例设置和附加到 Auto Scaling 组。

  5. 在附加到 Auto Scaling 组页面上,为 Auto Scaling 组,输入组名称,然后选择附加。

  6. 如果实例不符合条件,则会显示一条错误消息并提供详细信息。例如,实例可能没有位于与 Auto Scaling 组相同的可用区中。选择关闭并使用符合条件的自动扩缩组重试。

Amazon CLI

要分离和附加实例,请使用以下示例命令。将每个 user input placeholder 替换为您自己的信息。

将实例与自动扩缩组分离
  1. 要描述当前实例,请使用以下describe-auto-scaling-instances命令。

    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" } ] }
  2. 要分离实例而不递减所需容量,请使用以下 detach-instances 命令。

    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 命令。

    aws autoscaling attach-instances --instance-ids i-05b4f7d5be44822a6 --auto-scaling-group-name my-asg-for-testing
  2. 要在连接实例后验证 Auto Scaling 组的大小,请使用以下describe-auto-scaling-groups命令。

    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" } ], ... } ] }