Open7

CloudFormationについての学習メモ

ヒロキヒロキ

このスクラップの目的

  • 自分の理解度の向上と、定着、知識の整理のため
  • 第三者へ向けて書くことで不明点が明確化するため
  • 第三者に内容の誤りや誤解を招く表現へのご指摘をいただくため

自分で書いた内容をClaudeに校正してもらってます。(マークダウンへの変換、ですます調への表現の統一など)

ヒロキヒロキ

CloudFormationとは

AWS CloudFormationは、AWSのインフラストラクチャ(VPCやEC2などのAWSリソース)をコード(テンプレート)として定義し、自動的に構築・管理できるサービスです。

俗にいうInfrastructure as Code(IaC)サービスです。

Infrastructure as Code(IaC) とは、インフラストラクチャをコードで定義し、管理する手法のことです。
従来の手動でのインフラ構築ではなく、プログラミングのようにコードを書いてインフラを構築・管理します。
従来のインフラ構築は、料理で言えば「手作業で材料を切り、味付けし、調理する」ようなものです。
一方、IaCは「レシピ(コード)を書いておけば、それに従って自動的に料理が作られる」イメージです。

CloudFormation自体の利用には追加料金は発生せず、作成したAWSリソースの料金のみが発生します。

CloudFormationを使用する主なメリット

自動化による効率化: 手作業による構築作業を自動化でき、作業時間を大幅に短縮できます。

一貫性の確保: 手作業によるオペレーションミスを排除し、常に同じ構成でインフラを構築できます。

バージョン管理: インフラの構成をコードとして管理できるため、変更履歴の追跡や、複数環境での展開が容易になります。

柔軟な更新と管理: スタックの作成後も、テンプレートを更新することで簡単にリソースの追加や変更が可能です。また、変更セットを使用することで、変更内容を事前に確認することもできます。

ヒロキヒロキ

CloudFormationのテンプレートについて

インフラストラクチャの構成や設定を記載したコードをCloudFormationではテンプレートと呼びます。CloudFormationはこのテンプレートをもとにAWSリソースを自動的に構築していきます。

テンプレートの形式としては、JSONまたはYAML形式での記載が可能です。一般的には、より記述がシンプルで可読性の高いYAML形式が使用されます。

テンプレートの記載イメージ(YAML)

# テンプレートのバージョン(現在は2010-09-09のみ有効)
AWSTemplateFormatVersion: '2010-09-09'

# テンプレートの説明
Description: 'シンプルなVPCを作成するテンプレート'

# リソースの定義(VPCの作成)
Resources:
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: my-simple-vpc

# 作成したリソースの情報を出力
Outputs:
  VpcId:
    Description: 作成したVPCのID
    Value: !Ref MyVPC
ヒロキヒロキ

実際にまずは動かしてみましょう

ひとまず実際に動かしてみるとイメージがつきやすいです。以下の手順で、シンプルなVPCを自動構築してみましょう。

まずは「テンプレートの記載イメージ(YAML)」の内容でYAMLファイルを作成します。テキストエディタにコードをコピペし、sample.ymlのような名前で保存してください。

なお、このサンプルコードはVPCのみを作成するので、記事執筆時点(2024/12/17)では料金は発生しない認識です(試される方は自己責任でお願いします)。

それでは実際に構築を行っていきましょう:

  1. AWSマネジメントコンソールからCloudFormationのサービス画面へ移動し、「スタックの作成」をクリックします。

CloudFormationのスタック作成ボタン

  1. テンプレートのアップロード画面では、①「テンプレートの準備完了」→②「テンプレートファイルのアップロード」→③「ファイルの選択」の順でクリックし、作成したYAMLファイルをアップロードします。アップロードが完了したら「次へ」をクリックしましょう。

テンプレートのアップロード手順

  1. スタックの詳細を指定する画面では、スタック名を入力します。スタック名は任意の名前で構いません。入力後、「次へ」をクリックします。

スタック名の設定画面

  1. スタックオプションの設定ページは、今回は特に変更する必要はありません。そのまま「次へ」をクリックしてください。

スタックオプションの設定画面

  1. 最後に設定内容の確認を行います。問題がなければ「送信」をクリックします。

設定内容の確認画面

クリック後、CloudFormationによってAWSリソース(VPC)の自動構築が始まります。進捗状況は画面で確認することができます。

スタックの作成状況

構築が完了したら、実際にVPCのコンソール画面に移動してみましょう。テンプレートで指定した設定のVPCが1つ作成されていることが確認できるはずです。

作成されたVPCの確認画面

このように、CloudFormationを使用することで、コード(テンプレート)からAWSリソースを自動的に作成することができます。手作業での構築と比べ、作業時間の短縮や設定ミスの防止につながります。

ヒロキヒロキ

改めてCloudFormationの基本的な動きを確認してみましょう

CloudFormationの基本的な流れを示す図
公式資料より引用 https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_CloudFormation-1_0731_v1.pdf

CloudFormationによる自動構築は、大きく分けて3つのステップで進んでいきます:

  1. まず、「設計図」となるテンプレートを作成します。このテンプレートには、どのようなAWSリソースを作成し、それぞれにどんな設定を行うのかを記述します。先ほどのサンプルでは、VPCの作成とその基本設定を記述しました。

  2. 次に、作成したテンプレートをCloudFormationにアップロードします。CloudFormationはこのテンプレートを読み込み、何を作成すべきか解析します。これは、設計図を見て作業内容を理解する工程のようなものです。

  3. 最後に、CloudFormationが実際のAWSリソースの構築を行います。テンプレートの内容に従って、自動的に必要なリソースを作成していきます。

このプロセスを通じて作成されたリソースの集合体を「スタック」と呼びます。スタックは、関連するリソースをまとめて管理するための単位となります。

先ほどのサンプルでは、VPCを1つだけ作成したので、そのVPCのみを含む小さなスタックができました。実際の業務では、より多くのリソースを含むスタックを作ることが一般的です。例えば、VPCに加えて、サブネット、インターネットゲートウェイ、EC2インスタンスなども含めた環境全体を1つのスタックとして管理することができます。

このように、CloudFormationを使うことで、複数のAWSリソースをまとめて作成・管理することができ、インフラストラクチャ全体を効率的に運用することが可能になります。

ヒロキヒロキ

スタックの作成、更新、削除について

CloudFormationでは、スタック(AWSリソースの集合体)の管理として、作成・更新・削除の操作を行うことができます。それぞれの特徴を見ていきましょう。

作成(Create)

スタックの作成は、テンプレートに基づいて自動的に実行されます。CloudFormationが賢く依存関係を判断し、適切な順序でリソースを作成していきます。例えば、VPCを作成してからその中にサブネットを作るといった具合です。

先ほどのVPCの作成では、問題も発生せず正しく動作しました。
もし作成中にエラーが発生した場合は、自動的にロールバックが実行され、すでに作成されたリソースは削除されます。これにより、中途半端な状態を防ぐことができます。

更新(Update)

スタックの更新では、既存の環境に対して安全に変更を適用できます。更新前に「変更セット」という機能で、変更内容とその影響を事前に確認できるため、意図しない変更を防ぐことができます。

更新の種類には以下の3つがあります:

  1. リソースを停止せずに設定を変更(例:タグの変更)
  2. 一時的な停止が必要な変更(例:EC2のインスタンスタイプ変更)
  3. リソースの再作成が必要な変更(例:VPCのCIDR範囲の変更)

削除(Delete)

スタックの削除では、関連するすべてのリソースを一括で削除します。リソース間の依存関係を考慮し、作成時と逆の順序で安全に削除を行います。

重要なデータを持つリソース(例:データベース)については、削除前にスナップショットを作成するように設定することもできます。

これらの操作はすべてAWSマネジメントコンソールから実行でき、操作の進行状況をリアルタイムに確認することができます。このように、CloudFormationを使用することで、インフラ全体のライフサイクルを効率的に管理することが可能になります。

ヒロキヒロキ

テンプレートについて

テンプレートを書く前の前提知識

では早速CloudFormationのテンプレートにフォーカスして、説明していきます。
CloudFormationテンプレートはJSON,もしくはYAML形式で記載することができます。
私の主観ですが絶対にYAMLで書いたほうが良いと思っているので、この記事ではYAMLを使用して進めていきます。

まずCloudFormationのテンプレートには10個のセクションがあります。

順序 セクション名 説明 必須
1 AWSTemplateFormatVersion テンプレートのバージョン No
2 Description テンプレートの説明文 No
3 Metadata テンプレートに関する追加情報 No
4 Parameters 実行時にユーザ入力を求めるパラメータ No
5 Rules スタックの作成または更新前に入力されたパラメータを検証 No
6 Mappings 条件パラメータ値の指定に使用 No
7 Conditions リソースが作成または設定される条件を登録 No
8 Transform 変換および拡張処理の呼出しに使用 No
9 Resources スタックを構成するリソースを定義 Yes
10 Outputs スタック構築後に出力させる値(DNS名やIPアドレスなど) No

さてここで注目してほしいセクションは9番目のResourcesのみです。
10個のセクションがCloudFormationテンプレートでは用意されていますが、記載が必須なのはResourcesのみで、それ以外は便利なサブ機能や補足情報を書いていくようなセクションです。

なのでResourcesのみに最初はフォーカスしましょう。
Resourcesセクションでは、CloudFormationを使用して構築したいAWSリソース(VPCとかEC2など)や設定を記載していきます。

実際のテンプレートコードを見てみる

まずは実際のコードを見てみましょう。
本記事ではわかりやすいようにVPCのみを作成していきます。
以下はVPCのみを作成するシンプルなテンプレートです。

Resources:
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: MyVPC

ここかはドキュメントを見つつ、補足説明を加えながらこのテンプレートのコードについて説明していきます。

もう少し細かい単位で見て行きましょう。
まずはResourcesを記載します。

Resources:

インデントを空け、Resourcesセクションの中身を記載していきます。
Resourcesセクションの直下には論理IDを記載します。
この論理IDとは、リソースひとつひとつに対してつける名前みたいなものです。
例えばEC2インスタンスを複数台構築する際に、この論理IDで各インスタンスを区別することができます。論理IDはテンプレート内で重複しなければ好きな名前をつけることができます。

ここではMyVPCという論理ID名で記載します。

Resources:
  MyVPC:

続いて論理IDの中身を記載していきます。
論理ID直下には二つの項目を記載します。

  • Type:
  • Properties:

Typeでは作成したいリソースの種類を記載します。

Type: AWS::ServiceName::ResourceType

上記のような形式で記載します。
このリソース識別子に関してはドキュメントから確認して引っ張ってくるのが一番良いです。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html

#S3バケットを作成したい場合の例
Type: AWS::S3::Bucket

PropertiesではTypeで指定したリソースの設定を記載していきます。
プロパティには必須の項目とオプションの項目があります。
どのプロパティが必須かは公式ドキュメントに記載があります。