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

Letzte Aktualisierung: 14.04.2022

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 in AWS Secrets Manager.

Hinweis: Es ist eine bewährte Sicherheitsmethode, Parameter Store oder Secrets Manager zum Speichern Ihrer sensiblen Daten als Umgebungsvariable zu verwenden.

Wenn Sie die Umgebungsvariablen in einer der vorhergehenden Methoden übergeben, erhalten Sie möglicherweise die folgenden Fehler:

Parameter Store:

Abrufen geheimer Daten aus dem SSM Parameter Store in der Region: AccessDeniedException: Benutzer: arn:aws:sts::123456789:assumed-role/ecsExecutionRole/f512996041234a63ac354214 ist nicht berechtigt: ssm:GetParameters auf Ressource: arn:aws:ssm:ap-south-1:12345678:parameter/status code: 400, request id: e46b40ee-0a38-46da-aedd-05f23a41e861 auszuführen

-oder-

ResourceInitializationError: Secrets- oder Registry-Auth kann nicht abgerufen werden: Abruf der Ausführungsressource fehlgeschlagen: Secret kann nicht von ssm abgerufen werden: Serviceaufruf wurde 5 mal wiederholt: RequestCanceled

Secrets Manager:

ResourceInitializationError-Fehler

-oder-

AccessDenied-Fehler in Amazon Elastic Compute Cloud (Amazon EC2)

Informationen zum Beheben dieses Fehlers finden Sie unter Wie behebe ich Probleme im Zusammenhang mit Geheimnissen von AWS Secrets Manager in Amazon ECS?

Amazon S3:

ResourceInitializationError: env-Dateien konnten nicht heruntergeladen werden: Dateidownload Befehl: nicht leerer Fehlerstream

Aus den folgenden Gründen können Probleme auftreten, wenn Sie Umgebungsvariablen an Ihre Amazon ECS-Aufgaben übergeben:

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

Lösung

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

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

GetParameters für den Parameter Store

-oder-

GetSecretValue für Secrets Manager

Wenn Sie in CloudTrail-Ereignissen den Fehler AccessDenied für die Aufgabenausführung bemerken, fügen Sie die erforderlichen Berechtigungen manuell als Inline-Richtlinie zu Ihrer IAM-Rolle für die ECS-Aufgabenausführung hinzu. Sie können auch eine vom Kunden verwaltete Richtlinie erstellen und die Richtlinie Ihrer Rolle zur Ausführung von ECS-Aufgaben 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 die folgenden Berechtigungen für Ihre Aufgabenausführungsrolle 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"
      ]
    }
  ]
}

Um einen S3-Bucket zum Speichern der Umgebungsvariablen als eine .env-Datei zu verwenden, fügen Sie der Aufgabenausführungsrolle manuell die folgenden Berechtigungen als Inline-Richtlinie hinzu:

{
  "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 gibt Probleme mit Ihrer Netzwerkkonfiguration

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

  • Stellen Sie sicher, 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-ACL ausgehenden Datenverkehr auf Port 443 zulässt.
  • Überprüfen Sie die Konnektivität zu Systems Manager/Secrets Manager und dem Simple Storage Service (Amazon S3)-Endpunkt mithilfe des Telnet-Befehls.
  • Wenn Sie ein NAT-Gateway verwenden, stellen Sie sicher, dass Ihre Aufgabe über eine Standardroute zum NAT-Gateway verfügt.
  • Stellen Sie sicher, dass Sie die VPC-Endpunkte für Ihre Aufgaben definiert haben. Wenn Sie die VPC-Endpunkte definiert haben, stellen Sie sicher, dass Sie über die erforderlichen VPC-Endpunkte für Secrets Manager/Systems Manager Parameter Store und S3 verfügen.
  • Wenn Sie einen VPC-Endpunkt verwenden, achten Sie auf Folgendes:
    • Die Sicherheitsgruppe für Ihren VPC-Endpunkt ermöglicht ausgehenden Datenverkehr von der Aufgabe oder dem Dienst auf Port 443.
    • Der VPC-Endpunkt ist mit der richtigen VPC verknüpft.
    • Die VPC-Attribute enableDnsHostnames und enableDnsSupport sind aktiviert.

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

  • Stellen Sie sicher, dass für die Aufgabe eine öffentliche IP-Adresse aktiviert ist.
  • Stellen Sie sicher, dass die Sicherheitsgruppe Ihrer VPC ausgehenden Zugriff auf Port 443 zum Internet hat.
  • Stellen Sie sicher, dass die Netzwerk-ACL-Konfiguration den gesamten Datenverkehr in und aus den Subnetzen zum Internet fließen lässt.

Ihre Anwendung kann die Umgebungsvariable nicht lesen

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

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

Wenn Sie die Starttypen Amazon EC2 oder AWS Fargate verwenden, ist es eine bewährte Methode, die ECS-Exec-Funktion zu verwenden. Sie können diese Funktion verwenden, um Befehle in einem Container auszuführen oder eine Shell für einen Container abzurufen, 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 Docker exec-Befehl verwenden, um mit Ihrem Container zu interagieren. In diesem Fall tun Sie Folgendes:

Verbinden Sie sich mit der Container-Instance, in der Ihre Aufgabe ausgeführt wird. Führen Sie dann den folgenden Docker-Befehl aus, um die Container-ID Ihres Aufgabencontainers zu finden.

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 der.env-Datei definiert haben, vorhanden sind.

Das Format der Variablen in der Containerdefinition ist falsch

Wenn Sie Umgebungsvariablen innerhalb der Containerdefinition definieren, müssen Sie die Umgebungsvariablen als KeyValuePair-Objekte definieren, die den folgenden ähneln:

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

Verwenden Sie dieses Format auch, 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 Folgendes, wenn Sie Umgebungsvariablen an Ihre Aufgabe übergeben:

  • Wenn mithilfe des Umgebungsparameters in einer Containerdefinition Umgebungsvariablen angegeben werden, haben sie Vorrang vor den in einer Umgebungsdatei enthaltenen Variablen.
  • Wenn mehrere Umgebungsdateien angegeben sind und sie dieselbe Variable enthalten, werden sie in der Reihenfolge der Eingabe verarbeitet. Der erste Wert der Variablen wird verwendet und nachfolgende Werte doppelter Variablen werden ignoriert. Es ist eine bewährte Methode, eindeutige Variablennamen zu verwenden.
  • Wenn eine Umgebungsdatei als Container-Override angegeben wird, wird die Datei verwendet. Alle anderen in einer Containerdefinition angegebenen Umgebungsdateien werden ignoriert.
  • Die Umgebungsvariablen stehen den PID 1-Prozessen in einem Container aus der Datei /proc/1/envion zur Verfügung. Wenn der Container mehrere Prozesse oder Init-Prozesse ausführt, wie Wrapper-Skript, Startskript oder Supervisor, ist die Umgebungsvariable für Nicht-PID-1-Prozesse nicht verfügbar.

War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?