AWS CloudFormation スタックを削除したときにリソースの一部を保持する方法を教えてください。

最終更新日: 2019 年 7 月 8 日

新規または既存の AWS CloudFormation スタックを削除したいのですが、スタックのリソースをすべて削除したくはありません。いくつかのリソースをスタックに保持する方法を教えてください。

簡単な説明

スタックを削除するときに特定のリソースを維持するには、AWS CloudFormation テンプレートの DeletionPolicy 属性を使用します。

スタックを削除するときは、保持スナップショット、または削除の各ポリシーオプションを指定します。

  • 保持オプションは、スタックが削除された場合でもリソースを保持します。
  • スナップショットオプションは、リソースが削除される前にそのリソースのスナップショットを作成します。
    注: このオプションは、スナップショットをサポートするリソースにのみ使用可能です。
  • 削除オプションは、スタックとともにリソースを削除します。
    注: DeletionPolicy を設定しない場合、このオプションがデフォルトの結果になります。

解決方法

次の手順では、AWS CloudFormation スタックの削除中にセキュリティグループが削除されないように保持ポリシーを使用する方法を示します。

AWS CloudFormation テンプレートで DeletionPolicy 属性を指定する

AWS CloudFormation テンプレートで、スタックの削除時に保持したいリソースの DeletionPolicy として保持を入力します。次の JSON および YAML テンプレートスニペットの例では、セキュリティグループに保持ポリシーが指定されています。

JSON:

{
  "Description": "AWS CloudFormation DeletionPolicy demo",
  "Resources": {
    "SGroup1": {
      "Type": "AWS::EC2::SecurityGroup",
      "DeletionPolicy": "Retain",
      "Properties": {
        "GroupDescription": "EC2 Instance access"
      }
    },
    "SGroup2": {
      "Type": "AWS::EC2::SecurityGroup",
      "DeletionPolicy": "Retain",
      "Properties": {
        "GroupDescription": "EC2 Instance access"
      }
    },
    "SGroup1Ingress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "DeletionPolicy": "Retain",
      "Properties": {
        "GroupName": {
          "Ref": "SGroup1"
        },
        "IpProtocol": "tcp",
        "ToPort": "80",
        "FromPort": "80",
        "CidrIp": "0.0.0.0/0"
      }
    },
    "SGroup2Ingress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "DeletionPolicy": "Retain",
      "Properties": {
        "GroupName": {
          "Ref": "SGroup2"
        },
        "IpProtocol": "tcp",
        "ToPort": "80",
        "FromPort": "80",
        "CidrIp": "0.0.0.0/0"
      }
    }
  }
}

YAML:

Description: AWS CloudFormation DeletionPolicy demo
Resources:
  SGroup1:
    Type: 'AWS::EC2::SecurityGroup'
    DeletionPolicy: Retain
    Properties:
      GroupDescription: EC2 Instance access
  SGroup2:
    Type: 'AWS::EC2::SecurityGroup'
    DeletionPolicy: Retain
    Properties:
      GroupDescription: EC2 Instance access
  SGroup1Ingress:
    Type: 'AWS::EC2::SecurityGroupIngress'
    DeletionPolicy: Retain
    Properties:
      GroupName: !Ref SGroup1
      IpProtocol: tcp
      ToPort: '80'
      FromPort: '80'
      CidrIp: 0.0.0.0/0
  SGroup2Ingress:
    Type: 'AWS::EC2::SecurityGroupIngress'
    DeletionPolicy: Retain
    Properties:
      GroupName: !Ref SGroup2
      IpProtocol: tcp
      ToPort: '80'
      FromPort: '80'
      CidrIp: 0.0.0.0/0

更新した AWS CloudFormation テンプレートをアップロードする

  1. [AWS CloudFormation コンソール] を開きます。
  2. [スタックの作成] を選択します。
  3. テンプレートの選択では、[テンプレートを Amazon S3 にアップロードする] を選択してから、削除ポリシーを含めるように変更した AWS CloudFormation テンプレートを選択します。
  4. [次へ] を選択します。
  5. [スタック名] には、スタックの名前を入力してから [次へ] を選択します。
  6. [オプション] ページで、スタックに適したオプションを選択してから、[次へ] を選択します。
  7. [作成] を選択します。

DeletionPolicy 属性をテストする

  1. AWS CloudFormation スタックします
  2. スタックの削除が完了した後も、保持ポリシーを持つリソースがまだ使用可能であることを確認してください。

この解決策のテンプレートスニペットの例では、AWS CloudFormation スタックを削除した後に次の手順に従って保持ポリシーが成功したことを確認できます。

  1. [Amazon EC2 コンソール] を開きます。
  2. ナビゲーションウィンドウの [ネットワークとセキュリティ] セクションで、[セキュリティグループ] を選択します。
  3. 保持ポリシーを持つセキュリティグループがまだ使用可能であることを確認します。