まくろぐ
更新: / 作成:

CloudFormation とは

AWS CloudFormation を使用すると、テンプレートファイル (YAML or JSON) で定義した AWS リソース群をまとめて生成(更新)することができます。 いわゆる IaC (Infrastructure as Code) 環境を提供するものであり、Ansible や Chef を使ったことがあれば、それの AWS リソース構築用だと考えると分かりやすいです。

テンプレートから生成されるインフラ(AWS リソース群)は スタック と呼ばれ、テンプレートがあればスタックは何度でも生成することができます。 これはオブジェクト指向プログラミングにおける、クラスとインスタンスの関係に似ています。 必要のなくなったリソース群は、スタック単位でまとめて削除することができます。

CloudFormation の主な特徴は次の通りです。

  • 何度でも同じ構成でリソースをセットアップできる(他のリージョンに複製したり、一時的に使うインフラを自動生成できる)
  • テンプレートはテキストファイル (YAML/JSON) なので、GitHub などでバージョン管理することができ、PullRequest ベースのコードレビューを行える
  • 冪等性が考慮されており、テンプレートには最終的な結果だけを定義しておけばよい(構成のアップデート時に差分を意識する必要はない)

例えば、次のようなテンプレートを使用すると、S3 サービスのバケットリソースを自動で作成することができます。

template.yml
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  HelloBucket:
    Type: AWS::S3::Bucket

必須のルートプロパティは Resources だけですが、テンプレートフォーマットのバージョンを示す AWSTemplateFormatVersion は最低限指定しておくのがよいでしょう(2021年時点で、2010-09-09 が最新バージョンです)。

CloudFormation コンソールからスタックを生成する

CloudFormation マネージメントコンソール を使うと、Web サイト上でスタックを生成することができます。

/p/h7arpdj/img-001.png

CloudFormation マネージメントコンソールを使ったスタックの生成手順は以下の通りです。

  1. サイドバーから Stacks(スタック)を選択する
    • CloudFormation で管理されているスタックの一覧が表示されます。
  2. (スタックの作成)ボタンを押す
  3. テンプレートを指定する
    • S3 上に置いたファイルを指定することもできますが、ここではローカルに作成した YAML ファイルをアップロードします。そのためには、Template is ready(テンプレートの準備完了) → Upload a template file(テンプレートファイルのアップロード)を選択し、YAML ファイルを選択します。
  4. 任意のスタック名(mystack など)を入力します
    • テンプレートファイル内にパラメータ (Parameters) を定義している場合は、ここで具体的な値を入力できます。
  5. あとはそのまま進めていって、Create stack(スタックの作成)を押せば、スタックの生成処理が始まります。

スタックの一覧画面に戻ると、作成中のスタックのステータスが CREATE_IN_PROGRESS となって表示されます。 しばらくしてスタックの生成処理が完了すると、ステータスが CREATE_COMPLETE に変わります。 これで、テンプレートで定義した AWS リソース群が使用できる状態になります。

ちなみに、スタック内に作成される S3 バケットには、一意な物理 ID (Physical ID) が自動的に割り当てられるため、テンプレート内での論理 ID (Logical ID) はシンプルに保つことができます(この例では HelloBucket)。

  • Logical ID: HelloBucket(テンプレートファイル内で付けた名前)
  • Physical ID: mystack-hellobucket-npd68k1m8ut8a(CloudFormation が自動生成した ID)

AWS CLI を使ってスタックを生成する

AWS CLI のセットアップ が完了していれば、Web ブラウザを使わず、コマンドラインから CloudFormation のスタックを生成することができます。 例えば、カレントディレクトリにある template.yml を使ってスタック mystack を生成するには次のようにします。

$ aws cloudformation create-stack \
  --stack-name mystack --template-body file://template.yml

作成されたスタックの情報は次のように確認できます。

$ aws cloudformation describe-stacks --stack-name mystack

必要のないスタックは次のように削除します。

$ aws cloudformation delete-stack --stack-name mystack

関連記事

まくろぐ
サイトマップまくへのメッセージ