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 finden Sie ein Beispiel dafür, wie die Agentenkonfigurationsvariable im Feld Benutzerdaten einer Amazon EC2 EC2-Startvorlage für Linux-Instances angegeben werden kann. Ersetzen Sie MyCluster mit dem Namen Ihres Clusters. Für Windows-Instances siehe Verwenden von warmen 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.

Verwenden von warmen Pools mit Amazon ECS-Windows-Instances

Wenn Sie warme Pools mit dem Poolstatus Stopped auf Windows-Instances verwenden, verwenden Sie Amazon EC2 Auto Scaling Scaling-Lifecycle-Hooks, um sicherzustellen, dass die Benutzerdatenausführung 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 Scaling-Gruppe beim Start der Instance einen Lifecycle-Hook mit ABANDON als Standardergebnis und einem Heartbeat-Timeout hinzu, das genügend Zeit für die Amazon ECS-Initialisierung bietet (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 Lebenszyklusaktion nach einer Verzögerung abzuschließen. Die Verzögerung stellt sicher, dass EC2Launch das Speichern seines Status beendet, 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" $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>

Dieses Benutzerdatenskript führt folgende Aktionen aus:

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

  • Erstellt eine geplante Aufgabe, die 30 Sekunden nach Abschluss der Benutzerdaten wartet und dann dem Lifecycle-Hook signalisiert, fortzufahren. Die Verzögerung ermöglicht es EC2Launch, seinen Status zu speichern, sodass Benutzerdaten bei nachfolgenden Starts wieder korrekt ausgeführt werden.

  • Schlägt die Initialisierung fehl, wird die Lebenszyklusaktion abgeschlossen, ABANDON sodass die Instance beendet und ersetzt wird.