View a markdown version of this page

Konfiguration vorinitialisierter Instances für Ihre Auto-Scaling-Gruppe in Amazon ECS - Amazon Elastic Container Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Konfiguration vorinitialisierter Instances für Ihre Auto-Scaling-Gruppe in Amazon ECS

Amazon ECS unterstützt Warm-Pools für Amazon EC2 Auto Scaling. Ein Warm-Pool ist eine Gruppe von vorinitialisierten Amazon-EC2-Instances, die bereit sind, in Betrieb genommen zu werden. Wann immer Ihre Anwendung aufskaliert werden muss, verwendet Amazon EC2 Auto Scaling die vorinitialisierten Instances aus dem Warm-Pool, anstatt kalte Instances zu launchen, erlaubt die Ausführung eines endgültigen Initialisierungsprozesses und stellt die Instance dann in Betrieb.

Weitere Informationen zu Warm-Pools und zum Hinzufügen eines Warm-Pools zu Ihrer Auto-Scaling-Gruppe finden Sie unter Warm-Pools für Amazon EC2 Auto Scaling im Benutzerhandbuch zu Amazon EC2 Auto Scaling.

Wenn Sie einen Warm-Pool für eine Auto-Scaling-Gruppe für Amazon ECS erstellen oder aktualisieren, können Sie die Option nicht festlegen, mit der Instances an den Warm-Pool beim Abskalieren zurückgegeben werden (ReuseOnScaleIn). Weitere Informationen finden Sie unter put-warm-pool in der AWS Command Line Interface Referenz.

Um Warm-Pools mit Ihrem Amazon-ECS-Cluster zu verwenden, setzen Sie die Agent-Konfigurationsvariable ECS_WARM_POOLS_CHECK im Feld User data (Benutzerdaten) der Launchvorlage Ihrer Amazon-EC2-Auto-Scaling-Gruppe auf true.

Im Folgenden wird ein Beispiel dafür gezeigt, wie die Agentenkonfigurationsvariable im Feld Benutzerdaten einer Amazon EC2-Startvorlage für Linux-Instances angegeben werden kann. Ersetzen Sie MyCluster mit dem Namen Ihres Clusters. Für Windows-Instances siehe Verwendung von Warm-Pools mit Amazon ECS-Windows-Instances.

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

Diese Variable ECS_WARM_POOLS_CHECK wird nur von den Agenten-Versionen 1.59.0 oder höher unterstützt. Weitere Informationen zu der Variablen finden Sie unter Konfiguration des Amazon-ECS-Container-Agenten.

Verwendung von Warm-Pools mit Amazon ECS-Windows-Instances

Wenn Sie Warm-Pools mit dem Status Stopped Pool auf Windows-Instances verwenden, verwenden Sie Amazon EC2 Auto Scaling-Lifecycle-Hooks, um sicherzustellen, dass die Ausführung der Benutzerdaten abgeschlossen ist, bevor die Instance gestoppt wird. Ohne Lifecycle-Hooks kann die Instance gestoppt werden, bevor die Amazon ECS-Initialisierung abgeschlossen ist.

So konfigurieren Sie Lifecycle-Hooks für Windows Warm Pool-Instances:

  1. Fügen Sie Ihrer Container-Instance-Rolle die folgende IAM-Richtlinie hinzu, damit die Instance die Lifecycle-Aktion abschließen kann:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction" ], "Resource": "*" } ] }
  2. Fügen Sie Ihrer Auto Scaling-Gruppe beim Start der Instance einen Lifecycle-Hook hinzu. ABANDON Als Standardergebnis und ein Heartbeat-Timeout, das genügend Zeit für die Amazon ECS-Initialisierung einräumt (z. B. 10 Minuten). Weitere Informationen finden Sie unter Lebenszyklus-Hooks hinzufügen im Benutzerhandbuch zu Amazon EC2 Auto Scaling.

  3. Verwenden Sie die folgenden Benutzerdaten, um eine geplante Aufgabe zu erstellen, um die Lifecycle-Aktion nach einer Verzögerung abzuschließen. Die Verzögerung stellt sicher, dass EC2Launch das Speichern seines Status abgeschlossen hat, bevor die Instance gestoppt wird. Ersetzen Sie MyClustermy-lifecycle-hook, und my-asg-name durch Ihre Werte.

    <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" $taskTriggerOnce = New-ScheduledTaskTrigger -Once -At ((Get-Date).AddSeconds(60)) $taskTriggerStartup = New-ScheduledTaskTrigger -AtStartup $taskTriggerStartup.Delay = "PT60S" $settings = New-ScheduledTaskSettingsSet -StartWhenAvailable $taskPrincipal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest Register-ScheduledTask -TaskName "CompleteLifecycleHook" -Action $taskAction -Trigger $taskTriggerOnce, $taskTriggerStartup -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>

Dieses Benutzerdatenskript führt folgende Aktionen aus:

  • Initialisiert den Amazon ECS-Agenten mit aktivierter Warm-Pools-Überprüfung.

  • Erstellt eine geplante Aufgabe, die 60 Sekunden wartet, nachdem die Benutzerdaten abgeschlossen sind, und signalisiert dann dem Lifecycle-Hook, dass er fortfährt.

  • Erstellt eine geplante Aufgabe, die bei jedem nachfolgenden Neustart ausgeführt wird, und signalisiert dem Lifecycle-Hook, dass er nach 60 Sekunden fortfährt.

  • Schlägt die Initialisierung fehl, wird die Lifecycle-Aktion abgeschlossen, ABANDON sodass die Instanz beendet und ersetzt wird.