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

9 minutos de lectura
0

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

Descripción breve

Puede transferir una variable de entorno de su tarea de Amazon ECS de una de las siguientes maneras:

  • Transferir la variable como un objeto environmentFiles en un bucket de Amazon Simple Storage Service (Amazon S3).
  • Guardar la variable en un almacén de parámetros de AWS Systems Manager.
  • Guardar la variable en la definición de tareas de ECS.
  • Guardar la variable en AWS Secrets Manager.

Nota: Como práctica recomendada de seguridad, use el almacén de parámetros o Secrets Manager para almacenar los datos confidenciales como una variable de entorno. Cuando transfiera las variables de entorno en uno de los métodos anteriores, es posible que aparezcan los siguientes errores:

Almacén de parámetros

«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-

«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»

Secrets Manager

Error «ResourceInitializationError error»

-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?

Amazon S3

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

Es posible que tenga problemas al transferir las variables de entorno a sus tareas de Amazon ECS por los siguientes motivos:

  • Su rol de ejecución de tareas de Amazon ECS no tiene los permisos de AWS Identity and Management (IAM) requeridos.
  • Hay problemas con la configuración de su red.
  • La aplicación no puede leer la variable de entorno.
  • El formato de la variable en la definición del contenedor es incorrecto.
  • La variable de entorno no se actualiza automáticamente.

Para solucionar los errores de tareas de Amazon ECS que no se inician, use el runbook AWSSupport-TroubleshootECSTaskFailedToStart. A continuación, consulte los pasos de solución de problemas correspondientes a su problema.

Resolución

Importante:

  • Use el runbook AWSSupport-TroubleshootECSTaskFailedToStart en la misma región de AWS en la que se encuentran los recursos del clúster de ECS.
  • Cuando use el runbook, debe usar el ID 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. El uso del identificador de tarea fallida más reciente evita que la limpieza del estado de la tarea interrumpa el análisis durante la automatización.

Para obtener instrucciones sobre cómo iniciar el runbook, consulte AWSSupport-TroubleshootECSTaskFailedToStart. Dependiendo del resultado 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 cualquiera de las siguientes llamadas a la API:

GetParameters para el almacén de parámetros

-o-

GetSecretValue para Secrets Manager

Si observa el error AccessDenied para el rol de ejecución de tareas en los eventos de CloudTrail, añada manualmente los permisos necesarios como política en línea a su Rol de IAM de ejecución de tareas de Amazon ECS. También puede crear una política administrada por el cliente y añadirla a su rol de ejecución de tareas de ECS.

Si usa Secrets Manager, incluya los siguientes permisos a su rol de ejecución de tareas:

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

Si usa el almacén de parámetros, incluya los siguientes permisos a su rol de ejecución de tareas:

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

Puede usar un bucket de S3 para almacenar la variable de entorno como un archivo .env. Sin embargo, deberá añadir manualmente los siguientes permisos como política en línea al rol de ejecución de tareas:

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

Problemas con la configuración de red

Si su tarea de ECS se encuentra en una subred privada, compruebe los puntos siguientes:

  • Asegúrese de que el grupo de seguridad de la tarea o el servicio permita el tráfico de salida en el puerto 443.
  • Si usa un punto de conexión de VPC, asegúrese de que la lista de control de acceso (ACL) a la red permita el tráfico de salida en el puerto 443.
  • Verifique la conectividad con Systems Manager/Secrets Manager y el punto de conexión de Amazon S3. Para ello, use el comando telnet.
  • Si usa una puerta de enlace NAT, asegúrese de que la tarea tenga una ruta predeterminada a la puerta de enlace NAT.
  • Defina los puntos de conexión de VPC para sus tareas. Compruebe que dispone de los puntos de conexión de VPC necesarios para Secrets Manager/Systems Manager Parameter Store y Amazon S3.

Si usa un punto de conexión de VPC, compruebe los puntos siguientes:

  • El grupo de seguridad de su punto de conexión de VPC permite el tráfico de salida de la tarea o el servicio en el puerto 443.
  • Asocie el punto de conexión de VPC a la VPC correcta.
  • Active los atributos de VPC enableDnsHostnames y enableDnsSupport.

Si la tarea de ECS se encuentra en una subred pública, compruebe los puntos siguientes:

  • Debe activar una dirección IP pública para la tarea.
  • Asegúrese de que el grupo de seguridad de su VPC tenga acceso saliente a Internet en el puerto 443.
  • La configuración de la ACL de red permite que todo el tráfico entre y salga de las subredes hacia Internet.

La aplicación no puede leer la variable de entorno

Para comprobar si se usan las variables de entorno correctas en el contenedor de tareas, haga lo siguiente:

  1. Enumere todas las variables de entorno expuestas dentro del contenedor.
  2. Compruebe que esta lista incluya las variables de entorno que definió en la definición de la tarea o en el archivo .env de S3.

Si usa los tipos de lanzamiento de Amazon EC2 o AWS Fargate, se recomienda usar la característica ECS Exec. Puede usar esta característica para ejecutar comandos o enviar un shell a un contenedor que se ejecute en una instancia de Amazon EC2 o en Fargate. Tras habilitar esta característica, ejecute el siguiente comando para interactuar con el contenedor:

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

Si usa el tipo de lanzamiento de Amazon EC2, también puede usar el comando Docker exec para interactuar con su contenedor. En este caso, siga los pasos siguientes: Conéctese a la instancia de contenedor en la que se ejecuta la tarea. A continuación, ejecute el siguiente comando de Docker para buscar el ID de contenedor de su contenedor de tareas:

docker container ps

Para interactuar con el contenedor, ejecute lo siguiente 

docker exec -it example-container-id bash

Nota: Seleccione el shell en función del shell predeterminado de su contenedor.

Tras establecer la conexión con el contenedor, ejecute el comando env en su contenedor para obtener la lista completa de variables de entorno. Revise esta lista para asegurarse de que las variables de entorno que definió en la definición de la tarea o en el archivo .env estén presentes.

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

Al definir variables de entorno dentro de la definición del contenedor, defina las variables de entorno como objetos KeyValuePair:

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

Asegúrese de usar también este formato cuando defina las variables de entorno en sus archivos .env.

La variable de entorno no se actualiza automáticamente

Al actualizar la variable de entorno en el archivo .env, la variable no se actualiza automáticamente en el contenedor en ejecución.
Para inyectar los valores actualizados de las variables de entorno en la tarea, actualice el servicio mediante la ejecución del comando siguiente:

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

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 actualizadas. Con esta nueva definición de tarea, puede crear una nueva tarea o actualizar su servicio de ECS:

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

Nota: Tenga en cuenta los puntos siguientes al pasar variables de entorno a la tarea:

  • Si especifica variables de entorno con el parámetro environment en una definición de contenedor, tendrán prioridad sobre las variables contenidas en un archivo de entorno.
  • Si especifica varios archivos de entorno y contienen la misma variable, se procesarán en el orden de entrada. Se usará el primer valor de la variable y se omitirán los valores posteriores de las variables duplicadas. Se recomienda usar nombres de variables únicos.
  • Si especifica un archivo de entorno como modificación de contenedor, se usará dicho archivo. Los demás archivos de entorno que especifique en una definición de contenedor se omitirán.
  • 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 variables de entorno a un contenedor