Comment puis-je supprimer une ressource personnalisée basée sur Lambda qui est bloquée à l’état DELETE\_FAILED ou DELETE\_IN\_PROGRESS dans CloudFormation ?

Lecture de 4 minute(s)
0

Ma ressource personnalisée basée sur Lambda est bloquée à l’état DELETE_FAILED ou DELETE_IN_PROGRESS dans CloudFormation. Je souhaite supprimer ma ressource personnalisée.

Résolution

Choisissez l'une des solutions suivantes en fonction du statut de votre ressource.

Supprimer une ressource personnalisée bloquée à l’état DELETE_FAILED

Un message d'erreur s'affiche si vous essayez de supprimer une pile contenant une ressource personnalisée basée sur Lambda qui ne dispose pas de la logique nécessaire pour gérer les requêtes de suppression. Vous pouvez également obtenir le message d'erreur suivant si votre ressource personnalisée contient une logique de suppression incorrecte : « CloudFormation did not receive a response from your Custom Resource. Please check your logs for requestId [652961ca-f24e-42e0-8f74-3f4846ba282d]. If you use the Python cfn-response module, you might need to update your Lambda function code so that CloudFormation can attach the updated version. »

Le statut de la pile passe à DELETE_FAILED, puis le message d'erreur suivant s'affiche : « Custom Resource failed to stabilize in expected time. »

Pour supprimer votre pile, procédez comme suit :

  1. Ouvrez la console CloudFormation.
  2. Choisissez la pile qui contient votre ressource personnalisée bloquée à l’état DELETE_FAILED.
  3. Sélectionnez Actions, puis Supprimer la pile.
  4. Dans la fenêtre contextuelle qui fournit la liste des ressources à conserver, choisissez la ressource personnalisée bloquée à l’état DELETE_FAILED. Puis, sélectionnez Supprimer.
  5. Sélectionnez Actions, puis Supprimer la pile.

Le statut de votre pile passe à DELETE_COMPLETE.

Remarque : Votre ressource personnalisée n'est pas une ressource physique. Il n’est donc pas nécessaire de nettoyer votre ressource personnalisée après la suppression de la pile.

Supprimer une ressource personnalisée bloquée à l’état DELETE_IN_PROGRESS

Lorsque votre pile supprime une ressource personnalisée et que celle-ci reste bloquée à l’état DELETE_IN_PROGRESS, il se peut que votre pile ne dispose pas de la logique nécessaire pour gérer les requêtes de suppression. Ou bien, votre pile peut inclure une logique de suppression incorrecte.

Pour forcer la suppression de la pile, vous devez envoyer manuellement un signal RÉUSSITE. Le signal nécessite les valeurs de ResponseURL et RequestId qui sont incluses dans l'événement envoyé de CloudFormation vers Lambda.

  1. Dans votre modèle CloudFormation, identifiez le nom de la fonction Lambda à laquelle votre ressource personnalisée envoie des requêtes. Vous pouvez trouver le nom de la fonction dans la propriété ServiceToken de la ressource AWS::CloudFormation::CustomResource ou Custom::String.

    Exemple :

    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, sélectionnez Fonctions, puis choisissez 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. Vérifiez que votre fonction Lambda enregistre les détails de l'événement dans le groupe de journaux Amazon CloudWatch appelé /aws/lambda/function_name.
    Exemple de logique :

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

    Remarque : Si votre fonction Lambda n'inclut pas la logique permettant d'imprimer l'événement dans les journaux CloudWatch, vous ne pouvez pas obtenir les valeurs de ResponseURL et RequestId. Vous devez disposer de ces valeurs pour envoyer un signal manuel. Attendez environ une heure que la pile CloudFormation arrive à expiration et passez à l'état DELETE_FAILED. Puis, suivez les étapes décrites dans la section Supprimer une ressource personnalisée bloquée à l’état DELETE_FAILED pour supprimer votre pile.

  5. Choisissez l'onglet Surveillance, puis sélectionnez Afficher les journaux dans CloudWatch.

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

    Remarque : Vous pouvez consulter les journaux CloudWatch uniquement si votre fonction a accès à Amazon CloudWatch Logs pour le streaming des journaux.

  7. Dans le dernier journal, identifiez l'événement pour lequel RequestType est défini sur Supprimer, puis copiez les valeurs de RequestId, ResponseURL, StackId, LogicalResourceId et PhysicalResourceId. Exemple :

    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"
  8. Pour envoyer un signal de réponse RÉUSSITE dans l'objet de réponse à la requête de suppression, exécutez la commande suivante dans votre interface de ligne de commande locale. Veillez à inclure les valeurs que vous avez copiées à l'étape 7.

    curl -H "Content-Type: ''" -X PUT -d "{\"Status\": \"SUCCESS\",\"PhysicalResourceId\": \"test-CloudWatchtrigger-1URTEVUHSKSKDFF\",\"StackId\": \"arn:aws:cloudformation:us-west-2:111122223333:stack/CRStack/5105e4b0-4a29-11ef-8c42-067744df1edb\",\"RequestId\": \"dca731ad-18ad-496c-8c77-459d904fd36b\",\"LogicalResourceId\": \"MyCustomResource\"}" "https://cloudformation-custom-resource-response-uswest2.s3-us-west-2.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A111122223333%3Astack/CRStack/5105e4b0-4a29-11ef-8c42-067744df1edb%7CCustomResource%7Cdca731ad-18ad-496c-8c77-459d904fd36b?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20240725T020141Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=AKIA54RCMT6SJPHCTM4H%2F20240725%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Signature=3b1567adb5ec9415526251a26bac3a6c861ac77aa090a3ada0a4a4d109a7273d"

Le statut de vos ressources personnalisées passe à DELETE_COMPLETE dans les événements de la pile CloudFormation.

Informations connexes

Créer une logique de provisionnement personnalisée avec des ressources personnalisées

AWS::CloudFormation::CustomResource

Quelles sont les bonnes pratiques pour implémenter des ressources personnalisées basées sur AWS Lambda avec AWS CloudFormation ?

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 3 mois