Comment résoudre les problèmes liés aux déploiements bleu/vert dans Amazon ECS ?

Date de la dernière mise à jour : 13/04/2022

Je veux résoudre les problèmes liés aux déploiements bleu/vert des services hébergés sur Amazon Elastic Container Service (Amazon ECS).

Brève description

Les problèmes les plus courants liés aux déploiements bleu/vert des services hébergés sur Amazon ECS sont les suivants :

Problèmes liés à AWS Identity and Access Management (IAM) :

  • Vous ne parvenez pas à créer votre service ECS car vous obtenez cette erreur : Please create your Service role for CodeDeploy (Veuillez créer votre fonction du service pour CodeDeploy)
  • Vous obtenez cette erreur : 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) [le service <nom du service> n'a pas réussi à lancer une tâche avec (erreur ECS n'a pas pu assumer le rôle <ARN du rôle> qui a été fourni pour cette tâche. Vérifiez que le rôle transmis possède la relation d'approbation et les autorisations appropriées et que votre utilisateur IAM dispose des autorisations nécessaires pour transmettre ce rôle)]

Problèmes liés à l'équilibreur de charge/ECS :

  • Votre service ECS ne parvient pas à se stabiliser en raison d'échecs de surveillance de l'état.
  • Vous obtenez cette erreur : The ELB could not be updated due to the following error: Primary taskset target group must be behind listener (L'ELB n'a pas pu être mis à jour en raison de l'erreur suivante : Le groupe cible du jeu de tâches principal doit être derrière l'écouteur <ARN de l'écouteur>)
  • Le trafic est toujours acheminé vers le groupe cible bleu après un déploiement réussi.
  • Vos tâches ECS exécutées dans le service ECS échouent aux surveillances de l'état de l'Application Load Balancer uniquement lors d'un nouveau déploiement GREEN (VERT).
  • Vos tâches ECS échouent de manière incohérente aux surveillances de l'état de l'Application Load Balancer.
  • Votre service ECS ne parvient pas à placer une tâche car aucune instance de conteneur ne répond à toutes les exigences. L'instance de conteneur la plus proche n'a pas assez d'unités CPU disponibles.

Problèmes liés à AWS CloudFormation (si vous effectuez un déploiement bleu/vert via CloudFormation) :

  • Lors de la création d'un jeu de modifications qui déclenche un déploiement bleu/vert, la pile CloudFormation échoue avec une erreur Internal Failure (Échec interne).
  • Vous obtenez une erreur lors de la création d'un jeu de modifications qui déclenche le déploiement bleu/vert : '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 type AWS::CodeDeploy::BlueGreen a échoué avec le message : L'Id logique [<ID>] de TaskDefinition est le même entre le modèle initial et le modèle final, CodeDeploy ne peut pas effectuer correctement la mise à jour de style BlueGreen)

Solution

Vous ne pouvez pas créer votre Service ECS car vous obtenez l'erreur : Please create your Service role for CodeDeploy (Veuillez créer votre fonction du service pour CodeDeploy) :

Vous obtenez cette erreur car AWS CodeDeploy ne dispose pas des autorisations IAM requises pour agir sur la stratégie de déploiement bleu/vert. Vous devez accorder au service CodeDeploy les autorisations nécessaires pour mettre à jour votre Amazon ECS service en votre nom.

Pour résoudre cette erreur, vérifiez que votre rôle IAM CodeDeploy est créé correctement et qu'il dispose des autorisations requises.

Pour créer un rôle IAM pour CodeDeploy, procédez comme suit :

  1. Ouvrez la console IAM.
  2. Dans le panneau de navigation, choisissez Roles (Rôles).
  3. Choisissez Create role (Créer un rôle)
  4. Dans la section Select type of trusted entity (Sélectionner le type d'entité de confiance), choisissez AWS service (Service AWS), puis CodeDeploy.
  5. Dans la section Select your use case (Sélectionner votre cas d'utilisation), choisissez CodeDeploy – ECS, puis Next:Permissions (Suivant : autorisations).
    Remarque : Conservez la stratégie AWSCodeDeployforECS par défaut. Cette politique inclut les autorisations requises par CodeDeploy pour interagir correctement avec Amazon ECS et d'autres services.
  6. Choisissez Next: Tags (Suivant : identifications).
  7. (Facultatif) Saisissez un nom d'identification, puis choisissez Next: Review (Suivant : révision).
  8. Pour Role name (Nom du rôle), saisissez ecsCodeDeployRole.
  9. Choisissez Create role (Créer un rôle).

Vous obtenez l'erreur : 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) [le service n'a pas réussi à lancer une tâche avec (erreur ECS n'a pas pu assumer le rôle qui a été fourni pour cette tâche : Vérifiez que le rôle IAM transmis possède la relation d'approbation et les autorisations appropriées et que votre utilisateur IAM dispose des autorisations nécessaires pour transmettre ce rôle)] :

Vérifiez le rôle IAM renvoyé par le message d'erreur pour vous assurer que l'instance Amazon Elastic Compute Cloud (Amazon EC2) a une relation d'approbation pour le service de tâches ECS ecs-tasks.amazonaws.com. La relation d'approbation pour votre rôle doit ressembler à ce qui suit :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "ec2.amazonaws.com",
          "ecs-tasks.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  • Votre service ECS ne parvient pas à se stabiliser en raison d'échecs de surveillance de l'état : assurez-vous que les mappages de ports de vos définitions de tâches correspondent aux ports de vos groupes cibles. Pour plus d'informations, consultez la section Comment puis-je exécuter mes tâches Amazon ECS à l'aide du type de lancement Amazon EC2 pour la réussite de la surveillance de l'état d'Application Load Balancer dans Amazon ECS ?
  • Vous obtenez l'erreur : Error Message: The ELB could not be updated due to the following error: Primary taskset target group must be behind listener : (Message d'erreur : L'ELB n'a pas pu être mis à jour en raison de l'erreur suivante : Le groupe cible du jeu de tâches principal doit être derrière l'écouteur :) Vous obtenez cette erreur lorsque vos écouteurs ou groupes cibles Elastic Load Balancing sont mal configurés. Assurez-vous que l'écouteur principal ELB et l'écouteur de test pointent tous deux vers le groupe cible principal qui sert actuellement vos charges de travail.
  • Le trafic est toujours acheminé vers le groupe cible bleu après un déploiement réussi : CodeDeploy met automatiquement à jour l'écouteur principal de votre équilibreur de charge pour qu'il pointe vers le groupe cible vert une fois le déploiement terminé. Toutefois, CodeDeploy ne met à jour que l'écouteur de production que vous avez spécifié. Si CodeDeploy ne parvient pas à commuter le trafic après le déploiement, il se peut que vos écouteurs ELB soient configurés avec le mauvais type de trafic. Assurez-vous que vous avez spécifié le protocole et le port corrects pour l'écouteur ELB principal.
  • Vos tâches ECS exécutées dans le service ECS échouent aux surveillances de l'état de l'Application Load Balancer uniquement lors d'un nouveau déploiement vert : Vérifiez si un autre service ECS essaie d'enregistrer ses tâches dans le même groupe cible vert, ce qui provoque une divergence. Mettez à jour la configuration de l'équilibreur de charge pour vous assurer qu'un seul service ou port ECS est enregistré dans un groupe cible.
  • Vos tâches ECS échouent de manière incohérente aux surveillances de l'état de l'Application Load Balancer : Ce problème peut se produire lorsque vos conteneurs prennent plus que le temps prévu pour démarrer. Vérifiez le code de votre application de conteneur pour trouver la cause de ce retard. Pour résoudre ce problème, optimisez le code de l'application. Si vous ne parvenez toujours pas à résoudre le problème, incluez une période de grâce de la surveillance de l'état sur votre service ECS afin que les conteneurs aient suffisamment de temps pour démarrer.
  • Votre service ECS est incapable de placer une tâche car aucune instance de conteneur ne répond à toutes ses exigences. L'instance de conteneur correspondant le plus proche n'a pas assez d'unités CPU disponibles : Assurez-vous que vous disposez de suffisamment de ressources d'instance de conteneur avant d'effectuer un déploiement bleu/vert.

Remarque : ces étapes de résolution des problèmes sont applicables uniquement si vous utilisez CloudFormation pour votre déploiement bleu/vert

  • Lors de la création d'un jeu de modifications qui déclenche un déploiement bleu/vert, la pile CloudFormation échoue avec une erreur Internal Failure (Échec interne) : Pour atténuer ce problème, utilisez une fonction du service CloudFormation et attachez-la à votre pile CloudFormation. Assurez-vous que la fonction du service dispose des autorisations nécessaires pour exécuter toutes les opérations de la pile. Notez que vous ne pouvez pas supprimer la fonction du service de la pile après la création de la pile.
  • Vous obtenez une erreur lors de la création d'un jeu de modifications qui déclenche le déploiement bleu/vert : '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 type AWS::CodeDeploy::BlueGreen a échoué avec le message : L'Id logique [<ID>] de TaskDefinition est le même entre le modèle initial et le modèle final, CodeDeploy ne peut pas effectuer correctement la mise à jour de style BlueGreen) : Lorsque vous spécifiez un écouteur de test qui pointe déjà vers le groupe cible vert, le hook de CodeDeploy échoue avec cette erreur. Assurez-vous que votre écouteur de test ne pointe pas déjà vers le groupe cible vert avant d'exécuter le déploiement bleu/vert.

Important : n'utilisez pas l'API UpdateService pour annuler le déploiement bleu/vert. Utilisez plutôt l'API CreateDeployment. Pour annuler un déploiement, utilisez l'API de StopDeployment.