Jak mogę ponownie wykorzystać istniejące zasoby w CloudFormation?

32

Mam wiadro S3 jako zasób w moim szablonie CloudFormation. Z DeletionPolicyustawionym na Retain. Działa to zgodnie z oczekiwaniami, podczas usuwania stosu rzeczywiście zachowuje wiadro. Jednak gdy próbuję ponownie utworzyć stos, tworzenie kończy się niepowodzeniem podczas próby ponownego utworzenia tego samego segmentu, a komunikat o błędzie informuje, że już istnieje.

Co muszę dodać do mojego szablonu CloudFormation, aby nie próbował ponownie tworzyć zasobu, który już istnieje?

Odpowiedni fragment mojego szablonu jest następujący:

  "Resources": {
    "SomeS3Bucket" : {
      "Type" : "AWS::S3::Bucket",
      "DeletionPolicy" : "Retain",
      "Properties": {
          "BucketName": "SomeS3Bucket"
          }
      }
vartec
źródło
poza zainteresowaniem, do czego służy wiadro? Może jest inny sposób, w zależności od tego, co próbujesz zrobić.
Drew Khoury,

Odpowiedzi:

15

Jednym z podejść jest dodanie parametru wejściowego do szablonu CloudFormation, aby wskazać, że należy użyć istniejącego segmentu.

Użyj klauzul Warunków w szablonie, aby utworzyć segment tylko wtedy, gdy parametr wskazuje, że jest potrzebny.

Eric Hammond
źródło
4
+1 do tej pory to jedyny sposób, jaki widziałem. Nie zaznaczam tego jednak jako odpowiedzi, ponieważ naprawdę szukam sposobu na zautomatyzowanie tego.
vartec
1
Powinien istnieć sposób, jeśli nie: Jak działa „CloudFormer”?
jgomo3
7

CloudFormation używa znaczników z przedrostkiem „aws:”, aby śledzić, jakie zasoby są powiązane z tym, jakie wpisy są powiązane w stosach - to jest stan „na żywo”, którego używa do porównania z szablonem przed podjęciem decyzji o dodaniu / usunięciu / aktualizacji.

Jako użytkownik nie możesz dodawać, edytować ani usuwać takich tagów.

Więc jeśli twoje istniejące zasoby nie mają tych znaczników lub nie mają poprawnych wartości dla tych znaczników, to nie są one uważane za część nowego stosu i nie widzę sposobu, aby to zmienić.

djmitche
źródło
2

Próbuję to również zautomatyzować, ponieważ wydaje się, że nie można tego zrobić tylko za pomocą szablonu Cloudformation. Proces, o którym myślę, powinien:

  1. utwórz kolejny tymczasowy wiadro temp-$originalbucketname
  2. skopiuj całą zawartość, aby zaoszczędzić czas
  3. usuń całą zawartość z $originalbucketname
  4. usuń $ originalbucketname teraz, gdy jest pusta
  5. utwórz stos Cloudformation (który odtworzy wiadro)
  6. skopiuj treść z powrotem
  7. usunąć temp-$originalbucketname

Jest to bardzo zaangażowany proces, w zależności od rozmiaru wiadra może to zająć wiele godzin, ponieważ większość kroków to O (n) z liczbą kluczy.

Można by pomyśleć, że Cloudformation to podstawowa warstwa automatyzacji AWS, ale myślę, że to tylko (dość ograniczony) potwór łączący bizantyjskie interfejsy API dla wszystkich swoich usług.

giorgiosironi
źródło