CloudFormationで既存のリソースを再利用するにはどうすればよいですか?


32

CloudFormationテンプレートにリソースとしてS3バケットがあります。にDeletionPolicy設定しRetainます。これは期待どおりに機能します。スタックを削除すると、実際にバケットが保持されます。ただし、スタックを再度作成しようとすると、同じバケットを再度作成しようとすると作成が失敗し、既に存在するというエラーメッセージが表示されます。

既に存在するリソースを再作成しないようにするために、CloudFormationテンプレートに何を追加する必要がありますか?

テンプレートの関連するフラグメントは次のとおりです。

  "Resources": {
    "SomeS3Bucket" : {
      "Type" : "AWS::S3::Bucket",
      "DeletionPolicy" : "Retain",
      "Properties": {
          "BucketName": "SomeS3Bucket"
          }
      }

興味のないこと、バケットは何に使用されますか?たぶんあなたがやろうとしていることに応じて、それを回避する別の方法があります。
ドリューコーリー14

回答:


15

1つの方法は、入力パラメーターをCloudFormationテンプレートに追加して、既存のバケットを使用する必要があることを示すことです。

パラメータが必要であることを示している場合にのみ、テンプレートで条件句を使用してバケットを作成します。


4
これまでのところ、これは私が見た唯一の方法です。しかし、それを自動化する方法を本当に検討しているので、答えとしてマークしません。
バルテック

1
そうでない場合、方法があるはずです:「CloudFormer」はどのように機能しますか?
jgomo3

7

CloudFormationは、「aws:」プレフィックスを持つタグを使用して、どのリソースがどのスタックのどのエントリに関連付けられているかを追跡します。これは、追加/削除/更新の対象を決定する前にテンプレートと比較するために使用する「ライブ」状態です。

ユーザーとして、このようなタグを追加、編集、または削除することはできません。

したがって、既存のリソースにこれらのタグがない場合、またはそれらのタグの正しい値がない場合、それらは新しいスタックの一部とは見なされず、変更する方法がわかりません。


2

Cloudformationテンプレートだけではできないように思えるので、これも自動化しようとしています。私が考えているプロセスは:

  1. 別の一時バケットを作成します temp-$originalbucketname
  2. すべてのコンテンツをバケット間でコピーして時間を節約します
  3. からすべてのコンテンツを削除します $originalbucketname
  4. 空になったので$ originalbucketnameを削除します
  5. Cloudformationスタックを作成します(これにより、バケットが再作成されます)
  6. コンテンツをコピーして戻す
  7. 取り除く temp-$originalbucketname

これは非常に複雑なプロセスです。バケットのサイズによっては、ほとんどのステップがキーの数でO(n)であるため、簡単に数時間かかる場合があります。

CloudformationはAWSオートメーションの基本的なレイヤーだと思うでしょうが、それはすべてのサービスのためにビザンチンAPIをまとめている(かなり限定的な)モンスターだと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.