【CloudFormation入門】CloudFormationでのテンプレートの書き方【第二回】

前回は、CloudFormationがどのようなサービスなのかについて紹介しました。

【CloudFormation入門】CloudFormationとは?AWS環境をコードで管理する仕組みを理解する【第一回】
AWS CloudFormationとは何かを初心者向けに解説。IaCの考え方から、Template・Stack・Resourceの関係、マネジメントコンソールとの違い、CloudFormationのメリットや注意点まで、AWS環境をコードで管理する基本をわかりやすく紹介します。

CloudFormationを使うと、AWSのリソースをマネジメントコンソールから一つずつ作成するのではなく、テンプレートファイルに設定を書いて、まとめてAWS上に構築することができます。

今回は、CloudFormationの基本を理解するために、シンプルなAWSリソースを1つ作成するテンプレートを記述してみます。

この記事では、以下の内容を扱います。

  • CloudFormation Templateの基本構造
  • YAMLとJSON
  • Resourceの定義
  • CloudFormationからAWSリソースが作られる流れ
  • マネジメントコンソールとの対応関係

CloudFormation Templateの基本構造

まずはCloudFormationで使用する「Template(テンプレート)」について見ていきます。

CloudFormationでは、AWSリソースの構成をYAMLまたはJSONで記述します。

例えば、S3バケットを1つ作成するだけなら、以下のようなテンプレートになります。

AWSTemplateFormatVersion: '2010-09-09'

Resources:
  SampleBucket:
    Type: AWS::S3::Bucket

これだけでも、CloudFormationはS3バケットを作成できます。

「たったこれだけでAWSリソースが作れるの?」と思うかもしれません。

CloudFormationでは、このテンプレートをAWSに渡すことで、テンプレートに記述された内容をもとにAWSリソースが作成されます。

Appendix

上の例は最低限の記述のため、「詳細なパラメータはどういう設定になるの?」って疑問を持たれるかもしれないです。

結論としては、良しなに設定してくれるというものにになります。

気になる人は下記記事で詳細に解説しているので見てみてください。

【CloudFormation入門編】CloudFormation Templateで値を省略した場合はどうなる?【第二回_別紙】
CloudFormation Templateで値を省略した場合について解説しています。

Templateの基本的な構成

CloudFormationのテンプレートには、いくつかのセクションがあります。

代表的なものとして、以下があります。

AWSTemplateFormatVersion: '2010-09-09'

Description: Sample CloudFormation Template

Parameters:
  Environment:
    Type: String
    Default: dev

Resources:
  SampleBucket:
    Type: AWS::S3::Bucket

Outputs:
  BucketName:
    Value: !Ref SampleBucket

それぞれの役割は以下の通りです。

セクション役割
AWSTemplateFormatVersionテンプレートの形式を指定
Descriptionテンプレートの説明
ParametersStack作成時に指定できる値
Resources作成するAWSリソース
Outputs作成したリソースの情報を出力

ただし、すべてのセクションが必須というわけではありません。

CloudFormationで特に重要なのが、

Resources:

です。

CloudFormationでAWSリソースを作成する場合、基本的にはこのResourcesにリソースを定義します。


YAMLとJSON

CloudFormationのテンプレートは、YAMLまたはJSONで記述できます。

例えば、先ほどのS3バケットをJSONで書くと以下のようになります。

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "SampleBucket": {
      "Type": "AWS::S3::Bucket"
    }
  }
}

YAMLの場合は、

AWSTemplateFormatVersion: '2010-09-09'

Resources:
  SampleBucket:
    Type: AWS::S3::Bucket

となります。

どちらでも同じCloudFormationテンプレートとして扱うことができます。

個人的には、インデントによって構造が分かりやすく、記述量も少ないため、YAMLのほうがCloudFormationでは扱いやすいと感じます。

以降はYAMLを使って説明します。


Resourceの定義

CloudFormationで最も重要なのがResourcesです。

ここに「どのAWSリソースを作るのか」を定義します。

例えばS3バケットなら、

Resources:
  SampleBucket:
    Type: AWS::S3::Bucket

となります。

ポイントは以下の部分です。

SampleBucket:

これはCloudFormation上で使用するリソースの論理IDです。

そして、

Type: AWS::S3::Bucket

で「S3バケットを作成する」と指定しています。


Resourceの論理IDとType

CloudFormationでは、リソースを以下のような形で定義します。

Resources:
  LogicalResourceId:
    Type: AWS::ServiceName::ResourceType

今回の場合は、

Resources:
  SampleBucket:
    Type: AWS::S3::Bucket

なので、

  • SampleBucket → 論理ID
  • AWS::S3::Bucket → リソースタイプ

という関係です。

AWSにはS3以外にも、EC2、VPC、Lambda、DynamoDBなど、さまざまなリソースがあります。

例えばLambda関数なら、

Type: AWS::Lambda::Function

EC2なら、

Type: AWS::EC2::Instance

VPCなら、

Type: AWS::EC2::VPC

のように指定します。

このように、CloudFormationでは「AWS上に何を作るのか」をコードとして定義できます。


実際にStackを作ってみる

それでは、実際にCloudFormationからS3バケットを作ってみます。

今回は以下のシンプルなテンプレートを使用します。

AWSTemplateFormatVersion: '2010-09-09'

Description: Sample CloudFormation Template

Resources:
  SampleBucket:
    Type: AWS::S3::Bucket

このファイルを例えば、

template.yaml

という名前で保存します。


AWSマネジメントコンソールを開く

AWSマネジメントコンソールからCloudFormationを開きます。

CloudFormationの画面から、

「スタックの作成」

を選択します。

すると、テンプレートの指定方法を選択する画面が表示されます。

今回は、作成したtemplate.yamlをアップロードします。

テンプレートをアップロードしたら、Stackの名前を指定します。

例えば、

sample-cloudformation-stack

とします。

その後、必要に応じて設定を確認し、Stackを作成します。


Stackとは?

ここで「Stack」という言葉が出てきました。

CloudFormationでは、テンプレートをもとに作成・管理されるAWSリソースのまとまりを**Stack(スタック)**と呼びます。

今回の場合、

template.yaml
      ↓
CloudFormation Stack
      ↓
S3 Bucket

という関係になります。

つまり、テンプレートそのものがS3バケットになるわけではありません。

テンプレートをもとにCloudFormationがStackを作成し、そのStackによってAWSリソースが管理されるというイメージです。


Stackが作成されるまで

Stackを作成すると、CloudFormationがテンプレートの内容を読み込みます。

今回のテンプレートには、

Resources:
  SampleBucket:
    Type: AWS::S3::Bucket

と書かれています。

そのため、CloudFormationはS3バケットを作成します。

CloudFormationのStack画面では、Stackの作成状況を確認できます。

例えば、

CREATE_IN_PROGRESS

から、

CREATE_COMPLETE

になると、Stackの作成が完了しています。

作成されたStackの「リソース」から確認すると、テンプレートに記述したS3バケットが作成されていることが分かります。


CloudFormationからAWSリソースが作られる流れ

ここまでの内容を整理すると、CloudFormationでは以下のような流れになります。

CloudFormation Template
        │
        │ Stackを作成
        ▼
CloudFormation
        │
        │ Templateを解析
        ▼
Stack
        │
        │ Resourceを作成
        ▼
AWS Resource
        │
        ▼
S3 Bucket

今回の場合は、

template.yaml
      ↓
sample-cloudformation-stack
      ↓
S3 Bucket

という関係です。

ここを理解しておくと、CloudFormationの全体像がかなり分かりやすくなります。


マネジメントコンソールとの対応関係

ここで、CloudFormationと普段使っているAWSマネジメントコンソールを比較してみます。

例えば、マネジメントコンソールからS3バケットを作る場合は、

  1. S3を開く
  2. 「バケットを作成」を選択
  3. バケット名を入力
  4. 各種設定を確認
  5. 作成

というように、画面を操作して作成します。

一方、CloudFormationの場合は、

Resources:
  SampleBucket:
    Type: AWS::S3::Bucket

と記述してStackを作成します。

つまり、

マネジメントコンソールCloudFormation
画面を操作するテンプレートを書く
設定値を入力するYAML/JSONに記述する
リソースを作成するStackを作成する
AWSリソースを管理するStackからAWSリソースを管理する

という違いがあります。

CloudFormationを使う大きなメリットの一つは、AWSの構成をコードとして残せることです。


Stackを削除してみる

では、作成したS3バケットを削除してみます。

マネジメントコンソールからS3バケットを直接作成した場合、S3の画面からバケットを削除します。

CloudFormationの場合は、基本的にStackを削除します。

Stackの画面から、

「削除」

を選択します。

すると、CloudFormationによってStackに紐づいているリソースも削除されます。

今回作成したS3バケットも、Stackの削除に伴って削除されます。

Stackを削除
    ↓
Stackが管理しているResourceを削除
    ↓
S3 Bucketが削除される

これがCloudFormationを使う上で非常に重要なポイントです。


「コードを消す」と「リソースを削除する」は違う

ここで注意したいのが、テンプレートファイルを削除しただけではAWS上のリソースは削除されないということです。

例えば、

template.yaml

をローカルPCから削除しても、すでに作成されたCloudFormation StackやS3バケットが自動的に削除されるわけではありません。

あくまで、

Template
   ↓
Stack
   ↓
Resource

という関係になっています。

そのため、不要になったAWSリソースを削除する場合は、CloudFormationのStackを削除するなど、適切な方法でリソースを削除する必要があります。


CloudFormationを使うメリット

ここまで実際に動かしてみると、CloudFormationの便利さが少し見えてきます。

例えば、同じS3バケットを何度も作成する必要がある場合、

Resources:
  SampleBucket:
    Type: AWS::S3::Bucket

というテンプレートを用意しておけば、同じ構成を再利用できます。

さらに、S3だけではなく、

VPC
 ├─ Subnet
 ├─ Route Table
 └─ Internet Gateway

EC2
 └─ Security Group

RDS

のように複数のAWSリソースをテンプレートにまとめて定義することもできます。

これによって、AWS環境を手作業で構築するのではなく、コードとして管理することができます。


まとめ

今回は、CloudFormationを実際に動かしてみました。

CloudFormationでは、AWSリソースの構成をYAMLやJSONで記述し、そのテンプレートをもとにStackを作成します。

今回の流れをまとめると、

① Templateを書く
       ↓
② CloudFormationでStackを作成
       ↓
③ TemplateのResourcesをもとに
   AWSリソースが作成される
       ↓
④ Stackを削除すると
   管理対象のリソースも削除される

という流れになります。

今回作成したテンプレートは非常にシンプルでしたが、CloudFormationでは同じ考え方でVPC、EC2、Lambda、RDSなど、さまざまなAWSリソースを定義できます。

最初は、

「AWSの画面を操作する代わりに、YAMLを書いてAWSリソースを作る」

くらいのイメージで問題ありません。

次回以降は、ParametersやOutputs、Resourcesのプロパティなどを使いながら、もう少し実践的なCloudFormationテンプレートを作っていきます。

コメント

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