Wie behebe ich Probleme bei der Übergabe von Umgebungsvariablen an meine Amazon-ECS-Aufgabe?

Lesedauer: 8 Minute
0

Ich möchte Probleme bei der Übergabe von Umgebungsvariablen an meine Amazon Elastic Container Service (Amazon ECS)-Aufgabe beheben.

Kurzbeschreibung

Sie können eine Umgebungsvariable auf eine der folgenden Arten innerhalb Ihrer Amazon-ECS-Aufgabe übergeben:

  • Übergeben Sie die Variable als environmentFiles -Objekt in einem Amazon Simple Storage Service (Amazon S3)-Bucket.
  • Speichern Sie die Variable in einem AWS Systems Manager Parameter Store.
  • Speichern Sie die Variable in Ihrer ECS-Aufgabendefinition.
  • Speichern Sie die Variable im AWS Secrets Manager.

Hinweis: Es ist eine bewährte Sicherheitsmethode, den Parameter Store oder Secrets Manager zum Speichern Ihrer vertraulichen Daten als Umgebungsvariable zu verwenden. Wenn Sie die Umgebungsvariablen in einer der vorherigen Methoden übergeben, erhalten Sie möglicherweise die folgenden Fehler:

Parameter Store

„Fetching secret data from SSM Parameter Store in region: AccessDeniedException: User: arn:aws:sts::123456789:assumed-role/ecsExecutionRole/f512996041234a63ac354214 is not authorized to perform: ssm:GetParameters on resource: arn:aws:ssm:ap-south-1:12345678:parameter/status code: 400, request id: e46b40ee-0a38-46da-aedd-05f23a41e861“

-oder-

„ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secrets from ssm: service call has been retried 5 time(s): RequestCanceled“

Secrets Manager

„ResourceInitializationError error“

-oder-

„AccessDenied error on Amazon Elastic Compute Cloud (Amazon EC2)“

Informationen zur Behebung dieser Fehler finden Sie unter Wie behebe ich Probleme im Zusammenhang mit AWS-Secrets-Manager-Geheimnissen in Amazon ECS?

Amazon S3

„ResourceInitializationError: failed to download env files: file download command: non empty error stream“

Bei der Übergabe von Umgebungsvariablen an Ihre Amazon-ECS-Aufgaben können aus den folgenden Gründen Probleme auftreten:

  • Ihre Amazon-ECS-Aufgabenausführungsrolle verfügt nicht über die erforderlichen AWS Identity and Management (IAM)-Berechtigungen.
  • Es bestehen Probleme mit Ihrer Netzwerkkonfiguration.
  • Ihre Anwendung kann die Umgebungsvariable nicht lesen.
  • Das Format der Variablen in der Container-Definition ist falsch.
  • Die Umgebungsvariable wird nicht automatisch aktualisiert.

Verwenden Sie das AWSSupport-TroubleshootECSTaskFailedToStart-Runbook, um Fehler für Amazon-ECS-Aufgaben zu beheben, die nicht gestartet werden können. Lesen Sie dann die entsprechenden Schritte zur Fehlerbehebung für Ihr Problem.

Lösung

Wichtig:

  • Verwenden Sie das AWSSupport-TroubleshootECSTaskFailedToStart-Runbook in derselben AWS-Region, in der sich Ihre ECS-Cluster-Ressourcen befinden.
  • Wenn Sie das Runbook verwenden, müssen Sie die Aufgaben-ID verwenden, die zuletzt ausgefallen ist. Wenn die fehlgeschlagene Aufgabe Teil eines Amazon-ECS-Service ist, verwenden Sie die zuletzt ausgefallene Aufgabe im Service. Die fehlgeschlagene Aufgabe muss während der Automatisierung in ECS:DescribeTasks sichtbar sein. Standardmäßig sind gestoppte ECS-Aufgaben 1 Stunde lang sichtbar, nachdem sie den Status Stopped erreicht haben. Durch die Verwendung der zuletzt ausgefallenen Aufgaben-ID wird verhindert, dass die Aufgabenstatusbereinigung die Analyse während der Automatisierung unterbricht.

Anweisungen zum Initiieren des Runbooks finden Sie unter AWSSupport-TroubleshootECSTaskFailedToStart. Verwenden Sie auf der Grundlage der Ergebnisse der Automatisierung einen der folgenden manuellen Schritte zur Fehlerbehebung.

Ihre Amazon-ECS-Aufgabenausführungsrolle verfügt nicht über die erforderlichen IAM-Berechtigungen

Wenn Sie Umgebungsvariablen im Parameter Store oder Secrets Manager verwenden, überprüfen Sie die AWS-CloudTrail-Ereignisse auf einen der folgenden API-Aufrufe:

GetParameters für Parameter Store

-oder-

GetSecretValue für Secrets Manager

Wenn Sie in CloudTrail-Ereignissen den Fehler AccessDenied für die Aufgabenausführungsrolle bemerken, fügen Sie Ihrer IAM-Rolle zur ECS-Aufgabenausführung manuell die erforderlichen Berechtigungen als Inline-Richtlinie hinzu. Sie zudem auch eine vom Kunden verwaltete Richtlinie erstellen und die Richtlinie zu Ihrer ECS-Aufgabenausführungsrolle hinzufügen.

Wenn Sie Secrets Manager verwenden, fügen Sie Ihrer Aufgabenausführungsrolle die folgenden Berechtigungen hinzu:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:secretsmanager:example-region:11112222333344445555:secret:example-secret",
        "arn:aws:kms:example-region:1111222233334444:key/example-key-id"
      ]
    }
  ]
}

Wenn Sie den Parameter Store verwenden, fügen Sie Ihrer Aufgabenausführungsrolle die folgenden Berechtigungen hinzu:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameters",
        "secretsmanager:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:ssm:example-region:1111222233334444:parameter/example-parameter",
        "arn:aws:secretsmanager:example-region:1111222233334444:secret:example-secret",
        "arn:aws:kms:example-region:1111222233334444:key/example-key-id"
      ]
    }
  ]
}

Sie können einen S3-Bucket verwenden, um die Umgebungsvariable als .env-Datei zu speichern. Sie müssen der Aufgabenausführungsrolle jedoch manuell die folgenden Berechtigungen als Inline-Richtlinie hinzufügen:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::example-bucket/example-folder/example-env-file"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::example-bucket"
      ]
    }
  ]
}

Es bestehen Probleme mit Ihrer Netzwerkkonfiguration

Wenn sich Ihre ECS-Aufgabe in einem privaten Subnetz befindet, überprüfen Sie die folgenden Punkte:

  • Vergewissern Sie sich, dass die Sicherheitsgruppe für die Aufgabe oder den Dienst ausgehenden Datenverkehr auf Port 443 zulässt.
  • Wenn Sie einen VPC-Endpunkt verwenden, stellen Sie sicher, dass die Netzwerk-Zugriffssteuerungsliste (ACL) ausgehenden Datenverkehr auf Port 443 zulässt.
  • Überprüfen Sie die Konnektivität zum Systems Manager/Secrets Manager und dem Amazon-S3-Endpunkt. Verwenden Sie hierzu den Befehl telnet.
  • Wenn Sie ein NAT-Gateway verwenden, stellen Sie sicher, dass Ihre Aufgabe über eine Standardroute zum NAT-Gateway verfügt.
  • Definieren Sie die VPC-Endpunkte für Ihre Aufgaben. Stellen Sie sicher, dass Sie über die erforderlichen VPC-Endpunkte für Secrets Manager/Systems Manager Parameter Store und Amazon S3 verfügen.

Wenn Sie einen VPC-Endpunkt verwenden, überprüfen Sie die folgenden Punkte:

  • Die Sicherheitsgruppe für Ihren VPC-Endpunkt erlaubt ausgehenden Datenverkehr von der Aufgabe oder dem Dienst auf Port 443.
  • Ordnen Sie den VPC-Endpunkt der richtigen VPC zu.
  • Aktivieren Sie die VPC-Attribute enableDnsHostnames und enableDnsSupport.

Wenn sich Ihre ECS-Aufgabe in einem öffentlichen Subnetz befindet, überprüfen Sie die folgenden Punkte:

  • Sie müssen eine öffentliche IP-Adresse für die Aufgabe aktivieren.
  • Stellen Sie sicher, dass die Sicherheitsgruppe Ihrer VPC über Port 443 ausgehenden Zugriff auf das Internet hat.
  • Die Netzwerk-ACL-Konfiguration erlaubt den gesamten Datenverkehr in und aus den Subnetzen ins Internet.

Ihre Anwendung kann die Umgebungsvariable nicht lesen

Gehen Sie wie folgt vor, um zu überprüfen, ob die richtigen Umgebungsvariablen in Ihrem Aufgabencontainer befüllt wurden:

  1. Listen Sie alle Umgebungsvariablen auf, die im Container verfügbar sind.
  2. Stellen Sie sicher, dass diese Liste die Umgebungsvariablen enthält, die Sie in der Aufgabendefinition oder in der .env-Datei in S3 definiert haben.

Wenn Sie die Starttypen Amazon EC2 oder AWS Fargate verwenden, empfiehlt es sich, die ECS-Exec-Funktion zu verwenden. Sie können diese Funktion verwenden, um Befehle in einem Container auszuführen oder eine Shell in einen Container zu übertragen, der auf einer Amazon-EC2-Instance oder Fargate ausgeführt wird. Nachdem Sie diese Funktion aktiviert haben, führen Sie den folgenden Befehl aus, um mit Ihrem Container zu interagieren:

aws ecs execute-command --cluster example-cluster \--task example-task-id \
--container example-container \
--interactive \
--command "/bin/sh"

Wenn Sie den Amazon-EC2-Starttyp verwenden, können Sie auch den Befehl Docker exec verwenden, um mit Ihrem Container zu interagieren. Gehen Sie in diesem Fall wie folgt vor: Stellen Sie eine Verbindung zur Container-Instance her, auf der Ihre Aufgabe ausgeführt wird. Führen Sie dann den folgenden Docker-Befehl aus, um die Container-ID Ihres Aufgaben-Containers zu ermitteln:

docker container ps

Führen Sie den folgenden Befehl aus, um mit dem Container zu interagieren

docker exec -it example-container-id bash

Hinweis: Wählen Sie die Shell entsprechend Ihrer Container-Standardshell aus.

Nachdem Sie die Verbindung mit dem Container hergestellt haben, führen Sie den Befehl env auf Ihrem Container aus, um die vollständige Liste Ihrer Umgebungsvariablen abzurufen. Überprüfen Sie diese Liste, um sicherzustellen, dass die Umgebungsvariablen, die Sie in der Aufgabendefinition oder .env-Datei definiert haben, vorhanden sind.

Das Format der Variablen in der Container-Definition ist falsch

Wenn Sie Umgebungsvariablen innerhalb der Container-Definition definieren, definieren Sie die Umgebungsvariablen als KeyValuePair-Objekte:

"environment": [{    "name": "foo",
    "value": "bar"
}]

Achten Sie darauf, dieses Format ebenfalls zu verwenden, wenn Sie die Umgebungsvariablen in Ihren .env-Dateien definieren.

Die Umgebungsvariable wird nicht automatisch aktualisiert

Wenn Sie die Umgebungsvariable in Ihrer .env-Datei aktualisieren, wird die Variable in Ihrem laufenden Container nicht automatisch aktualisiert.
Um die aktualisierten Werte von Umgebungsvariablen in Ihre Aufgabe einzufügen, aktualisieren Sie den Dienst, indem Sie den folgenden Befehl ausführen:

aws ecs update-service --cluster example-cluster --service example-service --force-new-deployment

Wenn Sie Umgebungsvariablen in Ihrer Containerdefinition verwenden, müssen Sie eine neue Aufgabendefinition erstellen, um die aktualisierten Umgebungsvariablen zu aktualisieren. Mit dieser neuen Aufgabendefinition können Sie eine neue Aufgabe erstellen oder Ihren ECS-Service aktualisieren:

`aws ecs update-service --cluster example-cluster --service example-service --task-definition <family:revision>`;

Hinweis: Beachten Sie die folgenden Punkte, wenn Sie Umgebungsvariablen an Ihre Aufgabe übergeben:

  • Wenn Sie Umgebungsvariablen mit dem Parameter Umgebung in einer Containerdefinition angeben, haben sie Vorrang vor den Variablen, die in einer Umgebungsdatei enthalten sind.
  • Wenn Sie mehrere Umgebungsdateien angeben und diese dieselbe Variable enthalten, werden sie in der Reihenfolge ihrer Eingabe verarbeitet. Es wird der erste Wert der Variablen verwendet und nachfolgende Werte doppelter Variablen werden ignoriert. Es hat sich bewährt, eindeutige Variablennamen zu verwenden.
  • Wenn Sie eine Umgebungsdatei als Container-Override angeben, wird die Datei verwendet. Alle anderen Umgebungsdateien, die in einer Containerdefinition angegeben sind, werden ignoriert.
  • Die Umgebungsvariablen stehen den PID-1-Prozessen in einem Container aus der Datei /proc/1/environ zur Verfügung. Wenn der Container mehrere Prozesse ausführt oder Prozesse initiiert, z. B. das Wrapper-Skript oder supervisord, dann ist die Umgebungsvariable für Nicht-PID-1-Prozesse nicht verfügbar.

Ähnliche Informationen

Übergabe von Umgebungsvariablen an einen Container

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 10 Monaten