【AWS】AWSでInfrastructure as Code (既存リソースのテンプレート化)

# はじめに
この度、CloudFormationを使って既存リソースのテンプレート化について扱うことがありまして、その備忘録として書き残します。

テンプレートからのスタック化については扱っていないのであしからず。
### CloudFormationとは
![AWS-CloudFormation@4x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/66d583fd-33c7-8128-527c-bbe57f121dd5.png)


簡単にいうと...「AWSのインフラをコードで管理しよう」というサービスです。
テンプレートと呼ばれるJSON/YAML形式で書かれた設定を読み込ませてあげれば、それをもとに実際のリソースを構築してくれます。
結構散らばりがちなリソースを一元管理できるのはめちゃめちゃいいなという印象です。

ただ、CloudFormationで構築したリソースを「コンソールから変更する」などやってしまうと面倒なことになりそうな気はしているので注意したいですね。
### 既存リソースのテンプレート化を行う方法
既存リソースのテンプレート化を行う方法なのですが、下記の通りいくつかあります。

- 「**CloudFormer**」
 - AWS公式が出しているテンプレート化ツール。**ずっとベータ版らしい**
 - ベータ版なので本番環境などでは使わないように！らしい 
 - [公式ドキュメント][link-1]

- 「**CloudFormer2**」
 - 今回は扱わないです。
 - [CloudFormer2][link-5]
- 「**Former2**」
 - サードパーティのツール
 - リソースをぽちぽち選択するだけで勝手にテンプレートを形成してくれる。
 - [Former2][link-2] 




[link-1]:https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-using-cloudformer.html

[link-2]:https://former2.com/
[link-5]:https://github.com/sentialabs/cloudformer2
### CloudFormer
CloudFormationのコンソールから選択することができます。
![CloudFormer1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/2cb687af-aca0-0697-f3aa-393595e8425b.png)

まず詳細設定を行います。
途中でUsernameとPassWordを設定するのですが、これは後程必要となります。

作成を押し、作成が完了したら出力タブにあるURLを押してください。

![CloudFormer2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/49a3b19c-9dd4-08dd-6cbe-b46a332d18e9.png)

するとテンプレート化を行うリソースを選択するページに飛ぶので、先ほど設定したUsernameとPasswordの入力を行い、テンプレート化を行いたいリソースを適宜選択してください。

実際にやるとわかるのですが、
1. 画面遷移が多い
2. 対象のリソースが少ない

と、さすがベータ版という感じのサービスでした。

### Former2
[Former2][link-2]のページにアクセスして実行することができます。
Former2は先述の通りサードパーティのサービスなのですが、まぁ優秀で積極的に使いたいですね。

Former2の認証ページはこのようになっています。

![former2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/b92efcc8-4118-f00a-235e-63f551add252.png)

Former2は「アクセスキーID」と「シークレットアクセスキー」を与えることでIAMユーザに立ち上がっているリソースを認識します。

そのため、扱いには注意が必要で、**ここに入力するIAMユーザには「ReadOnlyAccess」のポリシーをアタッチすることが推奨(というかほぼ必須)されています。**

なので、ReadOnlyAccessユーザを作成します。
IAMユーザの作成を行える権限があるユーザでコンソールにログインし、
「IAM-ユーザの追加」を押します。

適宜ユーザ名を入力し、アクセスの種類でプログラムのアクセスにチェックを入れます。
![former2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/721c9eda-bf7d-dbd6-2f23-3f6b5a5c6285.png)

アクセス権限では、既存のポリシーを直接アタッチから「ReadOnlyAccess」を選択します。
(ここですべてのリソースに対してのReadOnlyAccessを与えたくない方は、適宜テンプレート化に必要なリソースのみのReadOnlyAccessを与えてください。)

![former2_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/6a4ad9a1-dfe6-ac49-8f3a-f71678eee6f0.png)

ユーザの作成を行うと、アクセスキーIDとシークレットアクセスキーIDが発行されるのでFormer2の認証画面に入力します。

![former2_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/9b55214a-6b84-5280-c00a-ab5e6b8542ba.png)



認証を行い、詳細設定を行うとダッシュボードに移行します。

デフォルトでは、リージョンがUS Eastになっているので、適宜テンプレート化したいリソースが置いてあるリージョンに切り替えてください。(リソースが表示されない場合には、Scan Accountボタンを押してください)

![former2_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/0edc43ff-79a8-e58c-7e80-20dbf857f030.png)

テンプレート化を行いたいリソースを選択し、Add Selectedを押します。すべての選択が終わり次第Generateを押すと、テンプレート化を行えます。

![former2_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/0395f43e-2c6b-cf46-26ee-6847f491f487.png)

Search欄でタグが付いているリソースのみの絞り込みが行えたり、リソースの種類が豊富だったりかなり使い勝手がいいです。


### Former2のローカル実行

セキュリティ上の観点からローカル実行を行いたい方向けに[ローカルでのホスティング][link-3]が行えます。

DockerFileからイメージを作成し、コンテナを作成し、起動することで実行できました。

![former2_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/e6d3fb65-2957-7e0d-b8c2-6be006ea3858.png)


[link-3]:https://github.com/iann0036/former2/blob/master/HOSTING.md

# まとめ
以上、既存リソースからテンプレートを作成するまでをまとめてみました。
セキュリティを気にしないのであればFormer2をつかってブラウザ上でパパっと作成してしまうのがいいのかなと感じてます。

AWSがFormer2をサポートするようになればもっと捗るんじゃないかなぁと...個人的な感想です...。