【実務・中級編】CloudFormationテンプレートの書き方完全ガイド:基本構文から組み込み関数まで – インフラ構成管理(IaC)活用バイブル

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の操作ツールではない。あなたのインフラ設計思想をコードという名の言語で記述するキャンバスだ。

読みやすく、堅牢で、変更に強いテンプレートを書くことは、チーム全体の生産性を底上げし、あなた自身の評価を最高レベルに引き上げる。今日から「動けばいい」コードを書くのはやめよう。「誰が見ても意図が伝わり、壊れることが許されない」プロのコードを追求してほしい。

さあ、エディタを開いて、次の一行を最高の設計で刻み込め。

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