CloudFormationをゼロから勉強する。（その２：デザイナーからのテンプレート作成）

# はじめに
前回は環境を整えるところで終了したので、今回は実際に手を動かしてテンプレートを作成してみたいと思います。

- 【前】[CloudFormationをゼロから勉強する。（その１：前準備）](https://qiita.com/sakai00kou/items/46e12aa5936b6d6064f2)
- 【次】[CloudFormationをゼロから勉強する。（その３：パラメータの入出力）](https://qiita.com/sakai00kou/items/fc34771fa3e150979ac8)

# テンプレート作成
AWSコンソールの`CloudFormation`の画面から`スタックの作成`ボタンをクリックして作成を進めます。

## デザイナー画面からのテンプレート作成
`スタックの作成`画面に進むと以下3つのテンプレート準備方法が表示されます。
今回はデザイナー画面から操作してみたいので、`デザイナーでテンプレートを作成`を選択して次へ進みます。

![capture_17082020_071521.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/19fd4f16-a0d6-b0aa-9d34-5bfeaab45fae.jpeg)

## 構成図作成
左ペインに表示されている`リソースタイプ`のオブジェクトを選択してドラッグ＆ドロップするだけで構成に従ったソースコードが生成されます。
以下で、実際のデザイナー画面から`VPC`と`Subnet`リソースを配置してみました。

![cf_select.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/50b18051-bcc0-26e5-83f8-05e51b824d26.gif)

見た目でどのような構成のソースコードなのかが分かりやすくて良いですね。
自作のソースコードの構成も可視化してくれるなら構成チェックにも役立ちそうです。

また、例えば`Subnet`リソースを別の`VPC`リソース上に移動した場合、連動する値も変更されるのはコーディングする際に気にしなくて済むのでうれしい機能です。

以下動画のプロパティ欄に記載されている`VpcId`に注目すると`Subnet`リソースに紐付く`VpcId`の論理IDが変わることが分かるかと思います。

![cf_move.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/0b5ddfb1-e9a2-636d-6128-a1febebf5ee3.gif)

## 必須コードの記載
デザイナー画面で構成図を作成しただけでは設定がまだ足りないので実際にコーディングしていきます。
テンプレートの言語は`JSON`と`YAML`がありますが、`YAML`でコーディングすることにします。

また、今回は`VPC`と`Subnet`リソースのサブネットを以下とします。

|リソース|プロパティ|パラメータ|
|:--|:--|:--|
|VPC|CidrBlock|172.24.0.0/16|
|Subnet|CidrBlock|172.24.0.0/24|

「[CloudFormationユーザガイド](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html)」の「[テンプレートリファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)」を見ると、`VPC`と`Subnet`リソースは`CidrBlock`プロパティが必須項目のようです。

画面上の`VPC`リソースを選択すると`プロパティ`欄が表示されるため、以下のように編集します。

```yaml:VPCリソースのプロパティ（編集前）
Resources:
  EC2VPC1WR8B:
    Type: 'AWS::EC2::VPC'
    Properties: {}        ★{}を削除して次行にCidrBlockを追加
```

```yaml:VPCリソースのプロパティ（編集後）
Resources:
  EC2VPC1WR8B:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: 172.24.0.0/16
```

`Subnet`リソースも同じように編集します。
`VPC`リソースの中に`Subnet`リソースを配置している場合は「{}」は無く、すでに`VPC`リソースの論理IDが含まれた`VpcId`が記載されているはずなので、`VpcId`の下に`CidrBlock`を追加します。

```yaml:Subnetリソースのプロパティ
Resources:
  EC2SJOWQ:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref EC2VPC1WR8B
      CidrBlock: 172.24.0.0/24
```

## スタックの作成
コーディングが完了したら、画面上の`テンプレートの検証`ボタンをクリックし、問題が無ければ`スタックの作成`ボタンをクリックすると、最初の「テンプレートの指定」画面に戻るため、「次へ」で進みます。

尚、デザイナー画面でテンプレートを作成した場合はS3に「**cf-templates-xxxxxxxxx**」というディレクトリが作成されて、その中にテンプレートが保存されるようです。

スタック作成までにいくつかの画面で色々とオプションなどが表示されますが、今回は「スタック名」だけ入力して、スタックを作成してしまいます。

## 作成されたリソースの確認
「スタックを作成」ボタンをクリックすることでリソースの作成が開始されるので、さっそく確認してみると、無事作成されているようです。

- VPC画面
![capture_20082020_085024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/252011bb-ab89-cb28-e046-928f697cdc04.jpeg)

- サブネット画面
![capture_20082020_085116.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/22bd84bf-de79-0e05-1435-d9a6c2fe6370.jpeg)

## テンプレートの削除
作ったスタックの削除はあっという間で、削除するスタックを選択し、「削除」ボタンを押せば、テンプレートに記載されているリソースがまとめて削除されます。

![capture_20082020_085906.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/de7d28db-57aa-8d10-dd8a-fb7c1ce56841.jpeg)


# おわりに
構成図を作る感覚で実際のコードまで生成されるのは、今までオンプレ環境の構成図を1から作ってパラメータ設計していたことを考えると非常に画期的だと感じました。

また、デザイナー画面からの作成はテンプレートの雛形を作成するのに非常に便利で、慣れれば少ないコーディングで`CloudFormation`のテンプレートを作成できそうです。

次回は汎用性を持たせるために画面からパラメータを入出力させるように改良してみたいと思います。