web-dev-qa-db-ja.com

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

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

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

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

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

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

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

15
Eric Hammond

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

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

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

7
djmitche

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

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

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

CloudformationはAWS自動化の基本的なレイヤーだと思うかもしれませんが、それはすべてのサービスのビザンチンAPIを組み合わせた(かなり限定された)モンスターにすぎないと思います。

2
giorgiosironi