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

最終更新日: 2022 年 3 月 24 日

新規または既存の AWS CloudFormation スタックを削除したいのですが、スタックのリソースを一部残したいと思います。リソースの一部を保持したまま、スタックを削除するにはどうすればよいですか?

簡単な説明

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

スタックを削除する前に、保持するリソースごとに [Retain] (保持)、[Snapshot] (スナップショット)、または [Delete] (削除) ポリシーオプションを指定します。

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

解決方法

次の手順は、DeletionPolicy[Retain] (保持) オプションを使用して、CloudFormation スタックの削除中にリソースが削除されないようにする方法を示しています。

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

CloudFormation テンプレートで、保持したいリソースの DeletionPolicy として [Retain] (保持) を指定します。次の JSON および YAML テンプレートの例では、AWS::EC2::SecurityGroup リソースに [Retain] (保持) ポリシーが指定されています。

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

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

  1. AWS CloudFormation コンソールを開きます。
  2. 新しいスタックの場合は、[Create Stack] (スタックの作成) を選択します。既存のスタックの場合は、更新するスタックを選択し、[Update Stack] (スタックの更新) を選択します。
  3. [Choose a template] (テンプレートの選択) では、[Upload a template to Amazon S3] (テンプレートを Simple Storage Service (Amazon S3) にアップロードする) を選択してから、削除ポリシーを含めるように変更した AWS CloudFormation テンプレートを選択します。
  4. [Next] (次へ) を選択します。
  5. 新しいスタックを作成する場合は、[Stack name] (スタック名) にスタックの名前を入力し、[Next] (次へ) を選択します。
  6. [Options] (オプション) ページで、スタックに適したオプションを選択してから、[Next] (Next) を選択します。
  7. [Create] (作成) をクリックします。

DeletionPolicy 属性をテストする

  1. AWS CloudFormation スタックを削除します
  2. スタックの削除が完了した後も、DeletionPolicy[Retain] (保持) ポリシーを持つリソースがまだ使用可能であることを確認してください。AWS マネジメントコンソールまたは AWS CLI を使用することで、それぞれのサービスのリソースを確認できます。

例えば、CloudFormation スタックを削除した後、次の手順を使用して、前述のテンプレートの保持ポリシーが正常に機能したことを確認できます。

  1. Amazon EC2 コンソールを開きます。
  2. ナビゲーションペインの [Network & Security] (ネットワークとセキュリティ) セクションで、[Security Groups] (セキュリティグループ) を選択します。
  3. 保持ポリシーが添付されたセキュリティグループがまだ使用可能であることを確認します。