AWS CloudFormationを「コード」として極める:SREが現場で守るべき「保守性の極致」
多くのエンジニアがCloudFormation (CFn) を「ただの宣言的設定ファイル」だと思っている。だが、それは大きな間違いだ。CFnは、クラウドのインフラを「冪等性が保証された、堅牢なソフトウェア」として記述するための言語である。
今回は、単なる構文解説で終わらせない。数千行のスタックを毎日触るSREの視点から、開発スピードと品質を両立させる「実戦的テンプレート設計術」を伝授する。
—
1. 構造の神髄:メンテナンス性を殺さないセクション設計
CFnのテンプレートは「書く」のではなく「構造化」するものだ。以下の構成を徹底せよ。
- `Metadata`: ここを疎かにするな。`AWS::CloudFormation::Interface`を使って、コンソール上でのパラメータ順序やグループ化を制御せよ。
- `Parameters`: 環境依存値(環境名、VPC IDなど)のみに絞る。ここにリソースの仕様を書くのはアンチパターンだ。
- `Mappings`: 条件分岐の複雑さを回避する最強の武器。リージョンや環境ごとのAMI IDなどをここに集約せよ。
- `Resources`: 「論理ID(Logical ID)の命名規則」をチームで統一せよ。`WebInstance`, `DatabaseSubnet` のように役割を明示すること。
—
2. 組み込み関数:コードの「再利用性」を最大化する
頻出する関数は、単なる機能ではなく「依存関係の記述」である。
- `Ref`: 最も単純だが、パラメータやリソースの論理IDを渡すと「物理ID」を返す。
- `Fn::GetAtt`: リソースの属性(例: `Instance.PublicIp`)を抽出する。依存関係を暗黙的に記述できるため、`DependsOn`を多用する前に、まずはこれでリソース間の繋がりを表現せよ。
- `Fn::Sub`: 文字列埋め込みの決定版。`Fn::Join`は使うな。可読性が地に落ちる。
推奨: Fn::Subを用いた動的な命名
SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub “SG for ${EnvironmentName} Application”
VpcId: !Ref VpcId
—
3. 現場を救う「神プラグイン」と開発加速テクニック
VS Codeを使っているなら、以下の環境構築は必須だ。
必須プラグイン
- [CloudFormation Linter (cfn-lint)](https://github.com/aws-cloudformation/cfn-lint): CI/CDのパイプラインに組み込むのは当然だが、ローカルのVS Codeで「保存時にチェック」するように設定せよ。これだけでデプロイ失敗によるタイムロスを9割削減できる。
- YAML (Red Hat): スキーマ補完が強力。`!Ref`などのCFn固有のタグを無視して警告を出さないよう、設定ファイルの`yaml.customTags`に追記するのを忘れるな。
設定の秘訣:.vscode/settings.json
{
“yaml.customTags”: [
“!Ref”,
“!Sub”,
“!GetAtt”,
“!FindInMap”,
“!Select”,
“!Join”,
“!Equals”,
“!If”
],
“editor.formatOnSave”: true
}
—
4. プロのベストプラクティス:冪等性を守る設計思想
① 「スタック分割」は小さく始めろ
1つのスタックに全てを詰め込むのは「肥大化したモノリス」を作るのと同じだ。VPC、ネットワーク、DB、アプリケーションと、ライフサイクルが異なるリソースごとにStackを分け、`Fn::ImportValue`で疎結合に連携させる。
② 冪等性(Idempotency)を意識する
テンプレートは「何度実行しても同じ結果になる」ことが大前提だ。
- ハードコードを排除せよ: 特定のAZ IDなどは書かず、`Fn::GetAZs`を使え。
- 削除ポリシーを活用せよ: `DeletionPolicy: Retain`を適切に設定し、本番環境での偶発的なデータ損失を防げ。
③ チーム開発の共有化ルール
- コメントは「Why」を書け: 「何を」しているかはコードを見ればわかる。「なぜ」その構成にしたのか(例: # セキュリティ要件によりIP制限を厳格化)を記述せよ。
- Pull Requestでのレビュー: `aws cloudformation describe-change-set` をパイプラインで自動実行し、PRコメントに差分(Diff)を貼る仕組みを構築せよ。手動のGUI操作は禁止だ。
—
最後に:インフラエンジニアの矜持
CloudFormationは、単なるAWSの操作ツールではない。あなたのインフラ設計思想をコードという名の言語で記述するキャンバスだ。
読みやすく、堅牢で、変更に強いテンプレートを書くことは、チーム全体の生産性を底上げし、あなた自身の評価を最高レベルに引き上げる。今日から「動けばいい」コードを書くのはやめよう。「誰が見ても意図が伝わり、壊れることが許されない」プロのコードを追求してほしい。
さあ、エディタを開いて、次の一行を最高の設計で刻み込め。