【実務・中級編】CloudFormation DeletionPolicyとRetainの使い分け:実務で本番リソースを誤削除から守る鉄則 – インフラ構成管理(IaC)活用バイブル

【SREの極意】CloudFormationの「破壊」を制御せよ:DeletionPolicyとUpdateReplacePolicyで死なないインフラを作る

インフラエンジニア諸君、今日も「破壊」と向き合っているか?
IaC(Infrastructure as Code)の最大の利点は「再現性」だが、その裏側にある最大の恐怖は「たった一行のコードで、プロダクション環境のDBを物理消去できてしまう」という脆弱性だ。

CloudFormation(CFn)は強力だ。だが、スタックを削除した瞬間にAmazon RDSやS3バケットが跡形もなく消え去るのを見て、顔面蒼白になった経験はないか?今日は、そんな悲劇を未然に防ぎ、実務の現場で「絶対に事故を起こさない」ための防衛術を伝授する。

—

1. 破壊の制御:DeletionPolicyとUpdateReplacePolicyの正解

CFnでリソースを定義する際、デフォルトの挙動は「スタック削除=リソース削除」だ。これを制御するのが `DeletionPolicy` である。

DeletionPolicyの使い分け鉄則

  • `Delete` (Default): 開発環境のEC2など、スタックと共に消えてほしいリソース用。
  • `Retain`: 本番DB、S3バケット、Elastic IP。 誤削除から守る最後の防壁。
  • `Snapshot`: RDSやRedshiftなどで使用。削除直前にバックアップを強制する。これを選択しない理由は現場にはない。

破壊的変更(Replacement)を防ぐ UpdateReplacePolicy

`UpdateReplacePolicy` は、論理IDの変更や特定のプロパティ変更で「リソースの作り直し」が発生する際、旧リソースをどう扱うかを決める。

実務の鉄則:
「ステートフルなリソース(DB等)」には、必ず `UpdateReplacePolicy: Retain` を設定せよ。これにより、設定ミスでDBが作り直される悲劇を防ぎ、手動でマイグレーションする猶予が生まれる。

RDSの鉄壁の守り
MyProductionDB:
Type: AWS::RDS::DBInstance
DeletionPolicy: Snapshot # 削除時はスナップショットを強制
UpdateReplacePolicy: Retain # 更新時の作り直しによるデータ消失を阻止
Properties:
Engine: postgres
# … 他の設定

—

2. 開発スピードを加速させる「神」環境構築

設定は理論だけでは不十分だ。速度こそがエンジニアの武器になる。

VS Code 必須プラグイン

  • [CloudFormation Linter (cfn-lint)](https://marketplace.visualstudio.com/items?itemName=kddejong.vscode-cfn-lint): 静的解析の神。コードを書くそばから「その設定はデプロイ後にエラーになるよ」と教えてくれる。これなしで書くのは目隠しで高速道路を走るようなものだ。
  • [AWS Toolkit for VS Code](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-toolkit-vscode): スタックのログ確認やテンプレートのバリデーションをIDE内で完結させる。

生産性を倍にするショートカット

  • `Ctrl + Space` (補完): cfn-lintと連携させれば、Resource Typeの指定からプロパティまで、予測変換で爆速コーディングが可能だ。

—

3. チーム開発の「コード品質」を統一するルール

チームでIaCを管理すると、必ず「誰が書いたか分からない、謎のネスト構造」が生まれる。これを防ぐための絶対ルールを共有する。

YAML構成のベストプラクティス

1. Parameters/Mappings/Resources/Outputsの順序を固定: 全員がこの順序を守るだけで、レビューの負荷は半分になる。
2. Fn::Sub の積極活用: 複雑な `Fn::Join` は捨てろ。可読性を犠牲にするな。
3. モジュール分割: 1スタック1,000行を超えたら、即座に `AWS::CloudFormation::Stack` でネストするか、CFn StackSetsへ移行する準備を始めろ。

推奨されるリソース定義の構成例
Resources:
# 1. コンポーネント単位でコメントを振る
# — Web Server Layer —
WebServerInstance:
Type: AWS::EC2::Instance
Metadata:
# プロビジョニング設定はここに集約
Properties:
# …

# 2. 破壊的変更への耐性を持たせる
AppDatabase:
Type: AWS::RDS::DBInstance
DeletionPolicy: Retain
UpdateReplacePolicy: Retain
Properties:
# …

—

最後に:なぜ「Retain」にこだわるのか

SREの仕事は「システムを動かすこと」ではない。「システムを止めず、データを失わせず、変化し続けること」だ。

CFnのコードを書く際、「これが今、削除されたらどうなるか?」を常に脳内でシミュレーションしてほしい。`DeletionPolicy: Retain` を書くことは、未来の自分や、いつかスタックを削除するオペレーターへの「詫び状」であり、最大の「慈悲」だ。

「自動化とは、人間のミスを許容するシステムを作ることである」

この精神を忘れるな。明日のデプロイが、君たちにとって安全で、かつ最高にエキサイティングなものになることを願っている。コードを書け、そして守れ。

タイトルとURLをコピーしました