【CloudFormation入門】CloudFormationとは?AWS環境をコードで管理する仕組みを理解する【第一回】

この記事は下記のシリーズの第一回です。

【CloudFormation入門】CloudFormationの始め方【ロードマップ】
AWS CloudFormationをこれから学ぶ方に向けた入門ロードマップです。CloudFormationの基礎からTemplateの書き方、AWS環境の設計・構築、Stackの管理、変更・運用まで、実践的に学ぶためのステップを紹介します。

AWSを使っていると、EC2やVPC、S3、RDSなど、さまざまなAWSリソースを作成することになります。

最初のうちは、AWSマネジメントコンソールから必要な項目を入力していけば、比較的簡単に環境を構築できます。

しかし、AWS環境が複雑になってくると、次のような問題に直面します。

  • 同じ構成の環境をもう一度作りたい
  • 開発環境と本番環境で同じ構成を用意したい
  • 誰が、いつ、どの設定を変更したのか管理したい
  • AWS環境の構成をコードとして残したい
  • 手作業による設定ミスを減らしたい
  • 一度削除した環境を同じ構成で再構築したい

こうした問題を解決するためのAWSサービスが、AWS CloudFormationです。

CloudFormationを使うと、AWSリソースの構成をテンプレートとして定義し、そのテンプレートをもとにAWS環境を構築・更新・削除できます。AWS公式ドキュメントでも、CloudFormationはAWSリソースをモデル化・セットアップするサービスとして説明されています。

この記事では、CloudFormationをこれから学ぶ方に向けて、まず押さえておきたい基本的な考え方を解説します。


この記事でわかること

この記事では、CloudFormationの細かな書き方に入る前に、まずCloudFormationが何のために存在するのかを理解します。

具体的には、以下について解説します。

  • CloudFormationとは何か
  • CloudFormationで何ができるのか
  • なぜAWSをコードで管理するのか
  • Infrastructure as Code(IaC)とは何か
  • マネジメントコンソールで構築する場合との違い
  • CloudFormationの基本的な仕組み
  • Template、Stack、Resourceの関係
  • CloudFormationを使うメリット
  • CloudFormationを使う上での注意点

この記事では、まだCloudFormationの細かな構文を覚える必要はありません。

まずは、

「CloudFormationを使うと、AWS環境をどのように管理できるようになるのか?」

を理解することを目標にします。


CloudFormationとは?

CloudFormationは、AWSのインフラストラクチャをコードとして定義し、そのコードをもとにAWSリソースを構築・管理するためのサービスです。

例えば、AWS上に次のような環境を構築するとします。

                    Internet
                       │
                       ▼
                 ┌──────────┐
                 │   ALB    │
                 └────┬─────┘
                      │
                      ▼
                 ┌──────────┐
                 │   EC2    │
                 └────┬─────┘
                      │
                      ▼
                 ┌──────────┐
                 │   RDS    │
                 └──────────┘

通常であれば、AWSマネジメントコンソールなどから、それぞれのAWSリソースを作成していく必要があります。

一方、CloudFormationでは、この環境をテンプレートというファイルに定義します。

イメージとしては、

CloudFormation Template
        │
        │ 「この構成のAWS環境を作ってください」
        ▼
   CloudFormation
        │
        ├── VPC
        ├── Subnet
        ├── ALB
        ├── EC2
        └── RDS

という流れです。

CloudFormationがテンプレートに記述された内容をもとにAWSのAPIを呼び出し、必要なリソースをプロビジョニングしていきます。

つまり、CloudFormationを一言で表すなら、

AWSインフラの構成をコードで定義し、そのコードをもとにAWS環境を構築・管理する仕組み

と考えるとわかりやすいでしょう。


CloudFormationで何ができるのか?

CloudFormationでは、さまざまなAWSリソースをテンプレートに定義できます。

例えば、

  • Amazon VPC
  • Amazon EC2
  • Amazon S3
  • Amazon RDS
  • Elastic Load Balancing
  • Auto Scaling
  • IAM
  • Security Group

などです。

例えばS3バケットを作成するとします。

マネジメントコンソールから作成する代わりに、CloudFormationでは次のようなコードで定義できます。

Resources:
  MyBucket:
    Type: AWS::S3::Bucket

このTemplateを使ってStackを作成すると、CloudFormationによってS3バケットが作成されます。

もちろん、実際のTemplateではバケット名や暗号化、ライフサイクルルールなど、必要に応じてさまざまな設定を追加できます。

このように、AWSリソースの構成をコードとして記述できることがCloudFormationの大きな特徴です。


Infrastructure as Code(IaC)とは?

CloudFormationを理解するためには、**Infrastructure as Code(IaC)**という考え方を知っておく必要があります。

IaCは、日本語では一般的に、

「インフラストラクチャをコードとして管理する」

という考え方です。

例えば、AWSでWebアプリケーションを構築するとします。

従来の方法では、

AWSコンソールを開く
    ↓
VPCを作成
    ↓
Subnetを作成
    ↓
Security Groupを作成
    ↓
EC2を作成
    ↓
RDSを作成
    ↓
各種設定を行う

というように、人間が一つずつ操作していきます。

一方、IaCでは、

インフラ構成をコードで定義
          ↓
       コードを実行
          ↓
    AWS環境を構築

という形にします。

つまり、

「AWSコンソールを操作すること」から「AWS環境をコードで定義すること」へ考え方を変える

のがIaCです。

CloudFormationは、このIaCをAWSで実現するためのサービスの一つです。AWS公式ドキュメントでも、CloudFormationはインフラストラクチャをコードとして扱い、AWSリソースのモデル化・セットアップを行うものとして説明されています。


なぜAWSをコードで管理するのか?

ここで、

「AWSコンソールから作ればいいのでは?」

と思う方もいるかもしれません。

実際、AWSコンソールから環境を構築すること自体は悪いことではありません。

むしろAWSを学び始めた段階では、コンソールから操作することでAWSの各サービスを理解しやすいというメリットがあります。

問題になるのは、環境が大きくなったときです。


手作業で構築すると再現が難しい

例えば、本番環境を次のように構築したとします。

VPC
 ├─ Public Subnet × 2
 ├─ Private Subnet × 2
 ├─ Internet Gateway
 ├─ NAT Gateway
 ├─ Route Table
 ├─ Security Group
 ├─ ALB
 ├─ EC2
 └─ RDS

これをすべてAWSコンソールから手作業で構築したとします。

数週間後に、

「同じ構成の開発環境を作ってください」

と言われたらどうでしょうか。

もう一度、同じ設定を一つずつ入力する必要があります。

さらに、

  • SubnetのCIDR
  • Route Table
  • Security Group
  • IAM Role
  • EC2の設定
  • RDSの設定

などを完全に同じように設定しなければなりません。

ここで設定を一つ間違えると、最初の環境と異なる環境ができてしまいます。


コードなら同じ環境を再現できる

CloudFormationなら、AWS環境の構成をTemplateとして残せます。

             CloudFormation Template
                       │
             ┌─────────┴─────────┐
             ▼                   ▼
        Development           Production
             │                   │
             ▼                   ▼
          AWS環境              AWS環境

同じTemplateを使えば、同じ設計をベースに複数の環境を構築できます。

AWS公式ドキュメントでも、Templateを再利用することで、複数リージョンなどに一貫した繰り返し可能な方法でリソースをプロビジョニングできると説明されています。


マネジメントコンソールとCloudFormationの違い

CloudFormationを学ぶときに混乱しやすいのが、

「結局、AWSコンソールと何が違うの?」

という点です。

ざっくり比較すると、次のようになります。

マネジメントコンソールCloudFormation
構築方法画面から操作Templateを記述
インフラ構成頭やドキュメントで管理コードとして管理
再構築手作業が必要Templateから再構築
再利用手順を再現Templateを再利用
変更管理操作履歴などに依存Templateの変更として管理
自動化別途仕組みが必要Templateをもとに自動構築
複数環境手作業が増えやすい同じTemplateを利用可能

ただし、CloudFormationがマネジメントコンソールの完全な代替になるというわけではありません。

AWSの仕組みを理解したり、ちょっとした検証環境を作ったりする場合には、マネジメントコンソールが便利です。

一方で、

「AWS環境を繰り返し構築する」

「構成をコードとして管理する」

「変更内容を明確にする」

といった場面では、CloudFormationのメリットが大きくなります。


CloudFormationの基本的な仕組み

ここからは、CloudFormationを理解するうえで非常に重要な3つの言葉を覚えましょう。

Template
   │
   │ デプロイ
   ▼
 Stack
   │
   ├── Resource
   ├── Resource
   └── Resource

CloudFormationでは、基本的に、

Template → Stack → Resource

という関係で考えると理解しやすくなります。


Templateとは?

**Template(テンプレート)**は、AWS環境の設計図にあたるファイルです。

CloudFormation Templateでは、

「どのAWSリソースを、どのような設定で作るのか」

を記述します。

CloudFormation Templateは、YAMLまたはJSON形式で記述できます。AWS公式ドキュメントでは、Resources セクションが必須で、少なくとも1つのリソースを宣言する必要があるとされています。

例えば、

Resources:
  MyBucket:
    Type: AWS::S3::Bucket

というTemplateがあったとします。

これは、

「S3バケットを1つ作ってください」

というAWS環境の定義です。

Templateは、あくまで**「こういうAWS環境を作りたい」という設計図**だと考えるとわかりやすいでしょう。


Stackとは?

次に、**Stack(スタック)**です。

Stackは、CloudFormationによって管理されるAWSリソースの集合です。

AWS公式ドキュメントでは、Stackを「関連するAWSリソースを一つの単位として管理するもの」と説明しています。Stack単位でリソースの作成・更新・削除を行えます。

例えば、

Template
   │
   │
   ▼
Stack
 ├── VPC
 ├── Subnet
 ├── Security Group
 ├── EC2
 └── RDS

という関係です。

TemplateにAWS環境の構成を記述し、そのTemplateを使ってStackを作成します。

するとCloudFormationが、Templateに定義されたAWSリソースを作成します。


Resourceとは?

最後が**Resource(リソース)**です。

Resourceは、実際にCloudFormationによって作成・管理されるAWSリソースです。

例えば、

  • VPC
  • Subnet
  • S3 Bucket
  • EC2 Instance
  • RDS Database
  • IAM Role
  • Security Group

などがResourceに該当します。

Templateでは、Resources セクションの中にResourceを定義します。

例えば、

Resources:
  MyBucket:
    Type: AWS::S3::Bucket

この場合、

MyBucket
   │
   └── AWS::S3::Bucket

というResourceを定義しています。

MyBucketはCloudFormation上でResourceを識別するための論理IDで、AWS::S3::Bucketが作成するAWSリソースの種類を表しています。


Template・Stack・Resourceの関係

ここまでを整理すると、次のようになります。

┌─────────────────────────────┐
│          Template           │
│                             │
│  「どんなAWS環境を作るか」   │
│                             │
│  Resources:                 │
│   ├─ VPC                   │
│   ├─ Subnet                │
│   ├─ EC2                   │
│   └─ RDS                   │
└──────────────┬──────────────┘
               │
               │ Templateを使って
               │ Stackを作成
               ▼
┌─────────────────────────────┐
│            Stack            │
│                             │
│   AWSリソースをまとめて管理  │
│                             │
│   ├─ VPC                   │
│   ├─ Subnet                │
│   ├─ EC2                   │
│   └─ RDS                   │
└─────────────────────────────┘

もっと簡単に言うと、

Template = 設計図

Stack = 設計図から作られたAWS環境を管理する単位

Resource = Stackに含まれるAWSリソース

と覚えておけば、最初は十分です。


CloudFormationはどのようにAWS環境を作るのか?

CloudFormationを使った構築の流れを整理すると、次のようになります。

① Templateを作成
        │
        ▼
② Stackを作成
        │
        ▼
③ CloudFormationがTemplateを読み取る
        │
        ▼
④ AWSの各サービスへAPIを呼び出す
        │
        ▼
⑤ AWSリソースを作成
        │
        ▼
⑥ AWS環境が完成

例えば、Templateに、

Resources:
  MyBucket:
    Type: AWS::S3::Bucket

と書いてStackを作成すると、CloudFormationがAWS側で必要な処理を行い、S3バケットをプロビジョニングします。

CloudFormationはTemplateに記述された内容に基づいてAWSサービスへの呼び出しを行い、リソースをプロビジョニングします。


CloudFormationを使うメリット

ここまでの内容を踏まえると、CloudFormationを使うメリットは大きく4つあります。

1. AWS環境をコードとして管理できる

最大のメリットは、AWS環境の構成をコードとして残せることです。

例えば、

VPC
Subnet
Route Table
Security Group
EC2
RDS

といった構成をTemplateとして管理できます。

そのため、

「このAWS環境はどういう構成になっているのか?」

をTemplateから確認できます。


2. 同じ環境を再現できる

Templateを使えば、同じ構成を繰り返し構築できます。

例えば、

              Template
                 │
        ┌────────┼────────┐
        ▼        ▼        ▼
       Dev      Stg      Prod
        │        │        │
        ▼        ▼        ▼
      AWS環境  AWS環境  AWS環境

のように、同じ設計をベースとして複数の環境を構築できます。

もちろん、環境ごとに異なる値を設定することもできます。

この仕組みについては、後の記事でParametersなどを使いながら詳しく扱います。


3. AWS環境の変更を管理しやすい

CloudFormationでは、Templateを変更してStackを更新するという形でAWS環境を変更できます。

例えば、

InstanceType: t3.small

を、

InstanceType: t3.medium

に変更するとします。

Templateの変更内容をCloudFormationに反映することで、Stackの更新を行えます。

また、更新前に**Change Set(変更セット)**を作成し、どのような変更が行われるかを確認することもできます。AWS公式ドキュメントでも、Change Setによって変更が実行中のリソースへ与える影響を事前に確認できると説明されています。


4. 環境をまとめて管理できる

CloudFormationでは、関連するAWSリソースをStackという単位で管理できます。

例えば、

WebApplicationStack
 ├── VPC
 ├── Subnet
 ├── Security Group
 ├── ALB
 ├── EC2
 └── RDS

というStackを作れば、この環境を一つのまとまりとして管理できます。

Stack単位で作成・更新・削除を行えるため、複数のAWSリソースを個別に操作するよりも、環境全体を管理しやすくなります。


CloudFormationの注意点

ここまでCloudFormationのメリットを紹介してきましたが、CloudFormationを使えばすべてが簡単になるわけではありません。

むしろ、AWS環境が複雑になるほど、CloudFormation自体の設計が重要になります。


Templateが複雑になる

AWS環境が大きくなると、Templateも大きくなります。

例えば、

VPC
 ├─ Subnet
 ├─ Route Table
 ├─ NAT Gateway
 └─ Security Group

ALB
 ├─ Listener
 └─ Target Group

EC2
 └─ IAM Role

RDS
 └─ Security Group

のような環境をすべて一つのTemplateに書くと、非常に長いTemplateになる可能性があります。

そのため、

「どこまでを一つのStackにするか?」

「Templateをどう分割するか?」

といった設計も重要になります。

このシリーズでは、後半でStackの分割や複数環境の管理についても扱います。


CloudFormation特有の知識が必要になる

CloudFormationでは、AWSそのものの知識に加えて、

  • Template
  • Stack
  • Parameters
  • Outputs
  • Intrinsic Functions
  • Resource Dependencies
  • Change Sets
  • Drift Detection

など、CloudFormation特有の概念を理解する必要があります。

最初は覚えることが多く感じるかもしれません。

しかし、一つずつ実際のAWS環境を作りながら学んでいけば、それほど難しいものではありません。


Templateを書いたからといって、必ず安全に変更できるわけではない

CloudFormationで特に重要なのが、Templateの変更によってAWSリソースが置き換えられる場合があることです。

例えば、あるプロパティを変更した結果、既存のリソースを変更するのではなく、

既存リソース
     │
     │ 変更
     ▼
新しいリソースを作成
     │
     ▼
古いリソースを削除

という動作になる場合があります。

特にデータベースなどの重要なリソースでは注意が必要です。

そのため、CloudFormationを実際の環境で使う場合には、

「Templateを書けば安全に更新できる」

と考えるのではなく、

「Templateの変更によってAWS上で何が起きるのかを確認する」

という意識が重要です。

Change Setを利用して、変更内容を事前に確認することもできます。


CloudFormationを使うと、AWSの設計方法も変わる

CloudFormationを学ぶうえで、個人的に特に重要だと考えているのがここです。

CloudFormationは単なる、

「AWS環境を自動で作ってくれるツール」

ではありません。

CloudFormationを使うことで、AWS環境そのものを、

「コードとして設計する」

という考え方が必要になります。

例えば、これまでは、

AWSコンソールを開く
↓
必要な設定を入力する
↓
AWSリソースを作る

だったものが、

AWS環境を設計する
        ↓
構成をTemplateとして表現する
        ↓
CloudFormationでStackを作る
        ↓
AWS環境が構築される

という流れになります。

つまり、

「どうやってAWSリソースを作るか」だけではなく、「どのようなAWS環境を作るのか」を先に考える

ことが重要になります。

これは、このシリーズ全体で身につけていきたい考え方です。


まとめ

今回は、CloudFormationを学ぶ最初のステップとして、CloudFormationの基本的な考え方を紹介しました。

この記事の内容をまとめると、次のようになります。

用語意味
CloudFormationAWSインフラをコードで定義・構築・管理するサービス
IaCインフラをコードとして管理する考え方
TemplateAWS環境の構成を記述した設計図
StackAWSリソースをまとめて管理する単位
ResourceVPCやEC2、S3などのAWSリソース

そして、CloudFormationの基本的な流れは、

AWS環境を設計
      ↓
Templateを書く
      ↓
Stackを作成
      ↓
CloudFormationがAWSリソースを構築
      ↓
Templateを変更
      ↓
Stackを更新

となります。

CloudFormationを理解するうえで、まずは

Template → Stack → Resource

という関係を押さえておきましょう。

ここが理解できれば、これから学ぶCloudFormationの各機能も理解しやすくなります。


次の記事

次回は、いよいよCloudFormation Templateの書き方に入ります。

CloudFormation TemplateはYAMLまたはJSONで記述できますが、このシリーズでは基本的にYAMLを使って解説していきます。

次の記事では、実際に最小構成のTemplateを書きながら、

  • Templateの基本構造
  • Resources
  • Resourceの論理ID
  • Type
  • Properties
  • YAMLの基本的な書き方

などを解説します。

最初はできるだけシンプルなTemplateから始め、少しずつAWSリソースを追加していきます。

コメント

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