Comment permettre à mon service Amazon ECS de se stabiliser dans AWS CloudFormation ?

Date de la dernière mise à jour : 09/09/2020

Mon service Amazon Elastic Container Service (Amazon ECS) ne parvient pas à se stabiliser dans AWS CloudFormation. J'obtiens l'erreur « Service arn:aws:ecs:us-east-accountID:service/ServiceName did not stabilize » (Le service arn:aws:ecs:us-east-accountID:service/ServiceName ne s'est pas stabilisé).

Brève description

Un service créé dans Amazon ECS ne parvient pas à stabiliser s'il se trouve dans l'état spécifié par le modèle AWS CloudFormation. Pour vérifier que le service a lancé le nombre souhaité de tâches avec la définition de tâche souhaitée AWS CloudFormation exécute des appels API DescribeService répétés. Ces appels vérifient le statut du service jusqu'à ce que l'état souhaité soit atteint. Le processus appelant peut prendre jusqu'à trois heures. Ensuite, AWS CloudFormation expire et renvoie le message « Service ARN did not stabilize » (Le nom ARN du service ne s'est pas stabilisé). Même si AWS CloudFormation vérifie le statut du service, la pile qui contient le service reste dans l'état CREATE_IN_PROGRESS ou UPDATE_IN_PROGRESS et ne peut pas être mise à jour.

Si vous ne pouvez pas résoudre le problème sous-jacent associé aux tâches de service Amazon ECS et que vous ne souhaitez pas attendre que les appels API DescribeService expirent, vous pouvez forcer manuellement l'état CREATE_COMPLETE de la ressource de service Amazon ECS dans AWS CloudFormation. Pour ce faire, définissez manuellement 0 (zéro) pour le nombre souhaité du service dans la console Amazon ECS pour arrêter les tâches en cours. Ainsi, AWS CloudFormation considère que la mise à jour a abouti, car le nombre de tâches est égal au nombre souhaité, à sa savoir zéro.

Important : il est recommandé de ne pas forcer AWS CloudFormation à définir l'état CREATE_COMPLETE pour les services de production, car toutes les tâches sont arrêtées, et cela peut entraîner une interruption en production.

Solution

Vérifier la création de ressource

1.    Dans votre modèle AWS CloudFormation, créez une ressource AWS::ECS::Service. Par exemple :

Resources:           
ECSServiceA:
 Type: AWS::ECS::Service
Properties:
  DesiredCount: 1
  Cluster: awsExampleECSCluster
  LaunchType: EC2
  ServiceName: "MyNginxService2"
  TaskDefinition: NginxTask:1

2.    Ouvrez la console AWS CloudFormation, puis sélectionnez votre pile.

3.    Choisissez l'onglet Events (Événements), puis vérifiez que votre ressource est en cours de création.

Mettre à jour le nombre souhaité du service

Vous pouvez rétablir le nom de services d’origine en utilisant l'interface de ligne de commande AWS (CLI AWS) ou la console Amazon ECS.

Depuis l'interface de ligne de commande AWS :

1.    Pour décrire le service et répertorier les événements du service, exécutez la commande suivante :

aws ecs describe-services --cluster awsExampleECSCluster --services MyNginxService2

2.    Pour mettre à jour le nombre souhaité du service, exécutez la commande suivante :

aws ecs update-service --cluster awsExampleECSCluster --service MyNginxService2 --desired-count 0

3.    Remplacez --desired-count par votre valeur d'origine.

Dans la console Amazon ECS :

1.    Ouvrez la console Amazon ECS.

2.    Dans le volet de navigation, choisissez Clusters, puis sélectionnez le cluster qui contient le service ECS que vous avez créé.

3.    Choisissez l'onglet Events (Événements), puis Update (Mettre à jour).

4.    Pour Number of tasks (Nombre de tâches), saisissez 0.

Le service atteint maintenant un état stable et fait passer la ressource du service Amazon ECS dans AWS CloudFormation à l'état CREATE_COMPLETE ou UPDATE_COMPLETE.

5.    Pour Number of tasks (Nombre de tâches), saisissez votre valeur d'origine.

Remarque : pour que votre pile AWS CloudFormation se synchronise avec les propriétés du service Amazon ECS après avoir émis les tâches sous-jacentes, vous devez rétablir manuellement la valeur d'origine du nombre souhaité conformément au modèle.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?