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

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
上の例は最低限の記述のため、「詳細なパラメータはどういう設定になるの?」って疑問を持たれるかもしれないです。
結論としては、良しなに設定してくれるというものにになります。
気になる人は下記記事で詳細に解説しているので見てみてください。

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 | テンプレートの説明 |
| Parameters | Stack作成時に指定できる値 |
| 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→ 論理IDAWS::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バケットを作る場合は、
- S3を開く
- 「バケットを作成」を選択
- バケット名を入力
- 各種設定を確認
- 作成
というように、画面を操作して作成します。
一方、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テンプレートを作っていきます。
コメント