【AWSサービス 基礎編】AWS CloudFormation でテンプレートからリソースを作成する

目次

概要

AWS のリソースをマネジメントコンソールから手動で作成していると、手順の抜け漏れや設定ミスが起こりやすく、同じ環境を再現するのも困難です。開発環境・ステージング環境・本番環境で同じ構成を揃えたい場合や、リソースの変更履歴を管理したい場合には、手動操作では限界があります。

AWS CloudFormation は、AWS リソースの構成をテンプレート(JSON または YAML)で定義し、そのテンプレートに基づいてリソースを自動的にプロビジョニングするサービスです。テンプレートをコードとして管理することで、環境の再現性が高まり、変更の追跡も容易になります。

本記事では、CloudFormation の基本概念を理解し、YAML テンプレートを使って S3 バケットと SNS トピックを含むスタックを作成・更新・削除する一連の操作を体験します。

CloudFormation の動作概要(テンプレート → スタック → AWS リソースの流れ)を示す図解を挿入
CloudFormation の動作概要(テンプレート → スタック → AWS リソースの流れ)を示す図解を挿入

この記事のメリット

  • CloudFormation の主要概念(テンプレート、スタック、変更セット)を理解できる
  • YAML 形式のテンプレートの基本的な構造と書き方を習得できる
  • コンソールからスタックの作成・更新・削除の操作を体験できる
  • 変更セットを使ったスタック更新のプレビュー方法を把握できる
  • Infrastructure as Code(IaC)の利点を実感できる

執筆者とキャラクター紹介

執筆者:土肥(とひ)

株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。

土肥

クラウドおさる

クラウドおさる

はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。

クラウドおさる

基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。

クラウドおさる

猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。

技術解説

AWS CloudFormation とは

クラウドおさる

とひさん、AWS CloudFormation ってどういうサービスですか?

土肥

CloudFormation は、AWS リソースをコードで定義して自動的にプロビジョニングするサービスだよ。いわゆる「Infrastructure as Code(IaC)」を実現する AWS のネイティブツールなんだ。

クラウドおさる

コードで定義するっていうのは、具体的にどういうことですか?

土肥

たとえば「S3 バケットを1つ、SNS トピックを1つ作りたい」という構成を YAML や JSON のファイルに書いておくんだ。それを CloudFormation に渡すだけで、自動的にリソースが作られるよ。

クラウドおさる

手動で作るのとはどう違うんですか?

土肥

手動だと手順の抜け漏れや設定ミスが起こりやすいよね。CloudFormation を使えば、同じテンプレートから何度でも同じ環境を再現できるんだ。主なユースケースはこんな感じだよ。

  • 開発・ステージング・本番環境の統一的な構築
  • マルチリージョンへの同一構成のデプロイ
  • リソース構成のバージョン管理と変更追跡
  • 環境の一括削除(リソースの消し忘れ防止)
クラウドおさる

環境の一括削除もできるんですね。消し忘れでコストがかかる心配がなくなりそうです。

土肥

そうそう、それも大きなメリットの一つだね。

テンプレート

クラウドおさる

テンプレートにはどんなことを書くんですか?

土肥

テンプレートは JSON か YAML で書くファイルで、作成したい AWS リソースの構成を定義するものだよ。いくつかのセクションに分かれているんだ。

セクション必須説明
AWSTemplateFormatVersionいいえテンプレートのバージョン(2010-09-09 を指定)
Descriptionいいえテンプレートの説明
Parametersいいえスタック作成時に外部から渡す値の定義
Resourcesはい作成する AWS リソースの定義
Outputsいいえスタック作成後に出力する値の定義
クラウドおさる

セクションがたくさんありますけど、全部書かないといけないんですか?

土肥

いや、必須なのは Resources セクションだけだよ。最低限リソースの定義があればテンプレートとして機能するんだ。Parameters や Outputs は便利だから使うことが多いけど、なくても動くよ。

クラウドおさる

なるほど、まずは Resources だけ書けばいいんですね。

スタック

クラウドおさる

テンプレートを書いたら、次はどうするんですか?

土肥

テンプレートをもとに「スタック」を作成するよ。スタックというのは、テンプレートから作成された AWS リソースの集合のことなんだ。

クラウドおさる

テンプレートとスタックは別のものなんですか?

土肥

そうだよ。テンプレートは「設計図」で、スタックは「設計図から実際に建てた建物」みたいなイメージだね。1つのテンプレートから複数のスタックを作ることもできるよ。たとえば同じテンプレートで開発用スタックと本番用スタックを作る、なんてことができるんだ。

テンプレートとスタックの関係図(1つのテンプレートから複数のスタックを作成できる概念図)
テンプレートとスタックの関係図(1つのテンプレートから複数のスタックを作成できる概念図)
クラウドおさる

スタックを削除したらどうなりますか?

土肥

スタックを削除すると、そのスタックに含まれるリソースも一括で削除されるよ。だから、不要になった環境をまるごとクリーンアップできるんだ。

クラウドおさる

リソースを1つずつ消す必要がないんですね。便利です。

変更セット

クラウドおさる

一度作ったスタックを後から変更したい場合はどうするんですか?

土肥

テンプレートを修正してスタックを更新するんだけど、いきなり更新するのはちょっと怖いよね。そこで「変更セット」という仕組みがあるんだ。

クラウドおさる

変更セットってなんですか?

土肥

更新内容を事前にプレビューできる機能だよ。変更セットを作ると、以下の情報が確認できるんだ。

  • 追加されるリソース
  • 変更されるリソース
  • 削除されるリソース
  • リソースの置き換え(Replace)が発生するかどうか
クラウドおさる

置き換えが発生するって、リソースが一度削除されて再作成されるってことですか?

土肥

そのとおり。変更内容によってはリソースが置き換わることがあるんだ。変更セットで事前に確認してから実行すれば、意図しない変更を防げるよ。

クラウドおさる

本番環境の更新では特に大事そうですね。

ドリフト検出

クラウドおさる

CloudFormation で作ったリソースを、コンソールから手動で変更しちゃったらどうなりますか?

土肥

いい質問だね。手動で変更すると、テンプレートの定義と実際のリソース状態に差異が生じるんだ。これを「ドリフト」って呼ぶよ。

クラウドおさる

ドリフトが起きたら気づけるんですか?

土肥

CloudFormation には「ドリフト検出」機能があって、この差異を検出して一覧表示できるんだ。どのリソースのどのプロパティが変わったのかまで確認できるよ。

クラウドおさる

なるほど、テンプレートと実態のズレを見つけられるんですね。実践のほうでも試してみたいです。

新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方を募集しています。プログラミング未経験から入社して活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

前提条件

  • リージョン: ap-northeast-1(東京)
  • IAM ユーザーまたはロールに CloudFormation、S3、SNS の操作権限があること

作成するリソース一覧

リソース種別リソース名用途
CloudFormation スタックbasic-cfn-stackテンプレートから作成するスタック
S3 バケットテンプレートで定義(自動命名)サンプルリソース
SNS トピックBasicCfnTopicサンプルリソース

ステップ1: テンプレートの作成

ローカル環境で以下の内容を basic-stack.yaml というファイル名で保存します。

AWSTemplateFormatVersion: '2010-09-09'
Description: CloudFormation Basic Hands-on - S3 and SNS

Parameters:
  Environment:
    Type: String
    Default: dev
    AllowedValues:
      - dev
      - stg
      - prod
    Description: Environment name

Resources:
  SampleBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub 'basic-cfn-${Environment}-${AWS::AccountId}'
      Tags:
        - Key: Environment
          Value: !Ref Environment

  SampleTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: BasicCfnTopic
      DisplayName: Basic CloudFormation Topic
      Tags:
        - Key: Environment
          Value: !Ref Environment

Outputs:
  BucketName:
    Description: Name of the S3 bucket
    Value: !Ref SampleBucket

  BucketArn:
    Description: ARN of the S3 bucket
    Value: !GetAtt SampleBucket.Arn

  TopicArn:
    Description: ARN of the SNS topic
    Value: !Ref SampleTopic

このテンプレートのポイントを説明します。

  • Parameters: Environment パラメータで環境名を指定できるようにしています。デフォルト値は dev です
  • Resources: S3 バケットと SNS トピックの 2 つのリソースを定義しています
  • !Sub: 文字列内で変数を展開する組み込み関数です。${Environment} はパラメータの値に、${AWS::AccountId} は AWS アカウント ID に置き換わります
  • !Ref: パラメータやリソースの値を参照する組み込み関数です
  • !GetAtt: リソースの属性値を取得する組み込み関数です
  • Outputs: スタック作成後に確認したい値(バケット名、ARN など)を出力します

ステップ2: スタックの作成

  • AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します
  • 上部の検索バーに CloudFormation と入力し、表示された「CloudFormation」を選択します
  • 左側ナビゲーションの「スタック」を選択します
  • 「スタックの作成」をクリックします
  • 「テンプレートの準備」は「既存のテンプレートを選択」のままにします
  • 「テンプレートソース」で「テンプレートファイルのアップロード」を選択します
  • 「ファイルの選択」をクリックし、先ほど作成した basic-stack.yaml をアップロードします
スタック作成画面(テンプレートファイルをアップロードした状態)
スタック作成画面(テンプレートファイルをアップロードした状態)
  • 「次へ」をクリックします
  • スタックの名前に basic-cfn-stack と入力します
  • パラメータの Environment はデフォルトの dev のままにします
スタック詳細の指定画面(スタック名とパラメータの入力状態)
スタック詳細の指定画面(スタック名とパラメータの入力状態)
  • 「次へ」をクリックします
  • スタックオプションの設定はデフォルトのまま「次へ」をクリックします
  • 確認画面の内容を確認し、「送信」をクリックします
  • スタックのステータスが CREATE_IN_PROGRESS から CREATE_COMPLETE に変わるまで待ちます
スタック一覧画面(basic-cfn-stack が CREATE_COMPLETE と表示されている状態)
スタック一覧画面(basic-cfn-stack が CREATE_COMPLETE と表示されている状態)

ステップ3: 作成されたリソースの確認

  • スタック一覧から basic-cfn-stack をクリックします
  • 「リソース」タブを選択すると、テンプレートで定義した S3 バケットと SNS トピックが表示されます
スタックの「リソース」タブ(SampleBucket と SampleTopic が表示されている状態)
スタックの「リソース」タブ(SampleBucket と SampleTopic が表示されている状態)
  • 「出力」タブを選択すると、Outputs セクションで定義した値が表示されます。バケット名、バケットの ARN、トピックの ARN が確認できます
スタックの「出力」タブ(BucketName、BucketArn、TopicArn が表示されている状態)
スタックの「出力」タブ(BucketName、BucketArn、TopicArn が表示されている状態)

ステップ4: 変更セットによるスタックの更新

テンプレートに SNS サブスクリプションを追加して、変更セットを使ったスタック更新を体験します。

ローカル環境で basic-stack.yaml の Resources セクション末尾に以下を追加し、保存します。

  TopicSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      Protocol: email
      TopicArn: !Ref SampleTopic
      Endpoint: your-email@example.com

注意: Endpoint の値はご自身のメールアドレスに置き換えてください。

  • CloudFormation コンソールでスタック一覧から basic-cfn-stack を選択します
  • 「スタックアクション」→「変更セットを作成」を選択します
  • 「テンプレートの準備」で「既存のテンプレートを置換」を選択し、「テンプレートファイルのアップロード」から更新した basic-stack.yaml をアップロードします
  • 「次へ」をクリックします
  • パラメータはそのまま「次へ」をクリックします
  • 変更セットオプションもそのまま「次へ」をクリックします
  • 確認画面で「変更セットを作成」をクリックします
  • 変更セットのステータスが CREATE_COMPLETE になるまで待ちます
変更セットの詳細画面(追加される TopicSubscription リソースがプレビュー表示されている状態)
変更セットの詳細画面(追加される TopicSubscription リソースがプレビュー表示されている状態)
  • 変更セットの内容を確認し、TopicSubscription が「Add」として表示されていることを確認します
  • 「変更セットを実行」をクリックし、ダイアログでも「変更セットを実行」をクリックします
  • スタックのステータスが UPDATE_COMPLETE になれば更新完了です
スタック一覧画面(basic-cfn-stack が UPDATE_COMPLETE と表示されている状態)
スタック一覧画面(basic-cfn-stack が UPDATE_COMPLETE と表示されている状態)

ステップ5: ドリフト検出

CloudFormation で管理しているリソースを手動で変更した場合にドリフトとして検出されることを確認します。

  • まず、SNS コンソールで BasicCfnTopic の表示名を手動で変更します。上部の検索バーに SNS と入力し、「Amazon SNS」を選択します
  • 左側ナビゲーションの「トピック」を選択し、BasicCfnTopic をクリックします
  • 「編集」をクリックし、表示名を Modified Topic Name に変更して「変更の保存」をクリックします
  • CloudFormation コンソールに戻り、basic-cfn-stack を選択します
  • 「スタックアクション」→「ドリフトの検出」を選択します
  • 数秒後、「スタックアクション」→「ドリフト結果を表示」を選択します。「スタックのドリフトステータス」が DRIFTED になっていない場合は「更新」ボタンを押します
  • ドリフトステータスが DRIFTED と表示され、SampleTopic がドリフトしていることが確認できます
ドリフト結果画面(SampleTopic が MODIFIED と表示されている状態)
ドリフト結果画面(SampleTopic が MODIFIED と表示されている状態)
  • SampleTopic の行を選択して「ドリフトの詳細を表示」をクリックすると、差分の詳細が表示されます。DisplayName プロパティがテンプレートの値と異なっていることが確認できます
ドリフトの差分詳細画面(DisplayName の期待値と実際の値が表示されている状態)
ドリフトの差分詳細画面(DisplayName の期待値と実際の値が表示されている状態)

まとめ

  • AWS CloudFormation は、テンプレートで AWS リソースの構成を定義し、自動的にプロビジョニングする IaC サービスです
  • テンプレート は YAML または JSON 形式で記述し、Resources セクションでリソースを定義します。Parameters でパラメータ化、Outputs で値の出力が可能です
  • スタック はテンプレートから作成されたリソースの集合であり、スタック単位でリソースの作成・更新・削除を管理します
  • 変更セット を使うことで、スタック更新の内容を事前にプレビューし、意図しない変更を防止できます
  • ドリフト検出 により、手動変更によるテンプレートと実際のリソース状態の差異を検出できます
  • テンプレートをバージョン管理することで、環境の再現性と変更履歴の追跡性が向上します

参照先

キャリア相談
クラウドおさる

独学の先に、AWS の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方を募集しています。プログラミング未経験から入社して活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次