CloudFormationのDeletionPolicyオプションを比較してみた

CloudFormationのDeletionPolicyオプションを比較してみた

CloudFormation の DeletionPolicy について、Delete・Retain・Snapshot の3つのオプションを実際に試して動作を確認してみました。
2026.06.17

はじめに

こんにちは、山本 翔大です。

SOA の勉強をする中で CloudFormation の DeletionPolicy に興味を持ちました。
これまでは特に記載せず運用していたため、今回は実際にオプションで指定してみてどんな動きをするのか調べてみようと思います。

DeletionPolicy とは

DeletionPolicy は、CloudFormation スタックを削除したときや、スタック更新でテンプレートからリソースを削除したときに、対象リソースをどう扱うかを指定する属性です。

主なオプションは以下の 3 つです。

オプション 動作
Delete スタック削除時にリソースも削除する
Retain スタック削除後もリソースを残す
Snapshot 削除前にスナップショットを作成してからリソースを削除する

Delete

Delete は、スタック削除時にリソースも削除する設定です。
CloudFormation では DeletionPolicy を指定しない場合、多くのリソースはデフォルトで削除されるため、明示しなくても同じ動作になります。

Retain

Retain は、スタック削除後もリソースを残す設定です。
スタック自体は削除されますが、対象のリソースは AWS アカウント内に残ります。
残ったリソースは CloudFormation スタックの管理外になるため、不要になった場合は手動で削除する必要があります。

Snapshot

Snapshot は、削除前にスナップショットを作成してからリソースを削除する設定です。
EBS や RDS など、スナップショットに対応しているリソースで使用できます。
Snapshot を指定すると、CloudFormation は対象リソースを削除する前にスナップショットを作成します。

やってみた

Delete の確認

まずは DeletionPolicy: Delete の動作を確認します。
Delete の場合、CloudFormation スタックを削除すると、作成された EBS ボリュームも削除されます。

以下の内容で delete.yml を作成します。

AWSTemplateFormatVersion: '2010-09-09'
Description: DeletionPolicy Delete hands-on using EBS volume

Resources:
  DeleteVolume:
    Type: AWS::EC2::Volume
    DeletionPolicy: Delete
    Properties:
      AvailabilityZone: !Select [0, !GetAZs '']
      Size: 1
      VolumeType: gp3
      Tags:
        - Key: Name
          Value: cfn-deletion-policy-delete
        - Key: Project
          Value: deletion-policy-handson
        - Key: DeletionPolicy
          Value: Delete

Outputs:
  DeleteVolumeId:
    Description: EBS volume ID with DeletionPolicy Delete
    Value: !Ref DeleteVolume

作成したテンプレートを使って、CloudFormation コンソールからスタックを作成します。

  1. CloudFormation から「スタックの作成」をクリックし、「新しいリソースを使用」を選択
  2. テンプレートの指定では「テンプレートファイルのアップロード」を選び、delete.yml をアップロードして次へ進む
  3. スタック名に deletion-policy-delete-handson を入力
  4. そのまま次へ進み、内容を確認してスタックを作成する

スクリーンショット 2026-06-16 14.29.41

ステータスが CREATE_COMPLETE になれば作成完了です。

EC2 コンソールから EBS ボリュームが作成されていることを確認します。

  1. EC2 コンソールを開く
  2. 左メニューから「Elastic Block Store」配下の「ボリューム」をクリック
  3. 検索欄で cfn-deletion-policy-delete を検索

以下のような EBS ボリュームが確認できれば成功です。

項目
Name cfn-deletion-policy-delete
VolumeType gp3
Size 1 GiB
DeletionPolicy タグ Delete

スクリーンショット 2026-06-16 14.32.29

CloudFormation コンソールから deletion-policy-delete-handson を選択し、「削除」をクリックします。
スタック削除が完了するまで待ちます。

EC2 コンソールの「ボリューム」で cfn-deletion-policy-delete を検索します。
ボリュームが表示されなければ成功です。

DeletionPolicy: Delete を指定したため、スタック削除時に EBS ボリュームも削除されました。

Retain の確認

次に DeletionPolicy: Retain の動作を確認します。
Retain の場合、CloudFormation スタックを削除しても、作成された EBS ボリュームは削除されずに残ります。

以下の内容で retain.yml を作成します。

AWSTemplateFormatVersion: '2010-09-09'
Description: DeletionPolicy Retain hands-on using EBS volume

Resources:
  RetainVolume:
    Type: AWS::EC2::Volume
    DeletionPolicy: Retain
    Properties:
      AvailabilityZone: !Select [0, !GetAZs '']
      Size: 1
      VolumeType: gp3
      Tags:
        - Key: Name
          Value: cfn-deletion-policy-retain
        - Key: Project
          Value: deletion-policy-handson
        - Key: DeletionPolicy
          Value: Retain

Outputs:
  RetainVolumeId:
    Description: EBS volume ID with DeletionPolicy Retain
    Value: !Ref RetainVolume

Delete と同様の手順で、retain.yml をアップロードしてスタック名 deletion-policy-retain-handson でスタックを作成します。
作成完了後、EC2 コンソールの「ボリューム」で cfn-deletion-policy-retain が作成されていることを確認します。

確認できたら、CloudFormation コンソールからスタックを削除します。

EC2 コンソールの「ボリューム」で cfn-deletion-policy-retain を検索します。
ボリュームが表示されていれば成功です。

スクリーンショット 2026-06-17 14.26.32

DeletionPolicy: Retain を指定したため、CloudFormation スタックは削除されましたが、EBS ボリュームは残りました。

なお、Retain で残ったリソースはスタック削除後も AWS アカウント内に存在し続けます。
不要になった場合は手動で削除する必要があるためお気をつけください。

Snapshot の確認

最後に DeletionPolicy: Snapshot の動作を確認します。
Snapshot の場合、CloudFormation スタックを削除すると EBS ボリュームは削除されますが、削除前に EBS スナップショットが作成されます。

以下の内容で snapshot.yml を作成します。

AWSTemplateFormatVersion: '2010-09-09'
Description: DeletionPolicy Snapshot hands-on using EBS volume

Resources:
  SnapshotVolume:
    Type: AWS::EC2::Volume
    DeletionPolicy: Snapshot
    Properties:
      AvailabilityZone: !Select [0, !GetAZs '']
      Size: 1
      VolumeType: gp3
      Tags:
        - Key: Name
          Value: cfn-deletion-policy-snapshot
        - Key: Project
          Value: deletion-policy-handson
        - Key: DeletionPolicy
          Value: Snapshot

Outputs:
  SnapshotVolumeId:
    Description: EBS volume ID with DeletionPolicy Snapshot
    Value: !Ref SnapshotVolume

Delete と同様の手順で、snapshot.yml をアップロードしてスタック名 deletion-policy-snapshot-handson でスタックを作成します。
作成完了後、EC2 コンソールの「ボリューム」で cfn-deletion-policy-snapshot が作成されていることを確認します。

確認できたら、CloudFormation コンソールからスタックを削除します。

次に、作成されたスナップショットを確認します。

  1. EC2 コンソールを開く
  2. 左メニューから「Elastic Block Store」配下の「スナップショット」をクリック
  3. 検索欄で cfn-deletion-policy-snapshot を検索

スクリーンショット 2026-06-16 15.27.43

スナップショットが表示されれば成功です。
DeletionPolicy: Snapshot によって、EBS ボリュームの削除前にスナップショットが作成されました。

おまけ

最後におまけとしてスナップショットに対応していないサービスで Snapshot を指定するとどうなるか試してみました。
以下のテンプレートを使用して S3 をスナップショットありで作成してみます。

AWSTemplateFormatVersion: '2010-09-09'
Description: DeletionPolicy Snapshot hands-on using S3 
Resources:
  SnapshotBucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Snapshot
    Properties:
      BucketName: !Sub "cfn-deletion-policy-snapshot-${AWS::AccountId}"
      Tags:
        - Key: Name
          Value: cfn-deletion-policy-snapshot
        - Key: Project
          Value: deletion-policy-handson
        - Key: DeletionPolicy
          Value: Snapshot

Outputs:
  SnapshotBucketName:
    Description: S3 Bucket with DeletionPolicy Snapshot (NOT supported)
    Value: !Ref SnapshotBucket

スタックの作成、削除手順はこれまで同様のため省略します。
スクリーンショット 2026-06-17 13.25.43

スクリーンショット 2026-06-17 13.28.19

結果としては、スタック削除時に S3 バケットはそのまま削除されました。
スナップショットに対応していないリソースに Snapshot を指定しても、スタックの作成・削除ともにエラーは発生しません。
もちろん、スナップショットも作成されず、実質的には Delete と同じ動作になります。

エラーが出ないため意図どおりに動作しているように見えてしまうので、Snapshot を指定する際は対象のリソースがスナップショットに対応しているかを事前に確認しておくとよさそうです。(公式ドキュメントから確認可能です)

おわりに

今回は CloudFormation の DeletionPolicy を使って、スタック削除時のリソースの挙動を確認しました。
テンプレート作成時には削除まで気が回らないことが多く実質的に Delete となることが多いですが、データを持つリソースを扱う場合は RetainSnapshot を設定しておくと安心だと思います。
ぜひ用途に合わせて試してみてください。

参考資料

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。

運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。

当社は様々な職種でメンバーを募集しています。

「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

関連記事