¿Cómo soluciono los problemas de conexión entre mi tarea de Fargate y otros servicios de AWS?

8 minutos de lectura
0

Quiero solucionar los problemas de conectividad que tengo entre mi tarea de AWS Fargate y un servicio de AWS.

Descripción breve

Las aplicaciones que se ejecutan dentro de una tarea de Fargate con Amazon Elastic Container Service (Amazon ECS) pueden fallar al acceder a otros servicios de AWS por los siguientes motivos:

  • Permisos insuficientes de AWS Identity and Access Management (IAM)
  • Rutas de subred incorrectas
  • Restricciones de la lista de control de acceso de la red (ACL de red)
  • Grupos de seguridad
  • Puntos de conexión de Amazon Virtual Private Cloud (Amazon VPC)

Para resolver estos problemas, utilice Amazon ECS Exec para interactuar con el contenedor de aplicaciones de la tarea de Fargate. Si observa errores de tiempo de espera de conexión en los registros del contenedor de la aplicación, pruebe la conectividad entre la tarea de Fargate y el servicio de AWS correspondiente.

Solución

Use ECS Exec para interactuar con el contenedor de aplicaciones de la tarea de Fargate

1.    Antes de usar Amazon ECS Exec, complete losrequisitos previos para usar Amazon ECS Exec.

2.    Siga las instrucciones que se indican en Uso de Amazon ECS Exec para activar la función.

3.    Ejecute Amazon ECS Exec para acceder al contenedor de aplicaciones y comprobar la conectividad de red e IAM entre el contenedor y el servicio de AWS.

Nota:Antes de ejecutar Exec, se recomienda establecer el parámetroinitProcessEnabled en verdadero. Esto evita que los procesos secundarios de AWS Systems Manager Agent (SSM Agent) queden huérfanos. (Opcional) Agregue un comando de suspensión al contenedor de aplicaciones para mantener el contenedor en ejecución durante un período de tiempo específico.

Ejemplo:

{
    "taskRoleArn": "ecsTaskRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "EC2",
        "FARGATE"
        ],
        "executionRoleArn": "ecsTaskExecutionRole",
        "memory": ".5 gb",
        "cpu": ".25 vcpu",
        "containerDefinitions": [
            {
                "name": "application",
                "image": "application:latest",
                "essential": true,
                "command": ["sleep","7200"],
                "linuxParameters": {
                    "initProcessEnabled": true
                }
            }
        ],
        "family": "ecs-exec-task"
}

Si no puede usar Exec para acceder a su contenedor de aplicaciones, ejecute Exec para una nueva tarea de Fargate que se ejecute en la imagen de Docker amazon/aws-cli. De esta forma podrá probar la comunicación entre la tarea de Fargate y el servicio AWS.

Nota: La nueva tarea Fargate debe tener la misma configuración de red (subredes, grupos de seguridad, etc.) que su contenedor de aplicaciones.

Para ejecutar una nueva tarea de Fargate con la imagen de Docker amazon/aws-cli, realice los siguientes pasos:

Nota: La interfaz de la línea de comandos de AWS (AWS CLI) está preinstalada en la imagen amazon/aws-cli de su contenedor. Si la AWS CLI no está instalada en su contenedor de aplicaciones, ejecute el siguiente comando:

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86\_64.zip" -o "awscliv2.zip"

unzip awscliv2.zip

sudo ./aws/install

1.    Cree una definición de tarea con amazon/aws-cli como imagen para el contenedor. A continuación, agregue los puntos de entrada tail, -f, y /dev/null para poner el contenedor en un estado continuo de Ejecución.

Ejemplo de definición de tarea:

{  
    "requiresCompatibilities": \[  
        "FARGATE"  
    \],  
    "family": "aws-cli",  
    "containerDefinitions": \[  
        {  
        "entryPoint": \[  
        "tail",  
        "-f",  
        "/dev/null"  
        \],  
        "name": "cli",  
        "image": "amazon/aws-cli",  
        "essential": true  
        }  
    \],  
    "networkMode": "awsvpc",  
    "memory": "512",  
    "cpu": "256",  
    "executionRoleArn": "arn:aws:iam::123456789012:role/EcsTaskExecutionRole",  
    "taskRoleArn": "arn:aws:iam::123456789012:role/TaskRole"  
}

2.    Cree un servicio de Amazon ECS con la definición de tarea recién creada y con la misma configuración de red que el contenedor de la aplicación:

$ aws ecs create-service --cluster <example-cluster-name> --task-definition <example-task-definition-name> --network-configuration awsvpcConfiguration="{subnets=[example-subnet-XXXXXXX, example-subnet-XXXXXXX],securityGroups=[example-sg-XXXXXXXXXXXX],assignPublicIp=ENABLED}" --enable-execute-command --service-name <example-service-name> --desired-count 1 --launch-type FARGATE --region <example-region>

Nota: Sustituya example-cluster-name por el nombre del clúster, example-task-definition-name por el nombre de definición de su tarea, example-service-name por el nombre de su servicio y example-region por su región de AWS.

3.    Ejecute Exec para acceder al contenedor de tareas de Amazon ECS Fargate y ejecute el comando /bin/sh con el container-name y task-id especificados:

$ aws ecs execute-command --cluster <example-cluster-name> --task <example-task-id> --container <example-container-name> --interactive --command "/bin/sh" --region <example-region>

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

Si aún tiene problemas para usar ECS Exec en su tarea de Fargate, CONSULTE EL ARTÍCULO DE ISHAN AQUÍ (esperando la URL de article\ _33538).

Probar la conectividad entre una tarea de Fargate y el servicio AWS correspondiente

Solucionar problemas de permisos insuficientes de IAM

Compruebe si la tarea de Fargate tiene suficientes permisos de IAM para conectarse al servicio de AWS correspondiente. Para ejecutar comandos de AWS CLI del servicio de AWS requerido, consulte la guía de Referencia de comandos de AWS CLI.

Ejemplo de prueba de conectividad entre la tarea de Fargate y Amazon Simple Notification Service (Amazon SNS):

# aws sns list-topics --region <example-region-name>

Si recibe el siguiente error, compruebe la política de punto de conexión de VPC de Amazon. Asegúrese de que la política permite el acceso para realizar las acciones necesarias contra el servicio de AWS.

An error occurred (AuthorizationError) when calling the ListTopics operation: User: arn:aws:sts::123456789012:assumed-role/TaskRole/123456789012 is not authorized to perform: SNS:ListTopics on resource: arn:aws:sns:<region-name>:123456789012:* with an explicit deny in a VPC endpoint policy

Si recibe el siguiente error, compruebe los permisos del rol de IAM de la tarea de Amazon ECS. Asegúrese de que el rol de IAM tiene los permisos necesarios para realizar las acciones requeridas en el servicio de AWS.

An error occurred (AuthorizationError) when calling the ListTopics operation: User: arn:aws:sts::123456789012:assumed-role/TaskRole/123456789012 is not authorized to perform: SNS:ListTopics on resource: arn:aws:sns:<region-name>:123456789012:* because no identity-based policy allows the SNS:ListTopics action

Nota: Si no se produce ningún error al ejecutar los comandos de AWS CLI en la tarea de Fargate, los permisos de IAM requeridos estarán presentes para ese servicio de AWS.

Solucionar errores de tiempo de espera de conexión

1.    Use # telnet para probar la conectividad de red a sus puntos de conexión de servicios de AWS desde la tarea de Fargate:

# telnet <EXAMPLE-ENDPOINT> <EXAMPLE-PORT>

Nota: Sustituya EXAMPLE-ENDPOINT por el nombre y la URL del punto de conexión de su servicio de AWS y EXAMPLE-PORT por el puerto de su servicio de AWS.

El siguiente ejemplo de salida muestra que se puede acceder al punto de conexión desde el contenedor:

Trying 10.0.1.169...
Connected to sns.us-east-1.amazonaws.com.
Escape character is '^]'.

# dig <EXAMPLE-ENDPOINT>

# nslookup <EXAMPLE-ENDPOINT>

Para obtener una lista de los puntos de conexión regionales del servicio de AWS, consulte Puntos de conexión del servicio y cuotas para los servicios de AWS.

Nota: Si no instaló telnet y dig en el contenedor de aplicaciones, ejecute los comandos apt-get update, apt install dnsutils y apt install telnet para instalarlos. Para contenedores basados en amazon/aws-cli, use los comandos yum update, yum install telnet, y yum install bind-utils para instalar telnet y otras herramientas.

2.    Si recibe errores de Tiempo de espera de conexión después de probar la conectividad de red a sus puntos de conexión de servicios de AWS, inspeccione la configuración de red:

Ejecute el comando nslookup. Si ve los rangos VPC CIDR IP, el tráfico se enrutará a través de puntos de conexión de VPC:

# nslookup sns.us-east-1.amazonaws.com

Non-authoritative answer:
Name:    sns.us-east-1.amazonaws.com
Address: 10.0.1.169
Name:    sns.us-east-1.amazonaws.com
Address: 10.0.2.248

Si se producen errores de tiempo de espera de conexión, compruebe las reglas de entrada del grupo de seguridad del punto de conexión de VPC. Asegúrese de que el tráfico TCP a través del puerto 443 está permitido en las reglas de entrada del grupo de seguridad ECS o VPC CIDR. Para más información, consulte ¿Cómo se pueden solucionar los problemas de conectividad a través de mi puerta de enlace e interfaz de puntos de conexión de VPC?

  • Si no hay puntos de conexión de Amazon VPC configurados en la región, compruebe las rutas desde sus subredes a Internet. Para una tarea de Fargate en una subred pública, asegúrese de que la tarea tiene una ruta predeterminada a la puerta de enlace de Internet. Para una tarea de Fargate en una subred privada, asegúrese de que la tarea tiene una ruta predeterminada. La tarea necesita una ruta predeterminada a la puerta de enlace NAT, AWS PrivateLink, otra fuente de conectividad a Internet o a CIDR local y VPC.
  • Asegúrese de que la ACL de red permite el acceso al servicio de AWS.
  • Comprueba que las reglas de entrada del grupo de seguridad se adjuntan al servicio de AWS al que intenta acceder con su tarea de Fargate. Permita el tráfico de entrada a través de los puertos requeridos.
  • Compruebe que las reglas de salida del grupo de seguridad de la tarea de Fargate permiten el tráfico de salida a través de los puertos requeridos para conectarse al servicio de AWS.
OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año