CloudFormationのDeletionPolicyオプションを比較してみた
はじめに
こんにちは、山本 翔大です。
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 コンソールからスタックを作成します。
- CloudFormation から「スタックの作成」をクリックし、「新しいリソースを使用」を選択
- テンプレートの指定では「テンプレートファイルのアップロード」を選び、
delete.ymlをアップロードして次へ進む - スタック名に
deletion-policy-delete-handsonを入力 - そのまま次へ進み、内容を確認してスタックを作成する

ステータスが CREATE_COMPLETE になれば作成完了です。
EC2 コンソールから EBS ボリュームが作成されていることを確認します。
- EC2 コンソールを開く
- 左メニューから「Elastic Block Store」配下の「ボリューム」をクリック
- 検索欄で
cfn-deletion-policy-deleteを検索
以下のような EBS ボリュームが確認できれば成功です。
| 項目 | 値 |
|---|---|
| Name | cfn-deletion-policy-delete |
| VolumeType | gp3 |
| Size | 1 GiB |
| DeletionPolicy タグ | Delete |

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 を検索します。
ボリュームが表示されていれば成功です。

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 コンソールからスタックを削除します。
次に、作成されたスナップショットを確認します。
- EC2 コンソールを開く
- 左メニューから「Elastic Block Store」配下の「スナップショット」をクリック
- 検索欄で
cfn-deletion-policy-snapshotを検索

スナップショットが表示されれば成功です。
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
スタックの作成、削除手順はこれまで同様のため省略します。


結果としては、スタック削除時に S3 バケットはそのまま削除されました。
スナップショットに対応していないリソースに Snapshot を指定しても、スタックの作成・削除ともにエラーは発生しません。
もちろん、スナップショットも作成されず、実質的には Delete と同じ動作になります。
エラーが出ないため意図どおりに動作しているように見えてしまうので、Snapshot を指定する際は対象のリソースがスナップショットに対応しているかを事前に確認しておくとよさそうです。(公式ドキュメントから確認可能です)
おわりに
今回は CloudFormation の DeletionPolicy を使って、スタック削除時のリソースの挙動を確認しました。
テンプレート作成時には削除まで気が回らないことが多く実質的に Delete となることが多いですが、データを持つリソースを扱う場合は Retain や Snapshot を設定しておくと安心だと思います。
ぜひ用途に合わせて試してみてください。
参考資料
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました




