AWS CloudFormation の基本と実践

CloudFormationによるInfrastructure as Codeの考え方、テンプレートの構造、スタックのライフサイクル、変更管理機能を整理します。

学習順Step 87 / 89サービス自動化試験ドメイン弾力性

CloudFormationとは何か

CloudFormationは、AWSクラウド環境内のインフラリソースをテキストベースのテンプレートとして記述し、そのテンプレートに基づいてリソースを自動的にプロビジョニングするサービスです。この「インフラをコードとして管理する」考え方はInfrastructure as Code(IaC)と呼ばれます。

手動でコンソール操作を繰り返してリソースを構築する方法と比べて、CloudFormationを使うことには次のような利点があります。

  • 環境構築を正確に、かつ繰り返し再現できる
  • 開発・テスト・本番環境で同じ構成のインフラを標準化できる
  • ソフトウェアのソースコードと同様に、Gitなどでインフラ構成をバージョン管理できる
  • プロビジョニングされたリソースの変更・削除を一貫した方法で管理できる

課金の面では、CloudFormationの利用自体に追加料金はかからず、作成されたAWSリソースに対する通常の利用料金のみが発生します。

テンプレート・CloudFormation・スタックの関係

CloudFormationの処理は、次の3つの要素で構成されます。

テンプレートからスタックが作成されるまでの流れ

  • テンプレート:JSONまたはYAML形式で、作成したいリソースとそのパラメーターを記述したファイルです。
  • CloudFormation:テンプレートを読み込み、スタックの作成・更新・削除を行うサービス本体です。リソース間の依存関係を自動的に判定し、エラーが発生した場合はロールバックを実行します。
  • スタック:テンプレートから生成されたAWSリソースの集合です。スタック単位でリソースを一括管理でき、スタックを削除すると、紐づくリソースもまとめて削除されます。

テンプレートの構造

CloudFormationテンプレートは、以下のセクションで構成されます。Resourcesのみが必須で、他のセクションは必要に応じて記述します。

セクション 内容
AWSTemplateFormatVersion テンプレートの構文バージョン(例:2010-09-09
Description テンプレートの説明文
Metadata テンプレートに関する追加情報
Parameters 実行時に指定するパラメーター(キーペア名やユーザー名など)
Mappings 条件に応じたパラメーター値を指定するためのキーと値のマッピング
Conditions リソース作成時に適用する条件名と条件内容
Transform SAM(Serverless Application Model)などのマクロ変換を指定
Resources スタックに実際に生成するリソースの種類とプロパティ(必須)
Outputs スタック構築後に出力する値や、その出力先

Resourcesセクションでは、各リソースに論理名(テンプレート内で参照するための識別子)を付け、Typeでリソースの種類(例:AWS::EC2::VPC)を、Propertiesで設定内容を指定します。

リソース間の依存関係を明示したい場合はDependsOn属性を使います。また、他のリソースの値を参照する場合はRefFn::FindInMapなどの組み込み関数を利用します。例えば、あるサブネットが所属するVPCのIDを参照する場合、そのVPCリソースの論理名をRefで指定します。

以下は、VPCと2つのサブネットを作成する簡単なテンプレートの例です。

AWSTemplateFormatVersion: '2010-09-09'
Description: シンプルなVPCとサブネットの構成
Resources:
  AppVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.1.0.0/16
      Tags:
        - Key: Name
          Value: AppVPC
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref AppVPC
      CidrBlock: 10.1.1.0/24
  PrivateSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref AppVPC
      CidrBlock: 10.1.2.0/24
Outputs:
  VpcId:
    Value: !Ref AppVPC

Resources内の各サブネットがVpcId: !Ref AppVPCという形でVPCを参照しており、CloudFormationはこの参照関係から、VPCを先に作成してからサブネットを作成するという順序を自動で判定します。

CloudFormationデザイナー

テンプレートをテキストで記述する以外に、CloudFormationデザイナーというGUIツールを使って視覚的にテンプレートを作成することもできます。リソースタイプの一覧から必要なリソースをドラッグ&ドロップで配置し、リソース間の関連をつなぐことで、対応するJSON/YAMLテンプレートが自動生成されます。テンプレート構造を理解するための学習用途や、既存テンプレートの構成を視覚的に確認する用途に向いています。

テンプレート管理機能

CloudFormationは、作成済みのテンプレートやスタックをより安全に運用するための機能を提供しています。

  • 変更セット:スタックを更新する前に、その更新によってどのリソースがどう変更されるかという影響範囲を確認できる機能です。直接更新するか、変更セットを作成してから実行するかを選択できます。想定外のリソース削除や再作成を事前に防ぐのに役立ちます。
  • ドリフト検出:テンプレートによって展開したリソースが、展開後に手動などでテンプレートの定義から外れて変更された場合に、その差分を検出するチェック機能です。
  • スタックセット:単一のテンプレートを、複数のAWSアカウントや複数のリージョンに対して一括で展開できる機能です。組織全体で共通のガードレール(セキュリティ設定など)を配布する場合などに使われます。
  • スタック間のリソース参照(エクスポート/インポート):あるスタックの出力値をExportでエクスポートし、別のスタックのテンプレートからFn::ImportValueでインポートすることで、スタックをまたいでリソースを参照し、連携したインフラ展開を行うことができます。

CloudFormationの活用が向いているケース

以下のようなケースでは、CloudFormationの活用が特に効果を発揮します。

  • AWSリソースの構築作業を効率化し、手作業によるミスを減らしたい
  • 開発・テスト・本番の各環境で、同一のインフラ構成を標準化したい
  • 毎回同じリソース設定を正確に再現したい
  • インフラ構成をソフトウェアのソースコードと同様にレビュー・バージョン管理したい

なお、CloudFormationが直接サポートしていないリソースや機能を利用したい場合は、カスタムリソースを使ってスタック作成の一部に独自のロジック(Lambda関数など)を組み込むことも可能です。

重要ポイント

  • CloudFormationはテンプレートを読み込んでスタックというリソース集合を作成・管理する
  • テンプレートはResourcesが必須で、Parameters/Outputsなどのセクションを組み合わせる
  • スタックを削除すると、紐づくリソースも一括で削除される
  • 変更セットで更新の影響範囲を事前に確認できる
  • ドリフト検出でテンプレートと実際のリソースの差分を検出できる
  • スタックセットで複数アカウント・複数リージョンへ一括展開できる

このトピックの学習を完了しますか?

完了状態はいつでも切り替えられます

同じサービスの関連トピック

IaC / 環境自動化 / コンテナ に関連するトピックを続けて確認できます。