Cloudformtion をおぼえよう

どうも、AWS大好き、AWSの唱えることを勝手に解釈して覚えていくの大好きオーツキです。

# 「STAR メソッド」

「おおつきくん「STAR」で説明をすると色々なことがわかりやすくなるよ。」
先日ある、先人からなるほどなってものを教わりました。

行動の説明をするときに、良い方法ということでそれぞれの単語の頭文字をとったものなのですが、
- [S]ituation :状況：　どんな状態や課題に直面したのか
- [T]ask      　:課題：　やるべきことはなんなのか
- [A]ction    :行動： どんなことしたのか 
- [R]esults   : 結果： どんないいことわるいことがあったのか

具体例を含めて簡潔にすると、わりとわかりやすい回答を準備することができるってものなんだそうです。
本題の、今回は　AWS をおぼえるにいたった　Cloudformationをこの、STAR形式で覚えていこうじゃありませんか🎵。


すべてのAWSは「Cloudformationに通じます」と言い切れるくらい、密着しています。
持論で言えば、なんならCloudforamtionを覚えたら、AWSのだいたいが理解できます。

## S：　明日までに　サーバの環境を　開発、ステージング、本番用意して欲しいよ！　っていわれた金曜日。

早い話、AWS　で用意できるものは「Cloudformationで書いたら、なんでも用意できるよ」

　「DevOpsするよ」と開始されたが、　当時の自分にはJenkins、Chef、Bash、Javaの知識しかありませんでした。
　　　　この状況で、AWSを覚えようとする際にはまず　VPC、Subnet、EC2にRDS といった基本的なリソースを　AWSコンソールをこねくり回すしかない状況でした。
案件でAWSを利用する必要となったのがおおよそ10年前、当時やっていたのがLinuxが好きなJavaアプリケーションエンジニアの自分でした。ただ、当時はAWSも関係なくChefを覚えるというところからサーバの中身を自動化することに始まります。
Chefでできることは、サーバの中身を構築するところ。ただ、用意されたまっさらな環境に対してアプリケーションが必要とするソフトウェアや設定を変えていただけだったため、今や当たり前の　DevOpsやCICDなんて言葉はありませんでした。
ミドルウェアの中身は　AnsibleやChef、最悪の話 shell かて順序を用意することでなんとかなります。
　　ただし、ミドルウェアを動かすためのサーバやサービスリソースといったものはどう頑張っても自動化することはできないのだと思っておりました。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/35faa3eb-664d-9efa-f69b-cea36df6e2c4.png)
ここに書いただけでも、DevOpsをひと回しするためには様々な工程が存在します。
では、この最初に当たる　Provision パートをコードで開発するにあたってはどうしたらいいのでしょう・・・　の第一歩目が　「Cloudformation」です。



## T：　クリックしまくりの俺、３環境作れるようにする必要がある！　しかも「一回の作業で」なるだけ同じように。
　「皆Cloudformationいつかおぼえたいんですよー」
「なかなか、むずかしくってね」
なんていうんですが、これもおおつき自己解釈ですが、心配するなかれ。　もともとAWS の中身は　OpenStackをインスパイアしてできたなんてことを聞きます。　Javaプログラマの自分対象に今回は書いていこうと思いますが

つまり「インフラ屋さん」＝「プログラムが書けないかもしれないエンジニア（disりではない）」

プログラムが書けないのに、CodeAsInfrastructureはできんのかってところ「ミソです」
ルールに従ったパラメータシートなどの定義書に、まず上から順に必要な場を記載すること。
ひたすらこの作業を繰り返すのです。

Cloudforamtionは、　ルールに基づいて考えればいいのです、ルールに必要なものとして３つ「スタック」「テンプレート」「リソース」を考えましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/62a99d24-654e-958a-776a-c3314c1cd75d.png)

## A：　Javaプログラムエンジニアの俺！　覚えるは　「文法」、「クラス」、「コーディング」
### 1. テンプレート
- １つ目に覚えるはテンプレート。　このテンプレートは　７つのセクションで構成され、最初のうちはParameter, Mappings, Resource を覚えることで学ぶことが可能です。

それぞれに書くべきはこちらのとおりです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/0df5970e-3a47-ff7c-81a1-c7fbe02986dd.png)

### 2. 日本語　と　CLoudformtion と　Javaのコードで考えると意外とオブジェクト指向！
　Cloudfoamationは、　ひたすら、定義したい　AWSのサービスリソースを記載していきます。定義したリソース同士は、AWSの中ではインスタンスとなり、そのインスタンス同士は　お互いをオブジェクトとして結ぶことができます。

左側は　日本語でどんなものが欲しいかなパラメータシートに近い形の内容です。
　これを　書いたものが、右側の　CLoudforamtonテンプレートですが。このままだと　まだ、難しい皆様は下にあるJava ふうのコードで見てみるとちょっとわかるかもしれません。

　 1. 書きたいリソース（欲しいAWSのサービスリソース）は　インスタンス名として論理名という場所に名称を書きます。ここでは「アプリケーションサーバ１号機」というものです。
　　　　　　　この論理名は、実際のAWS場では意味をなさず、このテンプレートの中で参照したりするのに使います。
　 2. すべてのAWSリソースを　Class と考える。　Classの種類は　Type というフィールドで定義します。
　　　　　　　　このTypeの一覧はこちらから参照が可能です。

　　　　　　　例） EC2 インスタンスリソースの定義：
　　　　　　　　https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-instance.html
　 3.　クラスに必要なパラメータは　必須項目以外はすべてデフォルト値を取りますが、コンストラクタに記載すべき値はPropertiesという中に記載していきます。 
リソースに必要な初期値はすべて、クラスのコンストラクタのパラメータだと思うと良いのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/8408c68d-2d28-a948-aabf-cdae6cfb9693.png)

さて、ここまで書くと　あとはこの１〜３の繰り返しなんですがもうちょっとだけ説明をしちゃいましょう。
覚えるべきはオブジェクト思考っぽい考え方。オブジェクト同士は、オブジェクトを引数に取ったりしたいことがあるわけで、その場合には「!Ref」という参照しますよ　という　関数と呼ばれる特殊な指示しを使って記載します。
こちらの例では　アプリケーションサーバ１号機には　セキュリティグループを参照させたいので　[!Ref sgAppSG010] というのを記載しています。

・テンプレート内のリソースを参照する、　テンプレート内のセクションのParametersやMappingセクションの値を参照するための!Ref , !FindInMap 、このほかにも　文字連結をするための!Join や　分割をするための!Split なんてものが用意されています。

関数一覧はこちら。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html

いくつかの関数というものを使うことで、お互いのオブジェクトを参照したり、Paramsなどで参照した値から　名称やパスを作成するための関数を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/55ee79e7-1e61-1de4-cb1c-28f254fed493.png)

ここまでくると、まず　Cloudforamtionが書けない入門者がいたとしても、何が書いてあるのかくらいは読めるようになるといいなと思います。

おすすめは
 １：　システム構成図を書き
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/9c102899-c10d-4827-c473-2847f478b0e9.png)


 ２：　アイコンの数だけリソースを記載する。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/635f68ac-ca9e-4485-793d-f27008eb4b2b.png)


 3:必要な数だけ　!Ref や関数を使いテンプレートをひたすら書いていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/df5e090b-ff6d-1358-203d-3d7020577b31.png)

 これだけです。



## R：　CLoudforamtionを書いたおかげで、何度もぽちぽち作業を繰り返さず　さらには、各自開発のための環境を個別に横展開できるようになる。

今回の記事では、まずCLoudforamtionの入口を記載したつもりですが。
次回は、　複数の環境を設計し、展開する方法を共有しようと思います。

次回お楽しみに：　の布石・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8216/65845ba6-6947-adba-9186-12ada62dc9f7.png)