CloudFormationをゼロから勉強する。（その３：パラメータの入出力）

# はじめに
前回は`CloudFormation`のデザイナー画面からテンプレートを作成しましたが、固定値をそのまま記載しており、使いまわししにくいので、今回は汎用的にするため、固定値を変数として適宜パラメータを入力させるようにして、後から確認したい値を出力させてみたいと思います。

- 【前】[CloudFormationをゼロから勉強する。（その２：デザイナーからのテンプレート作成）](https://qiita.com/sakai00kou/items/5bbb9cfac79fc4a3f857)
- 【次】[CloudFormationをゼロから勉強する。（その４：コマンドからの操作）](https://qiita.com/sakai00kou/items/cfc3c43857ca4d9def18)


# テンプレートパスの確認
前回のテンプレート作成でS3に保存されているテンプレートのディレクトリパスを確認します。

`AWSマネジメントコンソール`か`aws cli`で確認してください。

```shell:aws_cliからの確認
aws s3 ls
aws s3 ls --recursive cf-templates-xxxxxxxxxxxx-[リージョン名]
```

S3にはデザイナー画面で作成したテンプレートが以下のディレクトリパスで保存されているはずです。

```shell:S3のディレクトリパス
cf-templates-xxxxxxxxxxxx-[リージョン名]
├─ xxxxxxxxxx-designer/
│  └─ new.templatexxxxxxxxxxx            ★テンプレート
└─ xxxxxxxxxx-new.templatexxxxxxxxxxx    ★テンプレート
```

テンプレートが2種類保存されておりますが、「**new.templatexxxxxxxxxxx**」と「**xxxxxxxxxx-new.templatexxxxxxxxxxx**」の内容は同じです。

違いは分かりませんでしたが、デザイナー画面で作業中のファイルと保存してあるファイルなどの違いなのでしょうか？

読み込むだけならどちらでもよさそうですが、今回は「**xxxxxxxxxx-designer**」配下の「**new.templatexxxxxxxxxxx**」を読み込むようにします。


# スタックの作成
前回デザイナー画面から作成したテンプレートを使って改良していこうと思います。

デザイナー画面で作成したテンプレートは、スタックが削除されていてもS3の「**cf-templates-xxxxxxxxx**」に保存されているため、S3に保存されているテンプレートを読み込みます。

尚、`Amazon S3 URL`は「**S3://**」のような指定も可能なので、`aws cli`から確認した人は以下の様な表記で入力したほうが簡単です。

- s3://cf-templates-xxxxxxxxxxxx-[リージョン名]/xxxxxxxxxx-designer/new.templatexxxxxxxxxxx

## テンプレートの読み込み
前回と同様、`スタックの作成`ボタンをクリックし、スタックの作成を進めます。

今回はテンプレートファイルがあるので、`テンプレートの準備完了`を選択し、テンプレートの指定で、先ほど調べたS3のURLを入力して`デザイナーで表示`をクリックして前回のデザイナー画面を表示します。

![capture_21082020_082621.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/cf7397e6-394e-9470-dcdc-c8199a67f8a6.jpeg)

# コーディング
「[AWS Black Belt Online Seminar AWS CloudFormation アップデート](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-aws-cloudformation)」のスライドを確認すると、パラメータ値をユーザに入力させるには`Parametersセクション`を作成、任意のパラメータを画面出力させるには`Outputセクション`を作成することで画面出力できるようなので早速作成していきます。

## 入力項目（Parametersセクション）の作成
前回直接値を書き込んでいた`VPC`と`Subnet`リソースの`CidrBlock`の値を、スタック作成時に入力させるようにしようと思います。

`Parametersセクション`は前回編集していた`Resourcesセクション`とは異なるため、デザイナー画面の何もない部分をクリックし、`パラメータ`タブに以下を追加します。

```yaml:Parametersセクション
Parameters:
  VPCRange:
    Type: String
    Description: "VPC Subnet Range"
  SubnetRange:
    Type: String
    Description: "Subnet Range"
```

## パラメータの置き換え
前回固定値で記載した値を、先ほど`Parametersセクション`で指定した変数に置き換えます。

`Parameters`の値は、`!Ref [パラメータ名]`で呼び出せるため、先ほどの`Parametersセクション`で指定した`VPCRange`パラメータの値を呼び出すには、`!Ref VPCRange`と指定します。

```yaml:VPCリソースのプロパティ
Resources:
  EC2VPC1WR8B:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: !Ref VPCRange
```

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


## 出力項目（Outputsセクション）の作成
`Outputsセクション`は先ほどと同様、何もない部分をクリックし、`出力`タブに以下を追記します。

今回はリージョン名を画面出力させるようにしたいと思います。

```yaml:Outputsセクション
Outputs:
  VPCRegion:
    Description: Region Name
    Value: !Ref 'AWS::Region'
```

## スタックの作成
各コーディングが完了したら、`スタックの作成`ボタンをクリックし作成を進めていくと、スタックの名前を入力する画面で、先ほど`Parametersセクション`で指定した項目が表示されるので、サブネットを画面上から直接入力して、スタックを作成します。

![capture_22082020_161224.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/009d8e01-fa7a-16a4-4af4-7341c5f19251.jpeg)

# スタック作成後の確認
無事スタックが作成されると、スタック画面の`出力`に先ほど`Outputsセクション`で指定したリージョン名が表示されていることが確認できます。

![capture_22082020_162458.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/fc6d992e-b3a9-3fb2-535e-275a7f5080df.jpeg)

尚、`エクスポート名`が空欄となっていますが、他のスタックから値を呼び出したいときに、`Export`パラメータを指定することで呼び出すことが可能となるそうです。（Cross Stack Reference）

# おわりに
入力画面から指定のパラメータを入力できて、さらに控えておきたい情報が出力パラメータとして画面上から確認できるのは、他の人に指示するような場合や運用手順など作成する場合などに有用ですね。

次回は`aws cli`からの操作を行ってみたいと思います。