Salta al contenuto

Come posso risolvere i problemi relativi al trasferimento di variabili di ambiente alle mie attività Amazon ECS?

7 minuti di lettura
0

Desidero risolvere i problemi relativi al trasferimento di variabili di ambiente alle mie attività Amazon Elastic Container Service (Amazon ECS).

Breve descrizione

Quando trasferisci una variabile di ambiente o dati sensibili nell'attività, potresti ricevere uno dei seguenti errori in base alla configurazione.

AWS Secrets Manager

"ResourceInitializationError error" or "AccessDenied error on Amazon Elastic Compute Cloud (Amazon EC2)".

Per risolvere questi errori, consulta Come faccio a risolvere i problemi relativi ai segreti di AWS Secrets Manager in Amazon ECS?

Volumi o sidecar Amazon Elastic Block Store (Amazon EBS)

"ECS was unable to assume the configured ECS Infrastructure Role 'arn:aws:iam::111122223333:role/ecsInfrastructureRole'. Please verify that the role being passed has the proper trust relationship with Amazon ECS" o "ECS timed out while configuring the EBS volume attachment to your Task".

Per risolvere questi errori, consulta Motivi dello stato dell'allegato del volume Amazon EBS alle attività di Amazon ECS.

Amazon Simple Storage Service (Amazon S3)

"ResourceInitializationError: failed to download env files: file download command: non empty error stream".

Per risolvere questo errore, completa i seguenti passaggi.

Archivio dei parametri, una funzionalità di AWS Systems Manager

"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". Oppure "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".

Per risolvere questi errori, completa i seguenti passaggi.

Nota: per questioni di sicurezza, è consigliabile archiviare i dati sensibili nei segreti di Secrets Manager o nei parametri dell'Archivio dei parametri.

Risoluzione

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Individua la causa del problema

Utilizza il runbook AWSSupport-TroubleshootECSTaskFailedToStart nella stessa Regione AWS in cui si trovano le risorse del cluster Amazon ECS. Inoltre, utilizza l'ID dell'attività non riuscita più recente. Se l'attività non riuscita fa parte di un servizio Amazon ECS, utilizza l'ultima attività non riuscita del servizio. L'attività non riuscita deve essere visibile in ECS:DescribeTasks durante l'automazione. Per impostazione predefinita, le attività ECS interrotte sono visibili per 1 ora dopo il passaggio allo stato Interrotta.

In base all'output dell'automazione, utilizza una delle seguenti procedure manuali per la risoluzione dei problemi.

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

Se utilizzi variabili di ambiente all'interno dell'Archivio dei parametri o di Secrets Manager, esamina gli eventi di AWS CloudTrail per le seguenti chiamate API:

  • GetParameters per l'Archivio dei parametri
  • GetSecretValue per Secrets Manager

Se viene visualizzato l'errore AccessDenied per il ruolo di esecuzione dell'attività, devi aggiungere manualmente le autorizzazioni richieste come policy in linea al ruolo. Puoi anche creare una policy gestita personalizzata da aggiungere al ruolo di esecuzione dell'attività Amazon ECS.

Se utilizzi un bucket S3 per archiviare la variabile di ambiente come file .env, aggiungi le autorizzazioni richieste per Amazon S3 al ruolo di esecuzione dell'attività.

Sono presenti problemi nella configurazione della rete

Se l’attività si trova in una sottorete privata, verifica le seguenti configurazioni:

  • Il gruppo di sicurezza per l'attività o il servizio consente il traffico in uscita sulla porta 443.
  • Se utilizzi un gateway NAT, l'attività deve avere una route predefinita verso il gateway NAT.
  • Le attività utilizzano gli endpoint del cloud privato virtuale (VPC) richiesti per Secrets Manager, l'Archivio dei parametri o Amazon S3.

Utilizza il comando telnet per verificare la connettività con Systems Manager, Secrets Manager o l'endpoint Amazon S3.

Inoltre, verifica le seguenti configurazioni degli endpoint VPC:

  • Il gruppo di sicurezza per l'endpoint VPC consente il traffico in uscita dall'attività o dal servizio sulla porta 443.
  • La lista di controllo degli accessi alla rete (ACL) consente il traffico in uscita sulla porta 443.
  • Hai associato l'endpoint VPC al VPC corretto.
  • Hai attivato i nomi host DNS e gli attributi VPC di risoluzione DNS.

Se l'attività Amazon ECS si trova in una sottorete pubblica, verifica le seguenti configurazioni:

  • Hai attivato un indirizzo IP pubblico per l'attività.
  • Il gruppo di sicurezza del VPC consente l'accesso in uscita sulla porta 443 a Internet.
  • L'ACL consente tutto il traffico in entrata e in uscita tra le sottoreti e Internet.

L'applicazione non riesce a leggere la variabile di ambiente

Per verificare se nel container dell'attività sono presenti le variabili di ambiente corrette, utilizza ECS Exec per elencare tutte le variabili di ambiente nel container. Attiva ECS Exec, quindi esegui il seguente comando per interagire con il container:

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

Nota: sostituisci cluster-name con il nome del tuo cluster, task-id con l'ID della tua attività e container-name con il nome del tuo container.

Esempio di output:

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.


Starting session with SessionId: ecs-execute-command-hlei32fctyur2bn63rhe2uraaq
sh-5.2#

Quindi esegui il comando env per elencare tutte le variabili di ambiente:

sh-5.2# env

Esempio di output:

sh-5.2# env
AWS_EXECUTION_ENV=AWS_ECS_FARGATE
AWS_DEFAULT_REGION=us-east-1
AWS_REGION=us-east-1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

Se utilizzi il tipo di avvio Amazon EC2, puoi anche utilizzare il comando Docker exec per interagire con il container. Per utilizzare Docker exec, completa i seguenti passaggi:

  1. Connettiti all'istanza di container in cui è in esecuzione l'attività.

  2. Esegui il seguente comando Docker per trovare l'ID del container:

    docker container ps
  3. Per aprire il container, esegui il seguente comando Docker:

    docker exec -it example-container-id bash

    Nota: sostituisci example-container-id con l'ID del tuo container. Inoltre, seleziona la shell in base alla shell predefinita del container.

  4. Esegui il comando env sul container per elencare tutte le variabili di ambiente.

Assicurati che le variabili di ambiente che hai definito nella definizione dell'attività o nel file .env siano nell'elenco delle variabili.

Il formato della variabile nella definizione del container non è corretto

Quando definisci variabili di ambiente nella definizione del container, devi definire le variabili di ambiente come oggetti con coppia chiave-valore:

"environment": [
    {
        "name": "variable",    
        "value": "value"
    }
]

Devi utilizzare questo formato anche quando definisci le variabili di ambiente nei file .env.

L'attività non aggiorna automaticamente la variabile di ambiente

L'attività non aggiorna automaticamente le variabili di ambiente nel container in esecuzione che aggiorni nel file .env o nel segreto.

Per aggiungere le variabili ambientali aggiornate all'istanza di container, esegui il seguente comando update-service:

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

Nota: sostituisci example-cluster con il nome del tuo cluster e example-service con il nome del tuo servizio.

Se utilizzi variabili di ambiente nella definizione del container, devi creare una nuova definizione dell'attività per aggiornare le variabili di ambiente. Quindi esegui il seguente comando update-service in modo che la nuova definizione dell'attività sia utilizzata per creare una nuova attività o aggiornare il servizio Amazon ECS:

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

Nota: sostituisci example-cluster con il nome del tuo cluster, example-service con il nome del tuo servizio e family:revision con la tua nuova definizione dell'attività.

Quando trasferisci variabili di ambiente a un'attività, Amazon ECS utilizza le seguenti configurazioni:

  • Le variabili di ambiente che utilizzano il parametro environment nella definizione di un container hanno la precedenza sulle variabili in un file di ambiente.
  • Se specifichi più file di ambiente che utilizzano la stessa variabile, questi vengono elaborati nell'ordine di immissione. Amazon ECS utilizza il primo valore della variabile e ignora i valori successivi delle variabili duplicate. È consigliabile utilizzare nomi univoci per le variabili.
  • Se specifichi un file di ambiente come override di un container, Amazon ECS utilizza quel file e ignora gli altri file di ambiente nella definizione del container.
  • Le variabili di ambiente sono disponibili per i processi PID 1 di un container nel file /proc/1/environ. Se il container esegue più processi o processi di inizializzazione, come script wrapper o supervisord, la variabile di ambiente non è disponibile per i processi non PID 1.

Informazioni correlate

Trasferisci dati sensibili a un container Amazon ECS