CloudFormation と CDK によるデプロイ設計(変更セット・DeletionPolicy・StackSets・Construct)
更新前は変更セットで差分を見る。置換を伴う更新のデータ保護は DeletionPolicy ではなく UpdateReplacePolicy。ドリフト検出は差分を出すだけで直さない。CDK は Stack が CloudFormation スタックに 1 対 1 で対応し、実務の主戦場は L2 コンストラクト。
目次 11 sections
- 01 基本の流れと運用機能
- 02 削除・更新時のデータ保護
- 03 失敗からの脱出
- DELETE_FAILED(S3 バケットが空でない)
- ROLLBACK_FAILED
- よくあるデプロイ失敗の原因
- 04 値の解決
- AMI の指定: Mappings と SSM 動的参照
- 機密情報の動的参照
- 05 EC2 の初期化
- ユーザーデータの 4 原則
- cfn-init / cfn-signal / CreationPolicy の配置
- 06 StackSets の 2 方式
- 07 パイプライン
- 08 AWS CDK
- App / Stack / Construct
- コマンド
- 依存関係
- レベルの選び方と移行
- 09 デプロイ戦略
- Elastic Beanstalk のデプロイポリシー
- Auto Scaling の入れ替え
- Lambda のパッケージングと公開
- ECR
- 10 関連
- 11 更新履歴
調査時点: 2026-07。
CloudFormation は、テンプレートから AWS リソースをまとめて作成・更新するサービス。AWS CDK は、プログラミング言語でインフラを記述し、CloudFormation テンプレートを生成する開発キット。
基本の流れと運用機能
テンプレート → スタック → 変更セット。運用フェーズで使う機能は 4 つ。
| 機能 | 用途 |
|---|---|
| 変更セット(Change Sets) | 更新「前」に削除・置換されるリソースをプレビューし、事故を防ぐ |
| ドリフト検出 | スタック作成「後」の手動変更(テンプレートとの差分)を検出する。トラブルシューティングの起点 |
| ネストされたスタック | 共通構成を部品化し、ルートスタックから呼び出して再利用する |
| StackSets | 1 テンプレートを複数アカウント・複数リージョンへ一括展開する |
ドリフト検出は差分を表示するだけで、自動修復(ロールバック / 是正)はしない。解消は手動でリソースを直すかテンプレートを実態に合わせる。サポート外のリソース・プロパティは 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 回だけ実行される。再起動や停止 → 起動では走らない(cloud-init の設定で毎回実行に変えられる)
- root 権限で実行される。
sudoは不要 - 1 行目にシバン(
#!/bin/bash)が必須。無いとテキストとして無視される - 動かないときは
/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)| レベル | 内容 | 例 |
|---|---|---|
| L1 | CloudFormation リソースと 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)
レベルの選び方と移行
- 要件に完全一致する L3 があれば使う
- 通常は L2 を組み合わせて自作する(実務の標準。社内共通の L3 として包んでもよい)
- CDK 未対応のプロパティだけ L1 をエスケープハッチに使う
L3 は「おまかせ構成」に固定されるのでカスタマイズ性が低い。既存の大規模スタックは L2 で書き直さず、cdk migrate で L1 として取り込んでから段階的に L2 へリファクタリングする。既存テンプレートをファイルのまま取り込むなら CfnInclude。
デプロイ戦略
Elastic Beanstalk のデプロイポリシー
| ポリシー | 特徴 |
|---|---|
| All at once | 最速。ダウンタイムあり |
| Rolling | 追加コストなし。デプロイ中は処理能力が落ちる |
| Rolling with additional batch | 100% の能力を維持。ロールバックに時間 |
| Immutable | 新環境を作って切り替え。最も安全でロールバックが即時。一時的にコスト倍 |
Auto Scaling の入れ替え
新 AMI を起動テンプレートの新バージョンに指定し、インスタンスリフレッシュでローリング置換する。AMI 作成は SSM Automation か EC2 Image Builder。Systems Manager
Lambda のパッケージングと公開
| 比較 | ZIP | コンテナイメージ(ECR) |
|---|---|---|
| サイズ上限 | 解凍後 250 MB | 10 GB |
| 位置づけ | 第一候補。運用が最も軽い | pandas / numpy / ML モデルで 250 MB を超える、OS 固有の依存がある、組織標準が Docker のときだけ |
| 比較 | 関数 URL | API 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
- バックアップ・DR・可用性設計の判断基準(RTO/RPO・AWS Backup・RDS/Aurora・Auto Scaling)
- CloudWatch の監視設計(メトリクス階層・アラーム・ログ分析の使い分け)
- コンテナ監視の設計(AMP / Managed Grafana / CloudWatch Observability / Fargate の制約)
- AWS コスト最適化の判断基準(購入オプション・Savings Plans・Cost Explorer・インスタンス選定)
- EventBridge と自動修復の設計パターン
- AWS のアクセス制御と監査の判断基準(IAM / SCP / KMS / CloudTrail)
- SOA-C03(AWS Certified CloudOps Engineer - Associate)の試験構成と学習の進め方
- Systems Manager の運用自動化(マネージドノード・Run Command・Automation・Patch Manager)
- VPC ネットワークとコンテンツ配信の設計判断(SG / NACL / NAT / TGW / CloudFront / Route 53)