Come posso risolvere i problemi durante il passaggio delle variabili di ambiente alla mia attività Amazon ECS?

Ultimo aggiornamento: 14/04/2022

Voglio risolvere i problemi durante il passaggio delle variabili di ambiente alla mia attività Amazon Elastic Container Service (Amazon ECS).

Breve descrizione

Puoi passare una variabile di ambiente all'interno dell'attività Amazon ECS in uno dei seguenti modi:

  • Passa la variabile come oggetto environmentFiles all'interno di un bucket Amazon Simple Storage Service (Amazon S3).
  • Archivia la variabile all'interno di un AWS Systems Manager Parameter Store.
  • Arichivia la variabile nella definizione dell'attività ECS.
  • Archivia la variabile all'interno di AWS Secrets Manager.

Nota: è una best practice di sicurezza utilizzare Parameter Store o Secrets Manager per archiviare i dati sensibili come variabile di ambiente.

Quando si passano le variabili di ambiente in uno dei metodi precedenti, è possibile che si verifichino i seguenti errori:

Parameter Store:

Recupero dei dati segreti da SSM Parameter Store nella regione: AccessDeniedException: L'utente: arn:aws:sts::123456789:assumed-role/ecsExecutionRole/f512996041234a63ac354214 non è autorizzato ad eseguire: ssm:GetParameters sulla risorsa: arn:aws:ssm:ap-south-1:12345678:parameter/status code: 400, ID richiesta: e46b40ee-0a38-46da-aedd-05f23a41e861

-oppure-

ResourceInitializationError: impossibile recuperare i segreti o l'autenticazione del registro: recupero risorse di esecuzione non riuscito: impossibile recuperare i segreti da ssm: la chiamata di servizio è stata ritentata 5 volte: RequestCanceled

Secrets Manager

Errore ResourceInitializationError

-oppure-

Errore AccessDenied in Amazon Elastic Compute Cloud (Amazon EC2)

Per risolvere questi errori, consulta Come si risolvono gli errori relativi ai segreti in AWS Secrets Manager in Amazon ECS?

Amazon S3:

ResourceInitializationError: impossibile scaricare i file env: comando download file: flusso di errori non vuoto

Potresti riscontrare problemi quando passi variabili di ambiente alle tue attività Amazon ECS per i seguenti motivi:

  • Il tuo ruolo di esecuzione delle attività di Amazon ECS non dispone delle autorizzazioni AWS Identity and Management (IAM) richieste.
  • Si sono verificati problemi con la configurazione di rete.
  • L'applicazione non è in grado di leggere la variabile d'ambiente.
  • Il formato della variabile nella definizione del container non è corretto.
  • La variabile d'ambiente non viene aggiornata automaticamente.

Risoluzione

Il tuo ruolo di esecuzione delle attività di Amazon ECS non dispone delle autorizzazioni IAM richieste

Se utilizzi variabili di ambiente all'interno di Parameter Store o Secrets Manager, esamina gli eventi di AWS CloudTrail per una delle seguenti chiamate API:

GetParameters per Parameter Store

-oppure-

GetSecretValue per Secrets Manager

Se noti l'errore AccessDenied per il ruolo di esecuzione dell'attività negli eventi CloudTrail, aggiungi manualmente le autorizzazioni richieste come policy inline al tuo ruolo IAM di esecuzione delle attività ECS. Puoi anche creare una policy gestita dal cliente e aggiungerla al tuo ruolo di esecuzione delle attività ECS.

Se utilizzi Secrets Manager, includi le seguenti autorizzazioni per il tuo ruolo di esecuzione dell'attività:

{
  "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"
      ]
    }
  ]
}

Se utilizzi Parameter Store, includi le seguenti autorizzazioni per il tuo ruolo di esecuzione dell'attività:

{
  "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"
      ]
    }
  ]
}

Per utilizzare un bucket S3 per l'archiviazione della variabile di ambiente come file .env, aggiungi manualmente le seguenti autorizzazioni come policy inline al ruolo di esecuzione dell'attività:

{
  "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"
      ]
    }
  ]
}

Si sono verificati problemi con la configurazione di rete

Se l'attività ECS si trova in una sottorete privata, verifica quanto segue:

  • Assicurati che il gruppo di sicurezza per l'attività o il servizio consenta il traffico in uscita sulla porta 443.
  • Se utilizzi un endpoint VPC, assicurati che l'ACL di rete consenta il traffico in uscita sulla porta 443.
  • Verifica la connettività a Systems Manager/Secrets Manager e all'endpoint Amazon S3 utilizzando il comando telnet.
  • Se stai usando un gateway NAT, assicurati che la tua attività abbia un percorso predefinito per il gateway NAT.
  • Assicurati di aver definito gli endpoint VPC per le tue attività. Se hai definito gli endpoint VPC, assicurati di avere gli endpoint VPC richiesti per Secrets Manager/Systems Manager/Parameter Store e S3.
  • Se utilizzi un endpoint VPC, assicurati che:
    • Il gruppo di sicurezza per l'endpoint VPC consenta il traffico in uscita dall'attività o dal servizio sulla porta 443.
    • L'endpoint VPC sia associato al VPC corretto.
    • Gli attributi VPC enableDNSHostNames e enableDNSsupport siano attivati.

Se l'attività ECS si trova in una sottorete pubblica, verifica che:

  • L'attività abbia un indirizzo IP pubblico abilitato.
  • Il gruppo di sicurezza del tuo VPC abbia accesso in uscita sulla porta 443 a Internet.
  • La configurazione ACL di rete consenta a tutto il traffico di fluire in entrata e in uscita dalle sottoreti verso Internet.

L'applicazione non sia in grado di leggere la variabile d'ambiente

Per verificare se le variabili di ambiente corrette sono compilate all'interno del container delle attività, procedere come segue:

  1. Elenca tutte le variabili di ambiente che sono esposte all'interno del container.
  2. Verifica che questo elenco includa le variabili di ambiente definite nella definizione dell'attività o nel file.env in S3.

Se utilizzi i tipi di avvio di Amazon EC2 o AWS Fargate, è una best practice utilizzare la funzionalità ECS Exec. Puoi utilizzare questa funzione per eseguire comandi o ottenere una shell in un container in esecuzione su un'istanza Amazon EC2 o Fargate. Dopo aver abilitato questa funzionalità, esegui il seguente comando per interagire con il tuo container.

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

Se utilizzi il tipo di avvio di Amazon EC2, puoi anche utilizzare il comando Docker exec per interagire con il tuo container. In questo caso, procedi come segue:

Connettiti all'istanza del container in cui è in esecuzione l'attività. Quindi, esegui il seguente comando Docker per trovare l'ID del container di attività.

docker container ps

Esegui il seguente comando per interagire con il container:

docker exec -it example-container-id bash

Nota: seleziona la shell in base a quella predefinita del tuo container.

Dopo aver stabilito una connessione con il container, esegui il comando env sul container per ottenere l'elenco completo delle variabili di ambiente. Esamina questo elenco per assicurarsi che siano presenti le variabili di ambiente definite nella definizione dell'attività o nel file .env.

Il formato della variabile nella definizione del container non è corretto

Quando definisci le variabili di ambiente all'interno della definizione del container, assicurati di definire le variabili di ambiente come oggetti KeyValuePair simili ai seguenti:

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

Assicurati di usare questo formato anche quando definisci le variabili d'ambiente nei file .env.

La variabile d'ambiente non viene aggiornata automaticamente

Quando aggiorni la variabile ambientale nel file .env, la variabile non viene aggiornata automaticamente nel container in esecuzione.

Per inserire i valori aggiornati delle variabili ambientali nell'attività, aggiorna il servizio eseguendo il seguente comando:

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

Se utilizzi variabili di ambiente nella definizione del container, è necessario creare una nuova definizione di attività per aggiornare le variabili di ambiente. Con questa nuova definizione di attività, è possibile creare una nuova attività o aggiornare il servizio ECS.

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

Nota:

Tieni presente quanto segue quando passi variabili di ambiente alla tua attività:

  • Se ci sono variabili di ambiente specificate utilizzando il parametro di ambiente in una definizione del container, esse hanno la precedenza sulle variabili contenute in un file di ambiente.
  • Se vengono specificati più file di ambiente e contengono la stessa variabile, vengono elaborati nell'ordine di immissione. Viene utilizzato il primo valore della variabile e i valori successivi delle variabili duplicate vengono ignorati. È una best practice utilizzare nomi di variabili univoci.
  • Se un file di ambiente viene specificato come sovrascrittura del container, viene utilizzato il file. Qualsiasi altro file di ambiente specificato in una definizione di container sarà ignorato.
  • Le variabili d'ambiente sono disponibili per i processi PID 1 in un container dal file /proc/1/envion. Se il container esegue più processi o processi di init, come script wrapper, script di avvio o supervisord, la variabile di ambiente non è disponibile per i processi non PID 1.

Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?