Wie kann ich vorhandene Ressourcen in CloudFormation wiederverwenden?

32

Ich habe einen S3-Bucket als Ressource in meiner CloudFormation-Vorlage. Mit DeletionPolicyeingestellt auf Retain. Dies funktioniert wie erwartet, wenn der Stapel gelöscht wird, wird der Bucket tatsächlich beibehalten. Wenn ich jedoch versuche, den Stapel erneut zu erstellen, schlägt die Erstellung fehl, während ich versuche, denselben Bucket erneut zu erstellen. Dabei wird eine Fehlermeldung angezeigt, die darauf hinweist, dass er bereits vorhanden ist.

Was muss ich zu meiner CloudFormation-Vorlage hinzufügen, damit nicht versucht wird, eine bereits vorhandene Ressource neu zu erstellen?

Relevantes Fragment meiner Vorlage ist wie folgt:

  "Resources": {
    "SomeS3Bucket" : {
      "Type" : "AWS::S3::Bucket",
      "DeletionPolicy" : "Retain",
      "Properties": {
          "BucketName": "SomeS3Bucket"
          }
      }
vartec
quelle
Aus Interesse, wozu dient der Eimer? Vielleicht gibt es einen anderen Weg, je nachdem, was Sie versuchen.
Drew Khoury

Antworten:

15

Ein Ansatz besteht darin, der CloudFormation-Vorlage einen Eingabeparameter hinzuzufügen, um anzugeben, dass ein vorhandener Bucket verwendet werden soll.

Verwenden Sie Bedingungsklauseln in der Vorlage, um den Bucket nur dann zu erstellen, wenn der Parameter angibt, dass er benötigt wird.

Eric Hammond
quelle
4
+1, soweit das der einzige Weg ist, den ich gesehen habe. Es wird jedoch nicht als Antwort markiert, da ich wirklich nach einer Möglichkeit suche, dies zu automatisieren.
Vartec
1
Es sollte einen Weg geben, wenn nicht: Wie funktioniert "CloudFormer"?
jgomo3
7

CloudFormation verwendet Tags mit dem Präfix "aws:", um zu verfolgen, welche Ressourcen mit welchen Einträgen in welchen Stapeln verknüpft sind. Dies ist der "Live" -Status, der zum Vergleichen mit einer Vorlage verwendet wird, bevor entschieden wird, was hinzugefügt / gelöscht / aktualisiert wird.

Als Benutzer können Sie solche Tags nicht hinzufügen, bearbeiten oder löschen.

Wenn Ihre vorhandenen Ressourcen diese Tags nicht haben oder nicht die richtigen Werte für diese Tags haben, werden sie nicht als Teil des neuen Stacks betrachtet, und ich sehe keine Möglichkeit, dies zu ändern.

djmitche
quelle
2

Ich versuche auch dies zu automatisieren, da es anscheinend nicht nur mit der Cloudformation-Vorlage möglich ist. Der Prozess, an den ich denke, würde:

  1. Erstellen Sie einen weiteren temporären Bucket temp-$originalbucketname
  2. Kopieren Sie den gesamten Inhalt von Bucket zu Bucket, um Zeit zu sparen
  3. Entfernen Sie den gesamten Inhalt von $originalbucketname
  4. Entfernen Sie $ originalbucketname jetzt, da es leer ist
  5. erstelle den Cloudformation-Stack (der den Bucket neu erstellt)
  6. Kopieren Sie den Inhalt zurück
  7. Löschen temp-$originalbucketname

Dies ist ein sehr aufwändiger Vorgang, der abhängig von der Eimergröße leicht Stunden dauern kann, da die meisten Schritte O (n) mit der Anzahl der Schlüssel sind.

Sie würden denken, Cloudformation ist die grundlegende Ebene der AWS-Automatisierung, aber ich denke, es ist nur ein (ziemlich begrenztes) Monster, das byzantinische APIs für alle ihre Dienste zusammenführt.

giorgiosironi
quelle