CloudFormationの特徴とはじめ方

# はじめに
本記事はCloudformationを始めようとしている人向けです。
細かい技術的な話よりは、特徴だったり始め方の手順だったりが書かれています。
公式ドキュメントを舐めるのが面倒な人はちょうどいいです。

## 概要

インフラ環境をテンプレート化し、何度実行しても同じ環境を簡単に構築することができる。
AWSのアイコンをペタペタ並べていくことでテンプレートを新規作成する「Design Template」機能や、既存のインフラ環境を自動でテンプレート化してくれる「CloudFormer」という機能がある。
また、コードでテンプレートを作成することも可能であり、デフォルトの言語はJSONとなっている。

## メリット

**大きな特徴として、以下が挙げられる。**

1. インフラがコードで管理できること
2. 作成・削除・更新が容易であること

### 何がもたらされるのか

* コードで管理できるということは、バージョン管理が容易になる。
「インフラの成長過程がわかる」とよく言われる所以
* オペレーションミスなし、作業者の技術力に依存しない環境構築が可能になる
* 運用中、値変更があってもリスクなしでアップデートできる
* 開発環境など限定的にしか使用しないインフラのランニングコストを削減できる
* 既存のインフラ環境をすぐに可視化できる（構成図を作成・更新する工数削減）

### CloudFormationの金額

**無料**で使用できる。立ち上がったリソースに対して課金が発生する。

## 機能

### CloudFormation Designer

おなじみのAWSアイコンを配置し、繋いでいくことでテンプレートが作成できる。
作成したDesignは保存、ダウンロード、ローカルから開く、などができる。
アイコンは単純なAWSサービスだけではなく、ルートテーブルやVPCEndpointなど、普段は見ないアイコンも存在する。
理由は、この機能は構成図を作成するためのものではなく「テンプレートを作成する」機能のため、詳細なポリシーまで指定する必要がある。

### CloudFormer

既存で構築されているインフラ環境をテンプレートに落とし込める機能。
自動でCloudFormation用のインスタンスを作成し、テンプレート作成準備を数分で構築する。
すべてのCloudFormationのリソースをサポートしている。
注意点としては、**新規インスタンスを一台起動させて実行するため、課金が発生する。**

詳しい特徴は以下の通り

* どのリソースをテンプレートに含めるか制御可能
* リソースを選択すると、従属するリソースも自動選択（変更可能）
* EC2インスタンスを選択すると、そのインスタンスが起動された元のAMIが指定される

CloudFormerで生成されたテンプレートを手修正し、最終的なテンプレートとして利用することを推奨している

## 開始手順

#### CloudFormerスタックを作成する

1. Cloudformation画面にて「Create New Stack」をクリック
2. 「Select a sample template」のプルダウンから「Cloudformer」を選択
3. 「Next」で次ページ
4. 必要な情報を入力する
5. Stack Name CloudFormerのスタック名
6. Password CloudFormerにてテンプレートを作成するページへログインするためのパスワード
7. Username CloudFormerにてテンプレートを作成するページへログインするためのユーザ名
8. VPCSelection CloudFormer用インスタンスが立ち上がるVPC。特に変更はしない

9. 「Next」で次ページ
10. 必要な情報を入力する（特に設定しなくても進められる）
11. TagとKeyの設定。リソースにタグを適用できるため、識別や分類したい場合は設定する
12. Permissionsの権限がないとCloudformationは実行できないため、必ず実行権を持ったロールアカウントにする
13. 「Next」で次ページ
14. サマリを確認後、「Create」をクリック
15. スタック作成が実行されるため、起動完了の「CREATE_COMPLETE」となるまで待機

#### Cloudformationテンプレートを作成する

1. CloudFormerのスタックを選択し、「Outputs」タブを選択
2. 「Value」に表示されるURLを踏み、テンプレート作成画面へ飛ぶ
3. 「アクセス保護されてないページ」の警告を通過する
4. テンプレート化を実施するリージョンを選択し「Continue」をクリック
5. テンプレートに含めたいリソースの選択が続く。含める含めないを考慮しながら「Continue」をクリックしていく
6. サマリを確認後、「Done」をクリック
7. テンプレートが作成されているので、S3のどのバケットに保存するか選択する
8. 終了

#### Cloudformerスタックを削除する

1. テンプレート化が確認されたらスタックを削除（インスタンス分が課金されている）
2. 終了

## JSONテンプレート

テンプレートはデフォルトでJSON形式で記述される。
いくつかのセクションに分かれており、そのうち「Resources」セクションのみ必須で記述する必要がある。

セクションは以下の通り

* Format Version（任意）
<pre>CloudFormationのテンプレートバージョンを指定する</pre>
* Description（オプション）
<pre>テンプレートを説明するテキスト文字列。テンプレートのパラメータ等を入力する際に表示される</pre>
* Metadata（オプション）
<pre>テンプレートに関する追加情報を提供する</pre>
* Parameters（任意）
<pre>実行時にユーザに入力を求めるパラメータを定義する。インフラ構成は変えず、IPやインスタンスタイプを変えたいなどの運用で便利。</pre>
* Mappings（任意）
<pre>HashTableのようなもの。条件パラメータ値の指定に使用できる。リージョンやユーザ入力パラメータによって値が変わるものに利用する。Mappingsを利用することでテンプレートの再利用性が向上する</pre>
* 条件（オプション）
<pre>条件つきのリソースの制御が可能</pre>
* 変換
<pre>サーバレスアプリケーションの場合は、使用するAWS SAMのバージョンを指定する</pre>
* Resources（必須）
<pre>インスタンスやS3など、使用するリソースを指定する。</pre>
* Output（任意）
<pre>スタック構築後にCloudFormationから出力させる値（DNS名やEIP値など）</pre>

## テンプレート作成のためのいくつか注意点(共通）

1. CloudFormation Designerでアイコンを並べていくだけではテンプレートとして機能しない
2. テンプレート作成し保存しただけではCloudFormationは実行できない
3. 立ち上げたいインフラ環境のすべてをひとつのテンプレートとして作成すべきではない

**1. CloudFormation Designerに関わらず、CloudFormationテンプレートではリソース同士の「依存関係」が重要になる**

* ここで言う依存関係とは、リソースを作成する順序
* AリソースがBリソースを依存関係に指定している場合、Bリソースが作成されるまでAリソースは作成されない
* この依存関係は、リソースを構築する上で避けて通ることができない
<pre>※備考※
VPC内の一部リソースはゲートウェイを必要とする。
VPC、ゲートウェイ、ゲートウェイアタッチメントを AWS CloudFormation テンプレートで定義する場合、
ゲートウェイを必要とするリソースはすべて、そのゲートウェイアタッチメントに依存することになる。
たとえば、パブリック IP アドレスが割り当てられている Amazon EC2 インスタンスは、
同じテンプレートで VPC リソースと InternetGateway リソースも宣言されている場合、VPC ゲートウェイのアタッチメントに依存する。</pre>

*現在、次のリソースは関連付けられたパブリック IP アドレスを持ち、VPC 内にある場合VPC ゲートウェイのアタッチメントに依存する。(2017年4月現在)*

・Auto Scaling グループ
・Amazon EC2 インスタンス
・Elastic Load Balancing ロードバランサー
・Elastic IP アドレス
・Amazon RDS データベースインスタンス
・インターネットゲートウェイを含む Amazon VPC のルート
</pre>

**2. テンプレート作成後、スタックとして成立させる**

* パラメータを設定すること
<pre>インスタンスタイプなどの値はスタック作成時に設定するケースが多い</pre>

**3. 削除したくないリソースを予め決定しておくこと**

* CloudFormationで起動させたインフラ環境を停止する場合、インフラ環境を削除することになる
<pre>削除対象のテンプレート内に固定IPが割り振られてたインスタンスがあった場合、インフラ環境を再構築した際に割り振りが変更してしまう。
普遍なリソースはテンプレートを別にする</pre>

## 参考
AWS Cloudformationユーザガイド
http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html

CloudFormation超入門
http://dev.classmethod.jp/beginners/chonyumon-cloudformation/

AWS Black Belt Tech シリーズ 2015 - AWS CloudFormation
https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-2015-aws-cloudformation?qid=9c031227-6000-4a12-bf18-49cda2c6bfe9&v=&b=&from_search=1