View a markdown version of this page

为您的 Amazon ECS Auto Scaling 组配置预初始化的实例 - Amazon Elastic Container Service

为您的 Amazon ECS Auto Scaling 组配置预初始化的实例

Amazon ECS 支持 Amazon EC2 Auto Scaling 暖池。暖池是一组准备投入使用的预初始化 Amazon EC2 实例。每当您的应用程序需要横向扩展时,Amazon EC2 Auto Scaling 都会使用暖池中的预初始化实例,而不是启动冷实例,允许运行任何最终初始化过程,然后将实例投入使用。

要了解有关暖池以及如何将暖池添加到 自动扩缩组的更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南中的 Amazon EC2 Auto Scaling 的暖池

当您为 Amazon ECS 的自动扩缩组创建或更新温池时,无法设置在横向缩减时将实例退回暖池的选项(ReuseOnScaleIn)。有关更多信息,请参阅《AWS Command Line Interface 参考》中的 put-warm-pool

要将暖池与您的 Amazon ECS 集群一起使用,请在 Amazon EC2 Auto Scaling 组启动模板的 User data(用户数据)字段中将 ECS_WARM_POOLS_CHECK 代理配置变量设置为 true

以下示例介绍如何在 Linux 实例的 Amazon EC2 启动模板的 User data(用户数据)字段中指定代理配置变量。将 MyCluster 替换为您的集群的名称。若为 Windows 实例,请参阅在 Amazon ECS Windows 实例上使用暖池

#!/bin/bash cat <<'EOF' >> /etc/ecs/ecs.config ECS_CLUSTER=MyCluster ECS_WARM_POOLS_CHECK=true EOF

ECS_WARM_POOLS_CHECK 变量仅在代理版本 1.59.0 和更高版本上受支持。有关变量的更多信息,请参阅 Amazon ECS 容器代理配置

在 Amazon ECS Windows 实例上使用暖池

在 Windows 实例上使用池状态为已停止的暖池时,请使用 Amazon EC2 Auto Scaling 生命周期挂钩来确保在实例停止之前完成用户数据的执行。如果没有生命周期挂钩,则实例可能会在 Amazon ECS 初始化完成之前停止。

要为 Windows 暖池实例配置生命周期挂钩,请执行以下操作:

  1. 将以下 IAM 策略添加到您的容器实例角色以允许实例完成生命周期操作:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction" ], "Resource": "*" } ] }
  2. 实例启动时向自动扩缩组添加生命周期挂钩,其默认结果为 ABANDON,心跳超时允许有足够的时间进行 Amazon ECS 初始化(例如 10 分钟)。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的添加生命周期挂钩

  3. 使用以下创建计划任务的用户数据在延迟后完成生命周期操作。延迟可确保 EC2Launch 在实例停止之前完成保存其状态。用您的值替换 MyClustermy-lifecycle-hookmy-asg-name

    <powershell> $lifecycleHookName = "my-lifecycle-hook" $autoScalingGroupName = "my-asg-name" $scriptContent = @' $token = Invoke-RestMethod -Method Put -Uri http://169.254.169.254/latest/api/token -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} $instanceId = Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/instance-id -Headers @{"X-aws-ec2-metadata-token" = $token} $region = Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/placement/region -Headers @{"X-aws-ec2-metadata-token" = $token} $lifecycleHookName = "my-lifecycle-hook" $autoScalingGroupName = "my-asg-name" Complete-ASLifecycleAction -LifecycleHookName $lifecycleHookName -AutoScalingGroupName $autoScalingGroupName -InstanceId $instanceId -LifecycleActionResult 'CONTINUE' -Region $region '@ Set-Content -Path "C:\ProgramData\Amazon\ECS\complete-lifecycle.ps1" -Value $scriptContent try { [Environment]::SetEnvironmentVariable("ECS_WARM_POOLS_CHECK", "true", "Machine") Import-Module ECSTools Initialize-ECSAgent -Cluster MyCluster -EnableTaskIAMRole $taskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File C:\ProgramData\Amazon\ECS\complete-lifecycle.ps1" $taskTrigger = New-ScheduledTaskTrigger -Once -At ((Get-Date).AddSeconds(60)) $settings = New-ScheduledTaskSettingsSet -StartWhenAvailable $taskPrincipal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest Register-ScheduledTask -TaskName "CompleteLifecycleHook" -Action $taskAction -Trigger $taskTrigger -Principal $taskPrincipal -Settings $settings -Force } catch { $token = Invoke-RestMethod -Method Put -Uri http://169.254.169.254/latest/api/token -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} $INSTANCE = Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/instance-id -Headers @{"X-aws-ec2-metadata-token" = $token} $region = Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/placement/region -Headers @{"X-aws-ec2-metadata-token" = $token} Complete-ASLifecycleAction -InstanceId $INSTANCE -LifecycleHookName $lifecycleHookName -AutoScalingGroupName $autoScalingGroupName -LifecycleActionResult ABANDON -Region $region } </powershell> <persist>true</persist>

该用户数据脚本执行以下操作:

  • 在启用暖池检查的情况下初始化 Amazon ECS 代理。

  • 创建计划任务,该任务在用户数据完成后等待 30 秒,然后向生命周期挂钩发出继续操作的信号。延迟允许 EC2Launch 保存其状态,以便用户数据在后续启动时正确重新运行。

  • 如果初始化失败,则生命周期操作已完成但 ABANDON,因此实例将被终止并替换。