Comment puis-je résoudre le problème d'une ressource personnalisée basée sur AWS Lambda bloquée dans l'état DELETE_FAILED ou DELETE_IN_PROGRESS dans AWS CloudFormation ?

Date de la dernière mise à jour : 11/11/2019

Ma ressource personnalisée est bloquée dans l'état DELETE_FAILED ou DELETE_IN_PROGRESS dans AWS CloudFormation. Comment puis-je supprimer ma ressource personnalisée ?

Brève description

Choisissez l'une des solutions suivantes :

  • Supprimer une ressource personnalisée bloquée affichant l'état DELETE_FAILED
  • Supprimer une ressource personnalisée bloquée affichant l'état DELETE_IN_PROGRESS

Résolution

Supprimer une ressource personnalisée bloquée affichant l'état DELETE_FAILED

Si votre ressource personnalisée basée sur AWS Lambda ne contient pas la logique permettant de traiter les demandes de suppression et que vous essayez de supprimer une pile. Vous obtiendrez alors le message d'erreur « Custom Resource failed to stabilize in expected time » (La ressource personnalisée n'a pas réussi à se stabiliser dans le temps attendu). En outre, la pile affiche l'état DELETE_FAILED.

Pour supprimer votre pile, procédez comme suit :

1.    Ouvrez la console AWS CloudFormation.

2.    Choisissez la pile contenant votre ressource personnalisée bloquée affichant l'état DELETE_FAILED.

3.    Choisissez Actions, puis Supprimer la pile.

4.    Dans la fenêtre contextuelle contenant une liste de ressources à conserver, choisissez la ressource personnalisée bloquée affichant l'état DELETE_FAILED. Puis, choisissez « Delete » (Supprimer).

5.    Choisissez Actions, puis Supprimer la pile.

Votre pile affiche l'état DELETE_COMPLETE.

Remarque : votre ressource personnalisée n'est pas une ressource physique, vous n'avez donc pas à la nettoyer après la suppression de la pile.

Supprimer une ressource personnalisée bloquée affichant l'état DELETE_IN_PROGRESS

Si vous ne pouvez pas supprimer une pile avec l'état DELETE_IN_PROGRESS, elle pourrait ne pas contenir la logique permettant de traiter les demandes de suppression. Pour ajouter la logique appropriée, vous devez envoyer manuellement un signal SUCCESS à AWS CloudFormation en procédant comme suit :

1.    Dans votre modèle AWS CloudFormation, identifiez le nom de la fonction Lambda à laquelle votre ressource personnalisée envoie des demandes. Vous pouvez rechercher le nom de la fonction dans la propriété ServiceToken de la ressource AWS::CloudFormation::CustomResource ou Custom::String. Consultez l'exemple suivant :

MyCustomResource: 
  Type: "Custom::PingTester"
  Properties: 
    ServiceToken:
      !Sub |
        arn:aws:lambda:us-east-1:111122223333:function:awsexamplelambdafunction

2.    Ouvrez la console Lambda.

3.    Dans le volet de navigation, choisissez Fonctions, puis sélectionnez la fonction que vous avez identifiée à l'étape 1. Par exemple, awsexamplelambdafunction est le nom de la fonction dans l'exemple de code précédent.

4.    Choisissez l'onglet Surveillance, puis cliquez sur Afficher les journaux dans CloudWatch.

5.    Dans la console Amazon CloudWatch, choisissez le dernier journal.

Remarque : vous pouvez voir les journaux CloudWatch uniquement si votre fonction a accès à Amazon CloudWatch Logs pour la transmission en continu des journaux.

6.    Dans le dernier journal, identifiez l'événement où RequestType a pour valeur Supprimer, puis copiez les valeurs pour RequestId, ResponseURL, StackId, LogicalResourceId et PhysicalResourceId. Consultez l'exemple suivant :

Received event: {
  "RequestType": "Delete",
  "ServiceToken": "arn:aws:lambda:us-east-1:111122223333:function:awsexamplelambdafunction",
  "ResponseURL": "https://cloudformation-custom-resource-response-useast1.s3.us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A111122223333%3Astack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2%7CMyCustomResource%7Ce2fc8f5c-0391-4a65-a645-7c695646739?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20170313T0212304Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=QWERTYUIOLASDFGBHNZCV%2F20190415%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=dgvg36bh23mk44nj454bjb54689bg43r8v011uerehiubrjrug5689ghg94hb",
  "StackId": "arn:aws:cloudformation:us-east-1:111122223333:stack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2",
  "RequestId": "e2fc8f5c-0391-4a65-a645-7c695646739",
  "LogicalResourceId": "MyCustomResource",
  "PhysicalResourceId": "test-MyCustomResource-1URTEVUHSKSKDFF",
  "ResourceType": "Custom::PingTester"

7.    Pour afficher la sortie du journal des événements pour l'étape 6, entrez l'appel console.log() suivant au début de votre fonction Lambda :

exports.handler = function(event, context) {
    console.log("REQUEST RECEIVED:\n" + JSON.stringify(event));
...
}

Important : la sortie précédente montre l'objet de demande qui contient ResponseURL, StackId, PhysicalResourceId, LogicalResourceId, et RequestId. Vous utiliserez cet objet de demande à l'étape 8. Cette sortie est nécessaire, car elle inclut l'URL ResponseURL pré-signée qui est générée par AWS CloudFormation avec chaque demande.

8.    Pour envoyer un signal de réponse SUCCESS dans l'objet réponse à la demande de suppression, exécutez une commande curl avec les valeurs que vous avez copiées à l'étape 6. Consultez l'exemple suivant :

$ curl -H 'Content-Type: ''' -X PUT -d '{
    "Status": "SUCCESS",
    "PhysicalResourceId": "test-CloudWatchtrigger-1URTEVUHSKSKDFF",
    "StackId": "arn:aws:cloudformation:us-east-1:111122223333:stack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2
  ",
    "RequestId": "e2fc8f5c-0391-4a65-a645-7c695646739",
    "LogicalResourceId": "CloudWatchtrigger"
  }' 'https://cloudformation-custom-resource-response-useast1.s3.us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A111122223333%3Astack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2%7CMyCustomResource%7Ce2fc8f5c-0391-4a65-a645-7c695646739?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20170313T0212304Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=QWERTYUIOLASDFGBHNZCV%2F20190415%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=dgvg36bh23mk44nj454bjb54689bg43r8v011uerehiubrjrug5689ghg94hb
  '

Vos ressources personnalisées affichent l'état DELETE_COMPLETE.