¿Cómo soluciono los problemas relacionados con las implementaciones azul/verde en Amazon ECS?

Última actualización: 13/04/2022

Quiero solucionar problemas relacionados con las implementaciones azul/verde de los servicios alojados en Amazon Elastic Container Service (Amazon ECS).

Descripción corta

Los problemas más comunes relacionados con las implementaciones azul/verde para los servicios alojados en Amazon ECS son los siguientes:

Problemas relacionados con recursos de AWS Identity and Access Management (IAM):

  • No puede crear su servicio ECS porque recibe este error: Please create your Service role for CodeDeploy (Cree su rol de servicio para CodeDeploy)
  • Obtiene este error: service failed to launch a task with (error ECS was unable to assume the role that was provided for this task. Please verify that the role being passed has the proper trust relationship and permissions and that your IAM user has permissions to pass this role) (el servicio no pudo lanzar una tarea [ECS no pudo asumir el rol proporcionado para esta tarea. Compruebe que el rol transmitido cuenta con la relación de confianza y permisos adecuados y que su usuario de IAM cuenta con permisos para transmitir este rol])

Problemas relacionados con el equilibrador de carga/ECS:

  • Su servicio ECS no se estabiliza debido a errores en la comprobación de estado.
  • Recibe este error:The ELB could not be updated due to the following error: Primary taskset target group must be behind listener (El ELB no se pudo actualizar debido al siguiente error: el grupo de destino del conjunto de tareas principal debe estar detrás del agente de escucha)
  • El tráfico sigue dirigiéndose al grupo de destino azul después de una implementación realizada correctamente.
  • Las tareas de ECS que se ejecutan en el servicio ECS no superan las comprobaciones de estado del Application Load Balancer únicamente durante una nueva implementación VERDE.
  • Las tareas de ECS están fallando las comprobaciones de estado del Application Load Balancer de manera inconsistente.
  • Su servicio ECS no puede realizar una tarea porque ninguna instancia de contenedor cumple todos los requisitos. La instancia de contenedor más cercana no tiene suficientes unidades de CPU disponibles.

Problemas relacionados con AWS CloudFormation (si realiza una implementación azul/verde a través de CloudFormation):

  • Al crear un conjunto de cambios que desencadena una implementación azul/verde, la pila de CloudFormation falla con un error Internal Failure (Error interno).
  • Se produce un error al crear un conjunto de cambios para desencadenar la implementación azul/verde: 'CodeDeployBlueGreenHook' of type AWS::CodeDeploy::BlueGreen failed with message: The TaskDefinition logical Id [ ] is the same between initial and final template, CodeDeploy can't perform BlueGreen style update properly ('CodeDeployBlueGreenHook' de tipo AWS::CodeDeploy::BlueGreen sufrió un error con el mensaje: el ID lógico de TaskDefinition es el mismo para la plantilla inicial y la plantilla final; CodeDeploy no puede realizar la actualización de estilo BlueGreen correctamente)

Resolución

No puede crear su servicio ECS porque recibe el error: Please create your Service role for CodeDeploy (Cree su rol de servicio para CodeDeploy):

Aparece este error porque AWS CodeDeploy no tiene los permisos de IAM requeridos para llevar a cabo la estrategia de implementación azul/verde. Debe conceder los permisos de servicio a CodeDeploy para actualizar el servicio Amazon ECS en su nombre.

Para solucionar este error, compruebe que el rol de IAM de CodeDeploy se haya creado correctamente y tenga los permisos necesarios.

Para crear un rol de IAM para CodeDeploy, haga lo siguiente:

  1. Abra la consola de IAM.
  2. En el panel de navegación, elija Roles.
  3. Elija Create role (Crear rol)
  4. En la sección Select type of trusted entity (Seleccione el tipo de entidad de confianza), elija AWS service (Servicio de AWS) y, a continuación, elija CodeDeploy.
  5. En la sección Select your use case (Seleccione su caso de uso), elija CodeDeploy - ECS y, a continuación, elija Next: Permissions (Siguiente: permisos).
    Nota: conserve la política AWSCodeDeployforECS predeterminada. Esta política incluye los permisos que CodeDeploy requiere para interactuar correctamente con Amazon ECS y otros servicios.
  6. Elija Next: Tags (Siguiente: etiquetas).
  7. (Opcional) Especifique un nombre de etiqueta y, a continuación, elija Next: Review (Siguiente: revisar).
  8. En Role name (Nombre de rol), ingrese ecsCodeDeployRole.
  9. Elija Create role (Crear rol).

Aparece el error: service failed to launch a task with (error ECS was unable to assume the role that was provided for this task: Verify that the IAM role being passed has the proper trust relationship and permissions and that your IAM user has permissions to pass this role) (el servicio no pudo lanzar una tarea [ECS no pudo asumir el rol proporcionado para esta tarea: compruebe que el rol de IAM transmitido cuenta con la relación de confianza y los permisos adecuados y que su usuario de IAM cuenta con permisos para transmitir este rol]):

Compruebe el rol de IAM que devuelve el mensaje de error para asegurarse de que la instancia de Amazon Elastic Compute Cloud (EC2) tenga una relación de confianza para el servicio de tareas de ECS ecs-tasks.amazonaws.com. La relación de confianza para su rol debe ser similar a la siguiente:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "ec2.amazonaws.com",
          "ecs-tasks.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  • Su servicio ECS no se estabiliza debido a errores en la comprobación de estado: asegúrese de que las asignaciones de puertos de sus definiciones de tareas coincidan con los puertos de sus grupos de destino. Para obtener más información, consulte ¿Cómo se logra que las tareas de Amazon ECS que se ejecutan con el tipo de lanzamiento de Amazon EC2 pasen la comprobación de estado del Application Load Balancer en Amazon ECS?
  • Recibe el error: Error Message: The ELB could not be updated due to the following error: Primary taskset target group must be behind listener: (Mensaje de error: no se pudo actualizar el ELB debido al siguiente error: el grupo de destino del conjunto de tareas principal debe estar detrás del agente de escucha:). Obtiene este error cuando los agente de escucha o los grupo de destino de Elastic Load Balancing están mal configurados. Asegúrese de que el agente de escucha principal del ELB y el agente de escucha de prueba apunten al grupo de destino principal que actualmente atiende sus cargas de trabajo.
  • El tráfico sigue dirigiéndose al grupo de destino azul después de una implementación realizada correctamente: CodeDeploy actualiza automáticamente el agente de escucha principal de su equilibrador de carga para que apunte al grupo de destino verde una vez que se completa la implementación. Sin embargo, CodeDeploy actualiza solo el agente de escucha de producción que especificó. Si CodeDeploy no cambia el tráfico después de la implementación, es posible que los agentes de escucha del ELB estén configurados con un tipo de tráfico incorrecto. Asegúrese de haber especificado el protocolo y el puerto correctos para el agente de escucha del ELB principal.
  • Las tareas de ECS que se ejecutan en el servicio ECS no superan las comprobaciones de estado del Application Load Balancer solo durante una nueva implementación verde: compruebe si algún otro servicio de ECS está intentando registrar sus tareas en el mismo grupo de destino verde, lo que provoca una discrepancia. Actualice la configuración del equilibrador de carga para asegurarse de que solo un servicio o puerto de ECS esté registrado en un grupo de destino.
  • Las tareas de ECS están fallando las comprobaciones de estado del Application Load Balancer de manera inconsistente: este problema puede ocurrir cuando los contenedores tardan más del tiempo esperado en iniciarse. Compruebe el código de solicitud de su contenedor para encontrar la causa del retraso. Para resolver este problema, optimice el código de la aplicación. Si aún no puede resolver el problema, incluya un período de gracia de comprobación de estado en su servicio ECS para que los contenedores tengan tiempo suficiente para iniciarse.
  • Su servicio ECS no puede realizar una tarea porque ninguna instancia de contenedor cumple con todos sus requisitos. La instancia de contenedor más cercana no tiene suficientes unidades de CPU disponibles: asegúrese de tener suficientes recursos de instancia de contenedor antes de realizar una implementación azul/verde.

Nota: estos pasos de solución de problemas solo se aplican si utiliza CloudFormation para su implementación azul/verde

  • Al crear un conjunto de cambios que desencadena una implementación azul/verde, la pila de CloudFormation falla con un error “Internal Failure” (Error interno): para mitigar este problema, use un rol de servicio de CloudFormation y adjunte este rol a su pila de CloudFormation. Asegúrese de que el rol de servicio tenga los permisos necesarios para ejecutar todas las operaciones de pila. Tenga en cuenta que no puede eliminar el rol de servicio de la pila después de crear la pila.
  • Se produce un error al crear un conjunto de cambios para desencadenar la implementación azul/verde: 'CodeDeployBlueGreenHook' of type AWS::CodeDeploy::BlueGreen failed with message: The TaskDefinition logical Id [ ] is the same between initial and final template, CodeDeploy can't perform BlueGreen style update properly ('CodeDeployBlueGreenHook' de tipo AWS::CodeDeploy::BlueGreen sufrió un error con el mensaje: el ID lógico de TaskDefinition es el mismo para la plantilla inicial y la plantilla final; CodeDeploy no puede realizar la actualización de estilo BlueGreen correctamente). Cuando especifica un agente de escucha de prueba que ya está apuntando al grupo de destino verde, el enlace de CodeDeploy da fallo con este error. Asegúrese de que su agente de escucha de prueba no esté apuntando al grupo de destino verde antes de ejecutar la implementación azul/verde.

Importante: no utilice la API UpdateService para cancelar y deshacer la implementación azul/verde. En su lugar, use la API CreateDeployment. Para deshacer una implementación, use la API de implementación StopDeployment.