Error de AWS ECS al ejecutar la tarea: no se encontraron instancias de contenedor en su clúster

115

Estoy tratando de implementar una dockerimagen de contenedor para AWSusar ECS, pero la instancia EC2 no se está creando. He buscado en Internet una explicación de por qué recibo el siguiente error:

"Se produjo un error de cliente (InvalidParameterException) al llamar a la operación RunTask: No se encontraron instancias de contenedor en su clúster".

Estos son mis pasos:

1. Envié una imagen de Docker DESDE Ubuntu a mi repositorio de Amazon ECS.

2. Registrado una definición de tarea de ECS:

aws ecs register-task-definition --cli-input-json file://path/to/my-task.json 

3. Ejecutó la tarea:

aws ecs run-task --task-definition my-task

Sin embargo, falla.

Esta es mi tarea:

{
  "family": "my-task",
  "containerDefinitions": [
    {
        "environment": [],
        "name": "my-container",
        "image": "my-namespace/my-image",
        "cpu": 10,
        "memory": 500,
        "portMappings": [
            {
                "containerPort": 8080,
                "hostPort": 80
            }
        ],
        "entryPoint": [
            "java",
            "-jar",
            "my-jar.jar"
        ],
        "essential": true
    }
  ]
}

También intenté usar la consola de administración para configurar un clúster y servicios, pero obtengo el mismo error. ¿Cómo configuro el clúster para que tenga instancias ec2 y qué tipo de instancias de contenedor necesito usar? ¡Pensé que todo este proceso consistía en crear las instancias EC2 para empezar!

cosbor11
fuente
Siento que vi esto cuando fui rápido entre los pasos de crear un clúster y ejecutar una tarea.
Ben Creasy

Respuestas:

157

Me di cuenta de esto después de algunas horas más de investigación. Amazon, si está escuchando, debe indicar esto en algún lugar de su consola de administración al crear un clúster o agregar instancias al clúster:

"Antes de que pueda agregar instancias de ECS a un clúster, primero debe ir a la Consola de administración de EC2 y crear ecs-optimizedinstancias con un rol de IAM que tenga la AmazonEC2ContainerServiceforEC2Rolepolítica adjunta"

Aquí está el galimatías:

1. Vaya a su EC2 Dashboard y haga clic en el Launch Instancebotón.

2. En Community AMIs, Busque ecs-optimizedy seleccione el que mejor se adapte a las necesidades de su proyecto. Cualquiera funcionará. Haga clic en Siguiente.

3. Cuando llegue a Configurar detalles de instancia, haga clic en create new IAM role linky cree un nuevo rol llamado ecsInstanceRole.

4. Adjunte la AmazonEC2ContainerServiceforEC2Rolepolítica a ese rol.

5. Luego, termine de configurar su instancia ECS.
NOTA: Si está creando un servidor web, querrá crear un grupo de seguridad para permitir el acceso al puerto 80.

Después de unos minutos, cuando la instancia se inicializa y se ejecuta, puede actualizar la pestaña Instancias de ECS y también está intentando agregar instancias.

cosbor11
fuente
10
La selección de la ami sugerida que se especificó para la región dada resolvió mi problema. Para averiguar el ami, debe seleccionar verificar esta url docs.aws.amazon.com/AmazonECS/latest/developerguide/…
sanath_p
1
no ve AmazonEC2ContainerServiceforEC2Role, ¿ha habido algún cambio desde su última publicación?
BlueDolphin
1
@BlueDolphin Pude encontrar esa política cuando creé un nuevo rol en IAM.
cyrf
6
Vale la pena señalar ahora (abril de 2018) si está utilizando actualmente Beta Fargate ( aws.amazon.com/fargate ) para evitar todo este tipo de molestias, es posible que le guste que haya seleccionado EC2como el tipo de lanzamiento cuando recibió este error ...
declinación
10
Y, al crear EC2, no se olvide de añadir #!/bin/bash echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.configen Advanced Details -> User datasi usted tiene su propio grupo, no por defecto. De lo contrario, la instancia EC2 recién creada creará un clúster predeterminado.
Jakub Czaplicki
40

Actualmente, la interfaz web de Amazon AWS puede crear instancias automáticamente con la AMI correcta y el nombre correcto para que se registre en el clúster correcto.

Aunque todas las instancias fueron creadas por Amazon con la configuración correcta, mis instancias no se registraron. En los foros de Amazon AWS encontré una pista. Resulta que sus clústeres necesitan acceso a Internet y, si su VPC privada no tiene una puerta de enlace a Internet, los clústeres no podrán conectarse.

La solución

En el panel de VPC, debe crear una nueva puerta de enlace de Internet y conectarla a la VPC que utiliza el clúster. Una vez adjunto, debe actualizar (o crear) la tabla de ruta para la VPC y agregar como última línea

0.0.0.0/0 igw-24b16740  

Donde igw-24b16740 es el nombre de su puerta de enlace de Internet recién creada.

P_W999
fuente
Esto se menciona en docs.aws.amazon.com/AWSEC2/latest/UserGuide/… [EC2-VPC] Consulte la tabla de rutas de la subred. Necesita una ruta que envíe todo el tráfico destinado fuera de la VPC a la puerta de enlace de Internet de la VPC.
Justin M. Keyes
2
¡Gracias por la pista! Había asignado un grupo de seguridad a mis instancias que bloqueaba todo el tráfico saliente excepto el tráfico a mi balanceador de carga. Cambié esto para permitir todo el tráfico saliente pero restringir el tráfico entrante solo desde el equilibrador de carga, y las instancias aparecieron en mi clúster EC2.
Mikepote
1
Ojalá pudiera votar su respuesta más de una vez. Esto solucionó mi problema exacto "No se encontraron instancias de contenedor en su clúster". y la respuesta original votada más no tuvo nada que ver con su solución real. Gracias de nuevo.
alexkb
Además de asociar la puerta de enlace con su VPC, es posible que deba enrutar el tráfico de Internet a través de ella para la subred específica que alberga sus instancias de ECS. - por ejemplo aws ec2 associate-route-table --subnet-id $SUBNET_ID --route-table-id $ROUTE_TABLE_ID, ¿puedo sugerir que agregue esto a la respuesta?
Greg
Creo que vale la pena mencionar que en el momento en que agrega una ruta para 0.0.0..0 / 0 apuntando a un IGW, la subred ya no es una subred privada. Desde la perspectiva de la seguridad de la red, es mejor crear una ruta que apunte a una puerta de enlace NAT.
Henrik Pingel
18

Me encontré con este problema al usar Fargate. Me fijo cuando explícitamente definido launchType="FARGATE"al llamar run_task.

Milán Cermak
fuente
1
Con la CLI agregué--launch-type FARGATE
shlomiLan
11

Otras comprobaciones sugeridas

  1. La selección de la AMI sugerida que se especificó para la región dada resolvió mi problema.

    Para conocer la AMI, consulte Lanzamiento de una instancia de contenedor de Amazon ECS .

  2. De forma predeterminada, todas las instancias de ec2 se agregan al clúster predeterminado. Entonces, el nombre del clúster también es importante.

Consulte el punto 10 en Lanzamiento de una instancia de contenedor de Amazon ECS .

Más información disponible en este hilo .

sanath_p
fuente
3

En caso de que alguien más esté bloqueado con este problema como yo ... He intentado todo aquí y no funcionó para mí.

Además de lo que se dijo aquí con respecto al rol de la instancia EC2, como se comentó aquí , en mi caso solo funcionó si aún configuré la instancia EC2 con información simple. Usando los datos del usuario un script inicial como este:

#!/bin/bash
cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER=quarkus-ec2
EOF

Informar el nombre del clúster de ECS relacionado creado en este archivo de configuración de ecs, resolvió mi problema. Sin esta configuración, el registro del agente de ECS en la instancia EC2 mostraba un error que no era posible conectar con el ECS, al hacer esto, tengo la instancia EC2 visible para el clúster de ECS.

Después de hacer esto, podría obtener la instancia EC2 disponible para mi clúster EC2: ingrese la descripción de la imagen aquí

La documentación de AWS decía que esta parte es opcional, pero en mi caso, no funcionó sin esta configuración "opcional".

Ualter Jr.
fuente
2

Si se ha encontrado con este problema después de crear el clúster

Vaya a la instancia de ECS en la lista de instancias de EC2 y verifique la función de IAM que le asignó a la instancia. Puede identificar las instancias fácilmente con el nombre de la instancia que comienza conECS Instance

ingrese la descripción de la imagen aquí

Después de eso, haga clic en el rol de IAM y lo dirigirá a la consola de IAM. Seleccione la AmazonEC2ContainerServiceforEC2Rolepolítica de la lista de políticas de permisos y guarde el rol.

Sus instancias estarán disponibles en el clúster poco después de guardarlo.

sandaru.ny
fuente
1

El verdadero problema es la falta de permiso. Siempre que cree y asigne un rol de IAM con el permiso AmazonEC2ContainerServiceforEC2Role, el problema desaparecerá.

Ben
fuente
0

Otra posible causa que encontré fue la actualización de mi AMI de clúster de ECS a una AMI de "Amazon Linux 2" en lugar de una "AMI de Amazon Linux", lo que provocó que mi script de inicio de datos de usuario de EC2 no funcionara.

skeller88
fuente
0

Cuando esto sucede, debe mirar lo siguiente:

  1. Sus instancias EC2 deben tener un rol con AmazonEC2ContainerServiceforEC2Role política administrada adjunta
  2. Sus instancias EC2 deben ejecutar una imagen AMI que es ecs-optimized(puede verificar esto en el panel de EC2)
  3. Las subredes privadas de su VPC no tienen IP públicas asignadas, O no tiene un punto de enlace de VPC de interfaz configurado, O no tiene configurada una puerta de enlace NAT

La mayoría de las veces, este problema aparece debido a una VPC mal configurada. De acuerdo con la documentación :

COTIZACIÓN: Si no tiene configurado un extremo de VPC de interfaz y sus instancias de contenedor no tienen direcciones IP públicas, entonces deben usar la traducción de direcciones de red (NAT) para proporcionar este acceso.

  • Para crear un punto de enlace de VPC: siga a la documentación aquí
  • Para crear una puerta de enlace NAT: siga la documentación aquí

Estas son las razones por las que no ve las instancias EC2 enumeradas en el panel de ECS.

Un tiro
fuente