Comment puis-je réutiliser des ressources existantes dans CloudFormation?

32

J'ai un seau S3 comme ressource dans mon modèle CloudFormation. Avec DeletionPolicymis à Retain. Cela fonctionne comme prévu: lors de la suppression de la pile, il conserve effectivement le compartiment. Cependant, lorsque je tente de créer à nouveau la pile, la création échoue lors de la tentative de création du même compartiment, un message d'erreur indiquant que celui-ci existe déjà.

Que dois-je ajouter à mon modèle CloudFormation pour qu'il ne tente pas de recréer une ressource déjà existante?

Le fragment pertinent de mon modèle est le suivant:

  "Resources": {
    "SomeS3Bucket" : {
      "Type" : "AWS::S3::Bucket",
      "DeletionPolicy" : "Retain",
      "Properties": {
          "BucketName": "SomeS3Bucket"
          }
      }
vartec
la source
par intérêt, à quoi sert le seau? Peut-être y a-t-il une autre solution en fonction de ce que vous essayez de faire.
Drew Khoury

Réponses:

15

Une approche consiste à ajouter un paramètre d'entrée au modèle CloudFormation pour indiquer qu'un compartiment existant doit être utilisé.

Utilisez les clauses Condition dans le modèle pour créer le compartiment uniquement si le paramètre indique qu'il est nécessaire.

Eric Hammond
la source
4
+1 jusqu'à présent, c'est le seul moyen que j'ai vu. Je ne le marque pas comme une réponse cependant, car je cherche vraiment un moyen d'automatiser cela.
vartec
1
Sinon, il devrait y avoir un moyen: comment fonctionne "CloudFormer"?
jgomo3
7

CloudFormation utilise des balises avec le préfixe "aws:" pour garder une trace des ressources associées à quelles entrées dans quelles piles - c'est l'état "réel" qu'il utilise pour se comparer à un modèle avant de décider quoi ajouter / supprimer / mettre à jour.

En tant qu'utilisateur, vous ne pouvez pas ajouter, éditer ou supprimer de telles balises.

Donc, si vos ressources existantes ne possèdent pas ces balises, ou si elles n'ont pas les valeurs correctes pour ces balises, elles ne sont pas considérées comme faisant partie de la nouvelle pile et je ne vois pas de moyen de changer cela.

Djmitche
la source
2

J'essaie d'automatiser cela aussi, car il semble que cela ne peut pas être fait uniquement avec le modèle Cloudformation. Le processus auquel je songe:

  1. créer un autre seau temporaire temp-$originalbucketname
  2. copiez tout le contenu là-bas pour gagner du temps
  3. supprimer tout le contenu de $originalbucketname
  4. enlever $ originalbucketname maintenant qu'il est vide
  5. créer la pile Cloudformation (qui recréera le compartiment)
  6. recopier le contenu
  7. retirer temp-$originalbucketname

C'est un processus très compliqué, selon la taille du compartiment, cela peut prendre des heures car la plupart des étapes sont O (n) avec le nombre de clés.

On pourrait penser que Cloudformation est la couche de base de l’automatisation AWS, mais je pense que c’est juste un monstre (assez limité) rassemblant des API byzantines pour tous leurs services.

Giorgiosironi
la source