Wie kann ich vermeiden, Aufgaben auf Amazon-ECS-Container-Instances mit Amazon-Linux-1-AMIs zu platzieren, die nicht über genügend Speicherplatz verfügen?

Lesedauer: 4 Minute
0

Ich verwende Container-Instances in Amazon Elastic Container Service (Amazon ECS) mit Amazon Machine Images (AMIs) in Amazon Linux 1. Ich kann jedoch keine Aufgaben auf Amazon-ECS-Container-Instances mit Linux-1-AMIs starten, die nicht über genügend Speicherplatz verfügen. Dies passiert, wenn der Docker-Daemon versucht, das Docker-Image aus meinem Docker-Image-Repository abzurufen und dann die Aufgaben auszuführen. Wie kann ich dieses Problem verhindern?

Kurzbeschreibung

Beim Starten einer Aufgabe mit dem Starttyp Amazon Elastic Compute Cloud (Amazon EC2) berücksichtigt Amazon ECS nicht die Verfügbarkeit von Festplattenspeicher auf Container-Instances. Amazon ECS bestimmt, wohin Aufgaben platziert werden aufgrund der in der Aufgabendefinition angegebenen Anforderungen wie CPU, Arbeitsspeicher und Port. Um dieses Problem zu beheben, können Sie ein Skript zur Speicherplatzüberwachung verwenden, das den Speicherplatz überwacht. Das Skript gibt einen Wert zurück, der den verfügbaren Speicherplatz auf Amazon-ECS-Container-Instances angibt. Der zurückgegebene Wert ist einer Container-Instance als benutzerdefiniertes Attribut zugeordnet. Die dem Container-Instance-Profil zugeordnete AWS Identity and Access Management (IAM)-Rolle muss über die Berechtigung verfügen, diesen benutzerdefinierten Attributwert zu aktualisieren.

Verwenden Sie dann eine Aufgabendefinition, um eine Aufgabenplatzierungsbeschränkung anzugeben, die die Platzierung von Aufgaben auf Container-Instances einschränkt, die nicht über genügend Speicherplatz verfügen.

**Hinweis:**Amazon Linux 1 endet am 31. Dezember 2020. Es ist eine bewährte Methode, Workloads vor Ablauf des Supports auf Amazon Linux 2 zu migrieren.

Behebung

Starten Sie Ihre Container-Instance mit einem Amazon-ECS-optimierten Amazon-Linux-AMI

**Wichtig:**Es hat sich bewährt, Instances mit einer Auto-Scaling-Gruppe zu starten, die mit mehreren Availability Zones konfiguriert ist. Sie können Befehle hinzufügen, um die Instances in den Benutzerdaten der Startkonfiguration zu booten.

Hinweis: Wenn Sie beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehler erhalten, stellen Sie sicher, dass Sie die neueste AWS-CLI-Version verwenden.

1.    Führen Sie den folgenden Befehl aus, um die AWS-CLI- und jq-Pakete im Bereich Benutzerdaten der Container-Instance-Startkonfiguration zu installieren. Weitere Informationen finden Sie unter./jq auf der jq-Website.

yum install -y aws-cli jq

Hinweis: Der Benutzerdatenbereich bootet Amazon-EC2-Instances, indem beim Start Befehle ausgeführt werden.

2.    Öffnen Sie die IAM-Konsole und erstellen Sie dann die folgende Inline-Richtlinie:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ecs:PutAttributes",
            "Resource": "*"
        }
    ]
}

Wichtig: Die obige Richtlinie verwendet einen Platzhalterparameter, der es dem Prinzipal ermöglicht, ecs:PutAttributes für alle kompatiblen Ressourcen (Container-Instances) im Konto aufzurufen. Das Beispiel dient der Benutzerfreundlichkeit, aber es ist eine bewährte Methode, wenn möglich die geringsten Rechte zu gewähren. Weitere Informationen finden Sie unter Beispiele für identitätsbasierte Richtlinien von Amazon Elastic Container Service. Die folgende Beispielrichtlinie beschränkt den Aufruf nur auf Container-Instances in einem bestimmten Cluster:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:PutAttributes"
            ],
            "Resource": [
                "arn:aws:ecs:<region>:<accountId>:container-instance/<clusterName>/*"
            ]
        }
    ]
}

3.    Ordnen Sie die Inline-Richtlinie der IAM-Rolle ecsInstanceRole zu.

Hinweis: Die IAM-Berechtigung verknüpft das benutzerdefinierte Attribut SpaceLeft mit der Container-Instance mithilfe des Befehls aws ecs put-attribute in der AWS-CLI. Das benutzerdefinierte Attribut SpaceLeft wird vom Festplattenspeicherüberwachungsskript berechnet.

Installieren Sie das Festplattenspeicherüberwachungsskript auf der Amazon-ECS-Container-Instance und führen Sie es aus

1.    Um den Festplattenspeicher (in GB) Ihres Clusters zu überwachen, installieren Sie das folgende Skript auf der Container-Instance:

#! /usr/bin/env bash
set -o pipefail
set -o nounset
set -o errexit

until curl -s http://localhost:51678/v1/metadata
do
   sleep 1
done

clusterName=$(curl -s http://localhost:51678/v1/metadata | jq .Cluster | tr -d '"' )
SpaceLeft=$(docker info | grep 'Data Space Available' | cut -d':' -f2)
Unit=$(echo "$SpaceLeft" | grep -o '..$')
if [ "$Unit" != GB ]; then
    SpaceLeft=$(echo "$SpaceLeft" | sed 's/[A-Za-z]*//g' | cut -d '.' -f1)
    SpaceLeftValue=$(echo "$SpaceLeft" | awk '{$1=$1/(1000); print $1;}')
else
        SpaceLeftValue=$(echo "$SpaceLeft" | sed 's/[A-Za-z]*//g')
fi

instanceArn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' )
region=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F: '{print $4}')

aws ecs put-attributes \
  --cluster "$clusterName" \
  --attributes name="SpaceLeft",value="$SpaceLeftValue",targetType="container-instance",targetId="$instanceArn" \
  --region "$region"

Hinweis: Sie können das Skript diskspaceMonitoring.sh nennen und es dann dem Pfad /home/ec2-user/diskspaceMonitoring.sh auf jeder Amazon-ECS-Container-Instance in Ihrem Cluster hinzufügen. Sie können das Skript zur Speicherplatzüberwachung auch als Teil der Benutzerdaten in der Startkonfiguration der Container-Instance angeben.

2.    Führen Sie auf der Container-Instance das folgende Skript aus:

$echo "* * * * * root /home/ec2-user/diskspaceMonitoring.sh" >> /etc/crontab

Hinweis: Sie können das Skript regelmäßig als Teil eines Cronjobs in einem Intervall von einer Minute ausführen. Sie können auch ein anderes Zeitintervall wählen. Sie können das Skript zu den Benutzerdaten in Ihrer Startkonfiguration hinzufügen.

3.    Öffnen Sie die Amazon-ECS-Konsole und erstellen Sie dann eine Aufgabenplatzierungsbeschränkung mit Ihrer Amazon-ECS-Aufgabendefinition. Zum Beispiel:

"placementConstraints": [
    {
        "expression": "attribute:SpaceLeft >= 0.1",
        "type": "memberOf"
    }
]

Die zugehörige Aufgabendefinition hat jetzt eine Platzierungsbeschränkung, die die Platzierung von Aufgaben auf Container-Instances einschränkt, die nicht über genügend Speicherplatz verfügen.


Ähnliche Informationen

CannotCreateContainerError: API-Fehler (500): devmapper

AMI-Speicherkonfiguration

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Jahren