web-dev-qa-db-ja.com

CloudFormationスクリプトに特定のリソースが既に存在するかどうかを確認する方法

Cloudformationを使用して、自動スケーリングされたec2インスタンスとS3バケットを含むスタックを作成しています。 S3バケットの場合、Cloudformationスクリプトを再実行するまで、DeletionPolicyをRetainに設定します。これは正常に機能します。スクリプトは以前の実行でS3バケットを作成したため、以降の実行では、S3バケットが既に存在すると言って失敗します。もちろん、他のリソースも作成されません。私の質問は、S3バケットが最初にcloudformationスクリプト内に存在するかどうかを確認し、存在する場合はそのリソースの作成をスキップする方法です。 AWSで条件を調べましたが、すべてのパラメーターに基づいているようで、既存のリソースからチェックする関数をまだ見つけていません。

29
alexfvolk

明示的なチェックを使用してテンプレートを動的に作成しない限り、これを行う明確な方法はありません。同じテンプレートから作成されたスタックは独立したエンティティです。バケットを含むスタックを作成し、バケットを保持したままスタックを削除してから、新しいスタック(同じ名前のスタックも含む)を作成すると、この間に接続はありません新しいスタックと、前のスタックの一部として作成されたバケット。

複数のスタックに同じS3バケットを使用する場合(一度に1つしか存在しない場合でも)、そのバケットは実際にはスタックに属しません-を使用して、別のスタックにバケットを作成する方が合理的です別のテンプレート(「出力」セクションにバケットURLを入力)し、パラメーターを使用して元のスタックから参照します。

22
bsvingen

CloudFormationテンプレートに入力パラメーターを追加するだけで、既存のバケットを使用する必要があることを示します。テンプレートを使用する時点でまだ知らない場合を除きますか?その後、新しいリソースを追加するか、パラメータ値に基づいていないかを選択できます。

7
linuxfreakus

更新を行うと(潜在的にスタック内のスタック、またはネストされたスタック)、変更されていない部分は更新されません。 https://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html?icmpid=docs_cfn_console_designer

その後、前述のようにポリシーを設定して、削除を防止できます。 [ロールバックの「更新をキャンセル」権限を忘れないでください] https://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html

また、エクスポート名をスタック出力に追加することで認識できるクロススタック出力もあります。 http://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html チュートリアル... http://docs.aws.Amazon。 com/AWSCloudFormation/latest/UserGuide/walkthrough-crossstackref.html

次に、Fn :: ImportValueを使用する必要があります... http://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html

これは、ネットワークスタック名パラメーターを使用できることを意味します。

残念ながら、Conditionsで試してみると、このようなエラーが発生します。

テンプレート検証エラー:テンプレートエラー:条件でFn :: ImportValueを使用できません。

またはパラメータで?

テンプレート検証エラー:テンプレート形式エラー:すべてのデフォルトメンバーは文字列でなければなりません。

また、これは試行中に発生する可能性があります...

テンプレート形式エラー:出力ExportOutの形式が正しくありません。エクスポートの[名前]フィールドは、リソース、インポートされた値、またはFn :: GetAZに依存してはなりません。

したがって、同じファイルから既存のリソースを再度作成するのを止めることはできません。別のスタックに配置し、エクスポートインポートリファレンスを使用する場合のみ。

ただし、2つを分離すると、ImportValue関数を介した参照のおかげで、依存関係の削除を停止およびロールバックする依存関係があります。

以下に例を示します。

最初にグループテンプレートを作成する

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Metadata": {
    "AWS::CloudFormation::Designer": {
      "6927bf3d-85ec-449d-8ee1-f3e1804d78f7": {
        "size": {
          "width": 60,
          "height": 60
        },
        "position": {
          "x": -390,
          "y": 130
        },
        "z": 0,
        "embeds": []
      },
      "6fe3a2b8-16a1-4ce0-b412-4d4f87e9c54c": {
        "source": {
          "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3"
        },
        "target": {
          "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
        },
        "z": 1
      }
    }
  },
  "Resources": {
    "TestGroup": {
      "Type": "AWS::IAM::Group",
      "Properties": {},
      "Metadata": {
        "AWS::CloudFormation::Designer": {
          "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
        }
      },
      "Condition": ""
    }
  },
  "Parameters": {},
  "Outputs": {
    "GroupNameOut": {
      "Description": "The Group Name",
      "Value": {
        "Ref": "TestGroup"
      },
      "Export": {
        "Name": "Exported-GroupName"
      }
    }
  }
}

次に、グループを必要とするユーザーテンプレートを作成します。

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Metadata": {
    "AWS::CloudFormation::Designer": {
      "ac295134-9e38-4425-8d20-2c50ef0d51b3": {
        "size": {
          "width": 60,
          "height": 60
        },
        "position": {
          "x": -450,
          "y": 130
        },
        "z": 0,
        "embeds": [],
        "isrelatedto": [
          "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
        ]
      },
      "6fe3a2b8-16a1-4ce0-b412-4d4f87e9c54c": {
        "source": {
          "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3"
        },
        "target": {
          "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
        },
        "z": 1
      }
    }
  },
  "Resources": {
    "TestUser": {
      "Type": "AWS::IAM::User",
      "Properties": {
        "UserName": {
          "Ref": "UserNameParam"
        },
        "Groups": [
          {
            "Fn::ImportValue": "Exported-GroupName"
          }
        ]
      },
      "Metadata": {
        "AWS::CloudFormation::Designer": {
          "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3"
        }
      }
    }
  },
  "Parameters": {
    "UserNameParam": {
      "Default": "testerUser",
      "Description": "Username For Test",
      "Type": "String",
      "MinLength": "1",
      "MaxLength": "16",
      "AllowedPattern": "[a-zA-Z][a-zA-Z0-9]*",
      "ConstraintDescription": "must begin with a letter and contain only alphanumeric characters."
    }
  },
  "Outputs": {
    "UserNameOut": {
      "Description": "The User Name",
      "Value": {
        "Ref": "TestUser"
      }
    }
  }
}

あなたが取得します

Exported-GroupNameという名前のエクスポートが見つかりません。ユーザーによって要求されたロールバック。

エクスポートされたグループが見つからないユーザーを実行している場合。

次に、ネストされたスタックアプローチを使用できます。

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Metadata": {
    "AWS::CloudFormation::Designer": {
      "66470873-b2bd-4a5a-af19-5d54b11f48ef": {
        "size": {
          "width": 60,
          "height": 60
        },
        "position": {
          "x": -815,
          "y": 169
        },
        "z": 0,
        "embeds": []
      },
      "ed1de011-f1bb-4788-b63e-dcf5494d10d1": {
        "size": {
          "width": 60,
          "height": 60
        },
        "position": {
          "x": -710,
          "y": 170
        },
        "z": 0,
        "dependson": [
          "66470873-b2bd-4a5a-af19-5d54b11f48ef"
        ]
      },
      "c978f2d9-3fb2-4420-b255-74941f10a28a": {
        "source": {
          "id": "ed1de011-f1bb-4788-b63e-dcf5494d10d1"
        },
        "target": {
          "id": "66470873-b2bd-4a5a-af19-5d54b11f48ef"
        },
        "z": 1
      }
    }
  },
  "Resources": {
    "GroupStack": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "TemplateURL": "https://s3-us-west-2.amazonaws.com/cf-templates-x-TestGroup.json"
      },
      "Metadata": {
        "AWS::CloudFormation::Designer": {
          "id": "66470873-b2bd-4a5a-af19-5d54b11f48ef"
        }
      }
    },
    "UserStack": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "TemplateURL": "https://s3-us-west-2.amazonaws.com/cf-templates-x-TestUserFindsGroup.json"
      },
      "Metadata": {
        "AWS::CloudFormation::Designer": {
          "id": "ed1de011-f1bb-4788-b63e-dcf5494d10d1"
        }
      },
      "DependsOn": [
        "GroupStack"
      ]
    }
  }
}

残念ながら、この例ではMultiStackによって作成されたユーザースタックを削除できますが、削除ポリシーなどを使用すると役立ちます。

次に、作成するさまざまなスタックを更新するだけで、たとえばバケットを再利用する場合はマルチスタックを実行しません。

それ以外の場合は、さまざまなフレーバーのAPIとスクリプトを見ることになります。

0
Master James