¿Cómo soluciono los problemas al transferir variables de entorno a mi tarea de Amazon ECS?

8 minutos de lectura
0

Quiero solucionar problemas al transferir variables de entorno a mi tarea de Amazon Elastic Container Service (Amazon ECS).

Descripción corta

Cuando transfiere una variable de entorno o datos confidenciales a su tarea, es posible que aparezca uno de los siguientes errores según su configuración.

AWS Secrets Manager

«Error ResourceInitializationError» o «Error AccessDenied en Amazon Elastic Compute Cloud (Amazon EC2)».

Para resolver estos errores, consulte ¿Cómo soluciono los problemas relacionados con los secretos de AWS Secrets Manager en Amazon ECS?

Volúmenes de Amazon Elastic Block Store (Amazon EBS) o asociados

«ECS no ha podido asumir el rol de infraestructura de ECS configurada 'arn:aws:iam::111122223333:role/ecsInfrastructureRole'. Compruebe que el rol que se está transfiriendo tiene la relación de confianza adecuada con Amazon ECS» o «ECS ha agotado el tiempo de espera al configurar el volumen de EBS adjunto a su tarea».

Para resolver estos problemas, consulte Motivos de estado de los volúmenes de Amazon EBS adjuntos a las tareas de Amazon ECS.

Amazon Simple Storage Service (Amazon S3)

«ResourceInitializationError: no se han podido descargar los archivos env: comando de descarga de archivos: flujo de error no vacío».

Para resolver este problema, siga estos pasos de resolución.

Almacén de parámetros, una capacidad de AWS Systems Manager

«Obtención de datos secretos del almacén de parámetros de SSM en la región: AccessDeniedException: Usuario: arn:aws:sts::123456789:assumed-role/ecsExecutionRole/f512996041234a63ac354214 no está autorizado para realizar: ssm:GetParameters en el recurso: arn:aws:ssm:ap-south-1:12345678:parameter/status code: 400, request id: e46b40ee-0a38-46da-aedd-05f23a41e861». O bien, «ResourceInitializationError: no se pueden extraer secretos ni la autenticación del registro: error al recuperar el recurso de ejecución: no se pueden recuperar los secretos de ssm: se ha vuelto a intentar llamar al servicio 5 veces: RequestCanceled».

Para resolver estos problemas, siga estos pasos de resolución.

Nota: Es una práctica recomendada de seguridad almacenar datos confidenciales en los secretos de Secrets Manager o parámetros del almacén de parámetros.

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Solución de problemas de AWS CLI. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Determinación de la causa del problema

Use el runbook AWSSupport-TroubleshootECSTaskFailedToStart en la misma región de AWS en la que se encuentran los recursos del clúster de Amazon ECS. Además, use el identificador de la tarea fallida más reciente. Si la tarea fallida forma parte de un servicio de Amazon ECS, use la tarea fallida más reciente del servicio. La tarea fallida debe estar visible en ECS:DescribeTasks durante la automatización. De forma predeterminada, las tareas de ECS detenidas están visibles durante 1 hora después de entrar en el estado Detenido.

En función de la salida de la automatización, use uno de los siguientes pasos manuales de solución de problemas.

Su rol de ejecución de tareas de Amazon ECS no tiene los permisos de IAM requeridos

Si usa variables de entorno en el almacén de parámetros o Secrets Manager, revise los eventos de AWS CloudTrail para las siguientes llamadas a la API:

  • GetParameters para el almacén de parámetros
  • GetSecretValue para Secrets Manager

Si aparece el error AccessDenied para el rol de ejecución de la tarea, debe agregar manualmente los permisos necesarios como una política insertada en el rol. También puede crear una política administrada personalizada para agregarla a su rol de ejecución de tareas de Amazon ECS.

Si usa un bucket de S3 para almacenar la variable de entorno como un archivo .env, agregue los permisos necesarios para Amazon S3 al rol de ejecución de la tarea.

Problemas con la configuración de red

Si su tarea se encuentra en una subred privada, compruebe las configuraciones siguientes:

  • El grupo de seguridad de la tarea o el servicio permite el tráfico saliente en el puerto 443.
  • Si usa una puerta de enlace de NAT, la tarea debe tener una ruta predeterminada a la puerta de enlace de NAT.
  • Sus tareas utilizan los puntos de enlace de nube virtual privada (VPC) necesarios para Secrets Manager, el almacén de parámetros o Amazon S3.

Utilice el comando telnet para verificar la conectividad con Systems Manager, Secrets Manager o el punto de enlace de Amazon S3.

Además, verifique las siguientes configuraciones de punto de enlace de VPC:

Si su tarea de Amazon ECS está en una subred pública, compruebe las siguientes configuraciones:

  • Ha activado una dirección IP pública para la tarea.
  • El grupo de seguridad de su VPC permite el acceso saliente a Internet en el puerto 443.
  • La ACL de la red permite todo el tráfico entrante y saliente entre las subredes e Internet.

La aplicación no puede leer la variable de entorno

Para comprobar si el contenedor de tareas contiene las variables de entorno correctas, utilice ECS Exec para enumerar todas las variables de entorno del contenedor. Active ECS Exec y, a continuación, ejecute el siguiente comando para interactuar con el contenedor:

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

Nota: Sustituya cluster-name por el nombre de su clúster, task-id por su ID de tarea y container-name por el nombre de su contenedor.

Resultado de ejemplo:

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#

A continuación, ejecute el comando env para enumerar todas las variables de entorno:

sh-5.2# env

Resultado de ejemplo:

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

Si usa el tipo de inicio de Amazon EC2, también puede usar el comando Docker exec para interactuar con su contenedor. Para usar Docker exec, siga estos pasos:

  1. Conéctese a la instancia de contenedor en la que se ejecuta la tarea.

  2. Ejecute el siguiente comando de Docker para buscar el ID del contenedor:

    docker container ps
  3. Para abrir el contenedor, ejecute el siguiente comando de Docker:

    docker exec -it example-container-id bash

    Nota: Sustituya example-container-id por el ID de su contenedor. Además, seleccione el shell según el shell predeterminado de su contenedor.

  4. Ejecute el comando env en su contenedor para enumerar todas las variables de entorno.

Asegúrese de que las variables de entorno que ha definido en la definición de la tarea o en el archivo .env estén en la lista de variables.

El formato de la variable en la definición del contenedor es incorrecto

Al definir variables de entorno en la definición del contenedor, debe definir las variables de entorno como objetos de par clave-valor:

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

También debe usar este formato cuando defina las variables de entorno en sus archivos .env.

La tarea no actualiza automáticamente la variable de entorno

La tarea no actualiza automáticamente las variables de entorno del contenedor en ejecución que actualiza en su archivo .env o secreto.

Para agregar las variables de entorno actualizadas a la instancia de contenedor, ejecute el siguiente comando update-service:

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

Nota: Sustituya example-cluster por el nombre de su clúster y example-service por el nombre de su servicio.

Si usa variables de entorno en la definición de su contenedor, debe crear una nueva definición de tarea para actualizar las variables de entorno. A continuación, ejecute el siguiente comando update-service para usar la nueva definición de tarea para crear una nueva tarea o actualizar su servicio Amazon ECS:

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

Nota: Sustituya example-cluster por el nombre de su clúster, example-service por el nombre de su servicio y family:revision por la nueva definición de la tarea.

Cuando transfiere variables de entorno a la tarea, Amazon ECS utiliza las siguientes configuraciones:

  • Las variables de entorno que utilizan el parámetro de entorno en una definición de contenedor tienen prioridad sobre las variables de un archivo de entorno.
  • Si especifica varios archivos de entorno y usan la misma variable, se procesarán en el orden de entrada. Amazon ECS usa el primer valor de la variable e ignora los valores subsiguientes de las variables duplicadas. Se recomienda usar nombres de variables únicos.
  • Si especifica un archivo de entorno como anulación de contenedor, Amazon ECS usa ese archivo e ignora otros archivos de entorno en la definición del contenedor.
  • Las variables de entorno están disponibles para los procesos PID 1 en un contenedor desde el archivo /proc/1/environ. Si el contenedor ejecuta varios procesos o procesos de inicio, como, por ejemplo, wrapper script o supervisord, la variable de entorno no estará disponible para los procesos que no sean PID 1.

Información relacionada

Transferencia de datos confidenciales a un contenedor de Amazon ECS