CloudFormation と CDK によるデプロイ設計(変更セット・DeletionPolicy・StackSets・Construct)

一言まとめ

更新前は変更セットで差分を見る。置換を伴う更新のデータ保護は DeletionPolicy ではなく UpdateReplacePolicy。ドリフト検出は差分を出すだけで直さない。CDK は Stack が CloudFormation スタックに 1 対 1 で対応し、実務の主戦場は L2 コンストラクト。

作成 · 更新 · #aws#cloudformation#cdk#iac#soa-c03

調査時点: 2026-07。

CloudFormation は、テンプレートから AWS リソースをまとめて作成・更新するサービス。AWS CDK は、プログラミング言語でインフラを記述し、CloudFormation テンプレートを生成する開発キット。

基本の流れと運用機能#

テンプレート → スタック → 変更セット。運用フェーズで使う機能は 4 つ。

機能用途
変更セット(Change Sets)更新「前」に削除・置換されるリソースをプレビューし、事故を防ぐ
ドリフト検出スタック作成「後」の手動変更(テンプレートとの差分)を検出する。トラブルシューティングの起点
ネストされたスタック共通構成を部品化し、ルートスタックから呼び出して再利用する
StackSets1 テンプレートを複数アカウント・複数リージョンへ一括展開する

ドリフト検出は差分を表示するだけで、自動修復(ロールバック / 是正)はしない。解消は手動でリソースを直すかテンプレートを実態に合わせる。サポート外のリソース・プロパティは NOT_CHECKED になり、変更されていても検出をすり抜ける。

削除・更新時のデータ保護#

属性発動タイミング
DeletionPolicyスタック削除時、または更新でリソースがスタックから取り除かれるとき
UpdateReplacePolicy更新でプロパティ変更によりリソースが置換(削除 → 再作成)されるとき

DeletionPolicy だけでは置換時に作動しない。RDS / Redshift / EBS のような永続データを置換を伴う更新から守るには UpdateReplacePolicy が要る。値は Retain(孤立リソースとして残す。後で手動クリーンアップ)か Snapshot(直前にスナップショットを取ってから削除)。「データ損失を防ぎ、バックアップも自動で確保」なら UpdateReplacePolicy: Snapshot。

失敗からの脱出#

DELETE_FAILED(S3 バケットが空でない)#

CloudFormation は中身のある S3 バケットを削除できない。

  • 原則: バケットを空にしてからスタック削除を再試行する(CloudFormation で作ったものは CloudFormation で消す)
  • 緊急避難: 数百万オブジェクトやバージョニングで即座に空にできないとき、再実行時に該当リソースを「保持(Retain)」して管理対象から切り離し、スタックだけ先に消す
  • 事前対策: DeletionPolicy: Retain をバケットに付けておく

作成・更新時のエラーは自動でロールバックが走り、一世代前の正常な状態に戻る。

ROLLBACK_FAILED#

リソースの手動削除や IAM 変更でロールバック自体に失敗するとスタックがロックされる。削除(またはアップデートロールバック継続)時に原因リソースを「スキップ」して強制的に完了させ、残った不整合リソースを手動で片付ける。

よくあるデプロイ失敗の原因#

  • サブネットの IP アドレス不足によるプロビジョニング失敗
  • CloudFormation 実行ロールの IAM 権限不足

値の解決#

AMI の指定: Mappings と SSM 動的参照#

  • Mappings + !FindInMap: リージョンや環境ごとの静的な値の出し分け。AMI に使うと、公式 AMI が更新されるたびにテンプレートを書き換える運用が発生する
  • SSM パラメータの動的参照(/aws/service/ami-amazon-linux-latest/...): デプロイ時点の最新公式 AMI ID を自動で引く。テンプレートの変更が不要

機密情報の動的参照#

テンプレートに平文のパスワードを書かない。{{resolve:ssm-secure:...}} は Parameter Store の暗号化文字列、{{resolve:secretsmanager:...}} は Secrets Manager。ローテーションやランダム生成が要るなら後者。比較は アクセス制御と監査。

EC2 の初期化#

ユーザーデータの 4 原則#

  1. デフォルトでは初回起動時に 1 回だけ実行される。再起動や停止 → 起動では走らない(cloud-init の設定で毎回実行に変えられる)
  2. root 権限で実行される。sudo は不要
  3. 1 行目にシバン(#!/bin/bash)が必須。無いとテキストとして無視される
  4. 動かないときは /var/log/cloud-init-output.log(スクリプトの標準出力・標準エラー)と /var/log/cloud-init.log(cloud-init 自体のログ)を見る

cfn-init / cfn-signal / CreationPolicy の配置#

[テンプレート]
Resources > EC2 > Metadata > AWS::CloudFormation::Init # 初期化手順(パッケージ、ファイル、サービス)
Resources > EC2 > CreationPolicy # 期待するシグナル数とタイムアウト
[EC2 内(UserData)]
cfn-init -v --stack ... # Init の定義を読んで実行
cfn-signal -e $? --stack ...# 成否を CloudFormation に送る

時間内に必要数のシグナルが届かなければ CREATE_FAILED としてロールバックされる。WaitCondition / WaitConditionHandle も同じ目的の古い仕組みで、EC2 や Auto Scaling 単体の起動同期なら CreationPolicy を使う。

StackSets の 2 方式#

管理者アカウントに AWSCloudFormationStackSetAdministrationRole、ターゲットに AWSCloudFormationStackSetExecutionRole が要る。

比較セルフマネージドサービスマネージド
前提なし(個別アカウント同士)AWS Organizations の組織 / OU
IAM ロールターゲットごとに手動で用意AWS が自動作成
新規アカウント手動で追加・再デプロイ自動デプロイを有効にすれば組織に増えた瞬間に展開
用途組織外のパートナーアカウント全アカウント共通のセキュリティ監視ロールなど

パイプライン#

  • aws cloudformation deploy はローカル資材(Lambda の ZIP など)の S3 アップロードから変更セットの作成・実行までをまとめて行う
  • 本番の CodePipeline は「変更セット作成 → 手動承認 → 変更セット実行」の 3 ステージで組む。一発で実リソースを更新する構成は選ばない
  • CloudFormation を扱うツールチェーン: AWS CLI、SAM、CDK、CodePipeline

AWS CDK#

CDK はプログラミング言語(TypeScript / Python / Java / Go / C#)でインフラを定義し、最終的に CloudFormation テンプレートを出力して CloudFormation の実行基盤でデプロイする。自動ロールバック・依存関係解決・状態管理はそのまま使える。

App / Stack / Construct#

App(ルート)
└── Stack(デプロイ単位。CloudFormation スタックに 1 対 1)
└── Construct(リソースを表す部品。L1 / L2 / L3)
レベル内容例
L1CloudFormation リソースと 1 対 1。接頭辞 Cfn。全プロパティを手動定義CfnBucket
L2推奨デフォルト(セキュリティ設定)とヘルパーメソッド入りBucket、db.connections.allowDefaultPortFrom(ec2)
L3複数リソースをユースケース単位でパッケージALB + Fargate、API Gateway + Lambda

「低レベル / 高レベル」は優劣ではなく、機械の生データに近いか人間の抽象に近いかの距離。

コマンド#

コマンド役割
cdk synthコードを CloudFormation テンプレートに合成する。AWS には触らない
cdk bootstrapデプロイ前にアセット用 S3 バケットや IAM ロールを環境ごとに 1 回作る。「バケットがない」エラーの解決策
cdk deploy合成したテンプレートをデプロイする
cdk migrate --stack-name <既存スタック>既存の CloudFormation スタックから L1 コードを自動生成し、リソースを壊さず CDK 管理に移す

依存関係#

  • 暗黙的: オブジェクトを引数で渡す(new Instance(..., { vpc }))と CDK が DependsOn を自動生成する。クロススタック参照の Export / ImportValue も自動で仲介する
  • 明示的: データの受け渡しはないが順序を強制したいときは stackB.addDependency(stackA)

レベルの選び方と移行#

  1. 要件に完全一致する L3 があれば使う
  2. 通常は L2 を組み合わせて自作する(実務の標準。社内共通の L3 として包んでもよい)
  3. CDK 未対応のプロパティだけ L1 をエスケープハッチに使う

L3 は「おまかせ構成」に固定されるのでカスタマイズ性が低い。既存の大規模スタックは L2 で書き直さず、cdk migrate で L1 として取り込んでから段階的に L2 へリファクタリングする。既存テンプレートをファイルのまま取り込むなら CfnInclude。

デプロイ戦略#

Elastic Beanstalk のデプロイポリシー#

ポリシー特徴
All at once最速。ダウンタイムあり
Rolling追加コストなし。デプロイ中は処理能力が落ちる
Rolling with additional batch100% の能力を維持。ロールバックに時間
Immutable新環境を作って切り替え。最も安全でロールバックが即時。一時的にコスト倍

Auto Scaling の入れ替え#

新 AMI を起動テンプレートの新バージョンに指定し、インスタンスリフレッシュでローリング置換する。AMI 作成は SSM Automation か EC2 Image Builder。Systems Manager

Lambda のパッケージングと公開#

比較ZIPコンテナイメージ(ECR)
サイズ上限解凍後 250 MB10 GB
位置づけ第一候補。運用が最も軽いpandas / numpy / ML モデルで 250 MB を超える、OS 固有の依存がある、組織標準が Docker のときだけ
比較関数 URLAPI Gateway
タイムアウト最大 15 分(Lambda と同じ)29 秒(延長不可)
コスト無料(Lambda の実行料金のみ)リクエスト従量課金
認証IAM か認証なしIAM、Cognito、Lambda オーソライザー、レート制限
用途Webhook 受付、単機能、29 秒を超える同期処理認証・認可やスロットリングが要る API

API Gateway + Lambda で 504 が頻発し、29 秒が原因なら、関数 URL に切り替えるか非同期化する。

ECR#

フルマネージドのレジストリ。EC2 上に自前レジストリを立てない。ライフサイクルポリシー(「タグなしで 14 日経過」「最新 10 個以外」を自動削除)でストレージコストを抑え、イメージスキャンで既知の脆弱性を検出する。

関連#

更新履歴#

  • 2026-07-18: 初版(ローカル調査ノート)
  • 2026-10-17: Wiki へ移植、概念ページとして再構成。冒頭に定義を追加

同じトピック — AWS