めんどうくさそうなAWS Cloudformationの使い方を学ぶ

## まえがき
AWS Cloudformationを初めて使用した際のメモを整理し、Cloudformationはめんどくさそうという意識のハードルを下げる内容にまとめました。

## AWS Cloudformationの説明
AWSリソースの構築を自動化するサービス。
リソース情報を記載したJSONかYAMLのフォーマットをテンプレートとし、それを読み込ませることで自動的な構築が可能。
Cloudformation自体は無料。構築したリソース自体の料金は別途発生します。

テンプレートから同じ環境を再構成できるのでリソースの構築が簡単です。
同様にリソースの削除も容易にできます。

## とりあえず試してみる

### テンプレートの準備
* [AWSドキュメントのCloudFormationユーザーガイド ＞ テンプレートリファレンス＞ AWS Identity and Access Management ＞ AWS::IAM::User ](
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html)にあるIAMユーザーを作成するテンプレートを参考に作成していきます。
* テンプレートのフォーマットはYAMLの方が馴染みがあるので、YAMLで作成します。

  iam_user_create_001.yaml
  ```
  Resources:
    MyIAMUser:
      Type: 'AWS::IAM::User'
      Properties:
        UserName: '{my-iam-user}'
  ```

* UserNameの{my-iam-user}には任意の名前を記載するようにします。
とりあえず作成するなら上記の情報だけで良さそうです。
（AWS CloudFormation テンプレートバージョン、Descriptionなど無くても動くものはひとまず無視します。）

### Cloudformationの実行
* AWSのサービスメニューからCloudformationを選択します。

* スタックの作成ボタンからスタックの作成画面に遷移し、各ステップで操作を行います。
なお、スタックはテンプレートから作成された環境群を意味します。

* ステップ 1：準備したテンプレートをアップロードします。
![001_001_CloudFormation_スタックの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562079/eee61def-9212-a55d-5342-428565995f2f.png)
* ステップ 2：スタックの名前を決めます。
![002_001_CloudFormation_スタックの詳細を指定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562079/779f829c-be3e-9feb-07f4-455e39beb1ca.png)
* ステップ 3：デフォルトの内容で問題ありません。
![003_001_CloudFormation_スタックオプションの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562079/6f178bb6-6198-747a-b8a1-2c4de1aa0bf5.png)
* ステップ 4：レビューで最終確認をします。送信を押下すると作成が始まります。
（IAMのリソースを作成するにあたり承認が求められます。内容を承認して送信します。）

### Cloudformationの完了
* 作成に成功するとCREATE_COMPLETEとなります。
![005_002_CloudFormation_スタック_成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562079/16b1da1e-5da8-0847-4053-605fe4d121b3.png)

* 作成に失敗した場合は以下の状態になります。
  * 「状況の理由」に失敗した原因が出力されるので確認します。
  * この時は不適当なUserNameを指定したため失敗しています。
  * 失敗したテンプレートの内容を変更してスタックの作成からやり直します。（同一のスタック名で再作成する場合は、失敗したスタックを削除します。）
  ![005_003_CloudFormation_スタック_失敗.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562079/18daf572-f6c0-b362-b4e0-21a7fc1fbf75.png)


### IAMユーザーの確認
 * ユーザーの作成が確認できました。
![006_002_IAM_User.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562079/85eb1e41-04b9-f9dd-0ffb-be54b8165e84.png)


## パラメータを使ってテンプレートに汎用性を持たせる
とりあえずIAMユーザーを作成することが出来ました。
ですが、先ほどのテンプレートでは、ユーザーを作成する度にテンプレート内のユーザー名の変更が発生します。
そこでCloudformationの実行準備時に設定できるパラメータをテンプレートに記載することで、IAMユーザー作成テンプレートに汎用性を持たせます。

### テンプレートセクション
 * テンプレートは1つ以上のセクションで構成されます。セクションで唯一必須なのが先ほどのテンプレートにも記載した`Resources:`です。
 * `Parameters:`はCloudformation実行時 (スタックを作成または更新するとき) にテンプレートに渡す値です。

### パラメータを使ったテンプレートの準備
 * 先ほどのIAMユーザー作成のテンプレートにパラメータを追加して、ユーザー名を指定してIAMユーザーを作成できるようにします。
 * パラメータの詳細については[AWSドキュメントのCloudFormationユーザーガイド ＞ テンプレートの操作内 ＞ テンプレートの構造分析 ＞ パラメータ ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html)を参照してください。

    iam_user_create_002.yaml
    ```
    Parameters:
      # パラメータ名がUserNameParameter　データ型がString
      UserNameParameter: 
        Type: String
    Resources:
      MyIAMUser:
        Type: 'AWS::IAM::User'
        Properties:
          # !RefでパラメータのUserNameParameterを参照
          UserName: !Ref UserNameParameter
    ```

### Cloudformationの実行
* ファイルのアップロードまでは先ほどと同じです。
* ステップ 2：パラメータの入力欄「UserNameParameter」が確認できました。ここに任意のユーザー名を記入します。
![007_002_CloudFormation_スタックの詳細を指定_パラメータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562079/3ee20a84-18e7-aa2e-a75c-633f8a0aa4c6.png)
* そのあとの作成も先ほどと同じです。

### Cloudformationの完了
* 作成に成功したスタックのパラメータからキーと値が確認できます。
![008_002_CloudFormation_スタック_成功_パラメータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562079/51076189-c80b-621c-ebb8-dacf4b799b98.png)


### IAMユーザーの確認
 * ユーザーの作成が確認できました。
![009_002_IAM_User_パラメータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562079/58ab0770-51df-c2b6-d86e-f1d849c91700.png)


## 作成したリソースの削除
 * 冒頭に説明した通りリソースの削除は容易に行えます。
  
### リソース削除の実行
* 最初に作成したIAMユーザーのスタックを選択し、削除ボタンから削除します。
![010_001_CloudFormation_スタック_削除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562079/50aa9488-6043-d265-69ee-209a7da810ce.png)
* DELETE_COMPLETEとなり削除完了です。
![010_002_CloudFormation_スタック_削除完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562079/d48a36f5-1fd7-6f93-c30b-216839539a3e.png)

### IAMユーザーの確認
* ユーザーの削除が確認できました。
![011_002_IAM_User_削除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562079/068a930f-830c-d3a6-a838-d3fb51ff2ed7.png)


## あとがき
ただ単にIAMユーザーをCloudformationで構築する方法をまとめました。
今回Qiita初投稿になりましたが記事を書くことの難しさを痛感しました。