Comment résoudre l'erreur « Cannot update a stack when a custom-named resource requires replacing » (Impossible de mettre à jour une pile lorsqu'une ressource dotée d'un nom personnalisé doit être remplacée) dans AWS CloudFormation ?

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

Lorsque j'essaie de mettre à jour une pile dans AWS CloudFormation, je reçois un message d'erreur semblable à celui-ci : « Cannot update a stack when a custom-named resource requires replacing. Rename 'MYResourceXXX' and update the stack again. » (Impossible de mettre à jour une pile lorsqu'une ressource dotée d'un nom personnalisé doit être remplacée. Renommez « MYResourceXXX » et réessayez de mettre à jour la pile). Comment résoudre cette erreur ?

Brève description

Cette erreur se produit généralement lorsque la mise à jour d'une pile nécessite de remplacer des ressources pour lesquelles des noms personnalisés sont indiqués dans les propriétés. AWS CloudFormation ne peut pas remplacer les ressources qui possèdent un nom personnalisé à moins que vous ne changiez celui-ci. Pour empêcher tout problème dans vos piles et éviter de recevoir ce message d'erreur, modifiez le nom de chaque ressource dotée d'un nom personnalisé avant de mettre une pile à jour.

La bonne résolution du problème implique que :

  • vous mettiez à jour une pile existante et ne tentiez pas de créer une pile ;
  • vous modifiiez le nom des ressources existantes avec un nom personnalisé sans en créer de nouvelles.

Solution

1.    Dans un éditeur de code, ouvrez le modèle AWS CloudFormation correspondant à la pile que vous souhaitez mettre à jour.

2.    Changez les noms ou valeurs de toutes les propriétés de ressources qui indiquent des noms personnalisés.

Remarque : Dans l'exemple suivant, la propriété DBInstanceIdentifier de la ressource MyRDS est définie avec le nom personnalisé PRODdb. La pile AWS CloudFormation ne pourra être mise à jour qu'une fois PRODdb remplacé par un autre nom, par exemple PRODdb1. Vous pouvez également supprimer la propriété DBInstanceIdentifier de votre modèle. Dans ce cas, AWS CloudFormation génèrera un identifiant physique unique pour l'instance DB.

"MyRDS": {
    "Type": "AWS::RDS::DBInstance",
    "Properties": {
        "DBInstanceClass": "db.m3.medium",
        "Engine": "MySQL",
        "DBInstanceIdentifier": "PRODdb",
        "AllocatedStorage": "10",
        "AutoMinorVersionUpgrade": "true",
        "BackupRetentionPeriod": "0",
    …
    …
    }
}

Important : Lorsque vous renommez une ressource dotée d'un nom personnalisé, AWS CloudFormation remplace cette dernière. Pour plus d'informations, consultez la rubrique Type de nom. Le remplacement de certaines ressources peut entraîner une perte de données sans sauvegarde appropriée. Pour plus d'informations, consultez la rubrique Remplacement.

3.    Enregistrez les modifications apportées à votre modèle AWS CloudFormation et utilisez celui-ci pour mettre à jour votre pile.