AWS Certified Developer - Associate (DVA-C02) #10 Domain 3-2 デプロイ — IaC とサーバーレスデプロイ
#9 CI/CD でビルド・デプロイツールを整理したので、今回は インフラそのものをコードで定義する IaC (Infrastructure as Code) です。コンソールで手作業で作ったインフラは再現・バージョン管理が困難です。AWS の IaC の軸は CloudFormation であり、その上にサーバーレス専用の SAM、そしてプラットフォーム抽象化である Elastic Beanstalk があります。
CloudFormation #
宣言的テンプレート (YAML/JSON) で AWS リソースを定義すると、CloudFormation がそのまま作成・更新・削除します。生成されたリソースのまとまりが スタック (Stack) です。
テンプレート構造 #
| セクション | 役割 |
|---|---|
Resources | 唯一の必須セクション。作成するリソースの定義 |
Parameters | デプロイ時の入力値 (環境・インスタンスタイプなど) |
Mappings | キー・値のルックアップ (リージョン別 AMI など) |
Conditions | 条件付きリソース作成 |
Outputs | 他のスタックが参照する出力値 (export) |
Transform | マクロ・SAM の指定 |
組み込み関数もよく出ます。!Ref (参照)、!GetAtt (属性の取得)、!Sub (文字列置換)、!FindInMap (マッピング照会)、!ImportValue (他スタック出力の参照)。
スタック運用 #
- チェンジセット (Change Set) — スタックを更新する前に 何が変わるかを事前に確認 します。意図しない置き換え・削除を防ぎます。
- ドリフト検出 (Drift Detection) — コンソールで手動で変更された部分 (テンプレートとの差分) を検出します。
- ロールバック — 作成/更新の失敗時に自動的に以前の状態へ戻します。
- ネストされたスタック (Nested Stack) — 共通の構成要素を再利用可能な下位スタックに分離します。
DeletionPolicy— スタック削除時にリソースを保持 (Retain) したり、スナップショット (Snapshot) を残したりします。DB のように失ってはいけないリソースに使います。
試験の落とし穴: 「スタック更新前に影響範囲を確認」の答えは チェンジセット です。「削除しても DB は残したい」の答えは
DeletionPolicy: Retainです。
SAM — サーバーレスアプリケーションモデル #
SAM は サーバーレスデプロイを単純化した CloudFormation の拡張 です。テンプレートの先頭に Transform: AWS::Serverless-2016-10-31 を置くと SAM の短縮リソースタイプを使えます。
| SAM リソース | 対応 |
|---|---|
AWS::Serverless::Function | Lambda 関数 + ロール + イベントソース |
AWS::Serverless::Api | API Gateway |
AWS::Serverless::SimpleTable | DynamoDB テーブル |
sam build— 依存関係を含むビルド。sam deploy— CloudFormation でパッケージング・デプロイ (内部的に S3 アップロード + スタック作成)。sam local— Lambda・API を ローカルで実行・デバッグ (Docker を使用)。- SAM テンプレートはデプロイ時に通常の CloudFormation に変換されます。
核心: サーバーレスアプリ (Lambda + API Gateway + DynamoDB) を少ないコードで定義・デプロイ・ローカルテスト するなら SAM です。SAM は #11 のカナリア/線形デプロイと自動ロールバックも AutoPublishAlias・DeploymentPreference で簡単にサポートします。
Elastic Beanstalk #
コードをアップロードすると EC2・ELB・ASG・ヘルスモニタリングを自動的にプロビジョニング するプラットフォーム抽象化 (PaaS) です。開発者はインフラではなくアプリケーションに集中します。内部的には CloudFormation でリソースを作成します。
デプロイポリシー #
Beanstalk のデプロイポリシーは試験の定番です。
| ポリシー | 動作 | ダウンタイム | 追加コスト |
|---|---|---|---|
| All at once | 全体を一度に置き換え | あり | なし |
| Rolling | 一部のバッチずつ置き換え | なし (容量低下) | なし |
| Rolling with additional batch | 新しいバッチを追加しながら置き換え | なし (容量維持) | 一時的な追加インスタンス |
| Immutable | 新しいインスタンスグループにデプロイ後に切り替え | なし | 一時的に 2 倍 |
| Blue/Green (環境の入れ替え) | 新環境にデプロイ後 URL をスワップ | なし | 2 倍 |
核心の区別: 最も安全でロールバックが容易なのは Immutable/Blue-Green (新しいインスタンスにデプロイ)、最も速いがダウンタイムがあるのは All at once、容量を維持しながら段階的に置き換えるのは Rolling with additional batch です。
.ebextensions—.configファイルで環境・リソースをカスタマイズします。- Beanstalk は EC2・コンテナベースの Web アプリに適しており、純粋なサーバーレス (Lambda) には SAM がより合います。
IaC 選択クイック表 #
| 要件 | 正解 |
|---|---|
| 任意の AWS リソースをコードで | CloudFormation |
| サーバーレス (Lambda/API GW/DynamoDB) を簡潔に | SAM |
| インフラを気にせず Web アプリだけ載せる | Elastic Beanstalk |
| スタック更新の影響を事前確認 | チェンジセット |
| ローカルで Lambda をテスト | sam local |
試験の出題パターン #
- 「サーバーレスアプリを少ないコードで定義・デプロイ。」 → SAM。
- 「Lambda をローカルでデバッグ。」 →
sam local invoke。 - 「スタックを更新する前に変更影響を確認。」 → チェンジセット。
- 「スタック削除時に RDS は保持。」 →
DeletionPolicy: Retain。 - 「インフラ管理なしで Web アプリを素早くデプロイ。」 → Elastic Beanstalk。
- 「ダウンタイムなしで安全に、ロールバックを容易にデプロイ。」 → Immutable / Blue-Green。
- 「リージョン別に異なる AMI を選択。」 → Mappings +
!FindInMap。
まとめ #
この記事の要点:
- CloudFormation —
Resourcesのみ必須。チェンジセット (影響確認)・ドリフト・ネストスタック・DeletionPolicy - SAM — サーバーレス用 CFN 拡張。
sam build/deploy/local、カナリアデプロイ内蔵 - Elastic Beanstalk — PaaS。デプロイポリシー (All at once/Rolling/Immutable/Blue-Green) のトレードオフ
- 安全・ロールバック優先は Immutable/Blue-Green、速度優先は All at once
次へ — Domain 3-3 デプロイ戦略 #
ツールを整理したので、最後は 無停止デプロイ戦略そのもの です。#11 デプロイ戦略 では、in-place vs blue/green、カナリアと線形デプロイ、Lambda エイリアス・バージョンと加重ルーティング、そして CodeDeploy/SAM の自動ロールバックを整理します。