本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
為 Amazon ECS Auto Scaling 群組設定預先初始化的執行個體
Amazon ECS 支援 Amazon EC2 Auto Scaling 暖集區。暖集區是一組準備投入使用的預先初始化 Amazon EC2 執行個體。每當應用程式需要水平擴展時,Amazon EC2 Auto Scaling 都會使用暖集區中的預初始化執行個體 (而不是啟動冷執行個體),讓任何最終初始化程序執行,然後將執行個體投入使用。
若要瞭解有關暖集區以及如何將暖集區新增到 Auto Scaling 群組中的詳細資訊,請參閱《Amazon EC2 Auto Scaling 使用者指南》中的 Amazon EC2 Auto Scaling 的暖集區。
當您為 Amazon ECS 的 Auto Scaling 群組建立或更新暖集區時,無法設定將執行個體傳回縮減暖集區的選項 (ReuseOnScaleIn)。如需詳細資訊,請參閱 AWS Command Line Interface 參考中的 put-warm-pool。
若要將暖集區與 Amazon ECS 叢集配合使用,請在 Amazon EC2 Auto Scaling 群組啟動範本 User data (使用者資料) 欄位中將 ECS_WARM_POOLS_CHECK 代理程式組態變數設定為 true。
以下顯示如何在 Linux 執行個體 Amazon EC2 啟動範本的使用者資料欄位中指定代理程式組態變數的範例。將 MyCluster 取代為您的叢集名稱。針對 Windows 執行個體,請參閱 搭配 Amazon ECS Windows 執行個體使用暖集區。
#!/bin/bash cat <<'EOF' >> /etc/ecs/ecs.config ECS_CLUSTER=MyClusterECS_WARM_POOLS_CHECK=true EOF
僅代理程式版本 1.59.0 和更新版本支援 ECS_WARM_POOLS_CHECK 變數。如需變數的詳細資訊,請參閱 Amazon ECS 容器代理程式組態。
搭配 Amazon ECS Windows 執行個體使用暖集區
在 Windows 執行個體上使用具有已停止集區狀態的暖集區時,請使用 Amazon EC2 Auto Scaling 生命週期掛鉤,以確保在執行個體停止之前完成使用者資料執行。如果沒有生命週期關聯,執行個體可能會在 Amazon ECS 初始化完成之前停止。
若要設定 Windows 暖集區執行個體的生命週期掛鉤:
-
將下列 IAM 政策新增至您的容器執行個體角色,以允許執行個體完成生命週期動作:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction" ], "Resource": "*" } ] } -
在執行個體上使用 啟動時,將生命週期掛鉤新增至 Auto Scaling 群組
ABANDON做為預設結果,並新增活動訊號逾時,以允許足夠的時間進行 Amazon ECS 初始化 (例如 10 分鐘)。如需詳細資訊,請參閱 Amazon EC2 Auto Scaling 使用者指南中的新增 lifecycle hook。 -
使用下列使用者資料來建立排程任務,以在延遲後完成生命週期動作。延遲可確保 EC2Launch 在執行個體停止之前完成儲存其狀態。將
MyCluster、my-lifecycle-hook和my-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 -ClusterMyCluster-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因此執行個體會終止並取代。