【AWS】CloudFormer使ってみた

## はじめに
AWSのCloudFormerというβ版のサービスを使ってみたので作成手順を備忘録として記載します

## 経緯
現所属の社内システムにがAWS環境にあり、新しいサービスを導入しようとしたが、分かりやすい環境構成図がなく全容が見えませんでした  
なので、現状を調査するのにいちいちAWS管理コンソールから紐づいているものを確認するのが億劫だな〜と思い、実環境から環境構成図を逆起こししてくれるようなものはないか社内TOPの技術屋さんに聞いてみたところβ版ではあるが**CloudFormer**というツールがあること教えてもらったので使用してみました

## CloudFormerとは
CloudFormerは、アカウントに既に存在するAWSリソースから環境の起動や設定値などを抜き出して、CloudFormationテンプレートを作成するツールです  
テンプレート自体は、JSON形式のテキストファイルなのでそのまま使用して全く同じ環境を作成したり、追記や修正することも可能です  
CloudFormerはEC2インスタンスが起動するので起動している間は課金されます

### 主なメリット
- 既存環境を可視化しやすい
- 既存環境のリソース一覧がみれる
- 既存の環境をコード化できる（Infrastructure as Code）
- 既存環境と同じ環境を自分の開発環境用に構築できる

#####テンプレートとは
どのAWSリソースをどのような設定で起動するかコードで記述したもの(JSON形式またはYAML形式)
#####スタックとは
テンプレートから生成されるAWSリソースの集合のこと<br>スタックを消すと、紐づくリソースも全て消える

## CloudFormer作成手順
※2020年1月時点のGUIのため変わっている可能性があります

1. CloudFormerのスタックを作成する
 1. CloudFormationサービスの[スタックの作成]ボタンを押下し、[新しいリソースを使用（標準）]を選択する
![cloudFormer2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/7c7646b9-1105-95c9-5176-7e741ff08d6a.png)
 1. [サンプルテンプレートの使用]を選択し、テンプレートを[CloudFormer]を選択し、[次へ]ボタンを押下する
![cloudFormer4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/047b0a0d-be93-cee3-6a18-be75f04c685a.png)
 1. [スタックの詳細を指定]でスタックの名前とPasswordを記載して[次へ]ボタンを押下する<br>（※Usernameはなくても作成可能）
![cloudFormer5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/ac3108d6-afff-e51b-866f-16bc86927fb4.png)
 1. [スタックオプションの設定]では特に何も指定せず[次へ]ボタンを押下する
![cloudFormer6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/fdc09773-2af6-b00d-de1c-231db4d0e222.png)
 1. [レビュー]で内容を確認し、[AWS CloudFormationによってIAMリソースが作成される場合があることを承認します。]のチェックボックスにチェックを入れて[スタックの作成]ボタンを押下する
![cloudFormer7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/32200ce5-67b8-8fdd-ad11-384939ea82b2.png)
 1. CloudFormationサービスのページでスタックのステータスが「CREATE\_IN\_PROGRESS」から「CREATE\_COMPLETE」になるまで待つ(※5分くらい)
![cloudFormer8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/8e54bd15-44dd-76fc-1a9e-c53050ccf057.png)
 1. スタックのステータスが「CREATE_COMPLETE」になればスタック作成完了
![cloudFormer11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/603d77f9-f4f4-c666-b8fd-67ae0f2007d9.png)
1. CloudFormerのスタックを起動する
 1. 作成したスタックを選択し、出力タブに表示されている値のURLをクリックする
![cloudFormer12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/7aac6879-f4f5-f963-d8b3-7dc6044d2ee3.png)
 1. CloudFormerツールが起動される<br>CloudFormerのスタックを作成した時に指定したユーザ名とパスワードを入力するとアクセスできる
![cloudFormer14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/9bf98257-e440-5b64-bd93-94f637ae447f.png)
1. CloudFormerを使用してテンプレートを作成する
 1. 作成したいリーソスのあるリージョンを選択し[Create Template]ボタンを押下する
![cloudFormer15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/7a596085-975b-515a-7e17-3fd9ab87ad6a.png)
 1. Introページは特に入力しないまま[Continue]ボタンを押下する
![cloudFormer16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/24237969-9881-92ab-f6ad-03efdc4cfeb7.png)
 1. 以降のページではテンプレートに追加したいリソースを選択して[Continue]ボタンを押下していく<br>※セキュリティの関係上キャプチャは割愛
		1. [DNS] では Route 53 レコードを追加できる
		1. [VPC] では Amazon VPC を追加できる
		1. [VPC Network] では Amazon VPC のサブネット、ゲートウェイ、DHCP 設定、VPN 接続を追加できる
		1. [VPC Security] では ネットワーク ACL とルートテーブルを追加できる
		1. [Network] では、Elastic Load Balancing ロードバランサー、Elastic IP アドレス、CloudFront ディストリビューション、Amazon EC2 ネットワークインターフェイスを追加できる
		1. [Managed Services]では Auto Scalingグループ、Elastic Beanstalk アプリケーション、OpsWorks スタックを追加できる
		1. [Managed Config]では Auto Scaling起動設定、Elastic Beanstalk　環境設定、OpsWorks 環境設定を追加できる
		1. [Compute] では Auto Scaling グループと Amazon EC2 インスタンスを追加できる
		1. [Storage] では Amazon EBS ボリューム、Amazon RDS インスタンス、DynamoDB テーブル、Amazon S3 バケットを追加できる
		1. [Storage Config] では Amazon RDS サブネットグループ、ElastiCache パラメータグループ、Amazon RDS パラメータグループを追加できる
		1. [App Services] では ElastiCache クラスター、Amazon SQS キュー、Amazon SimpleDB ドメイン、Amazon SNS トピックを追加できる
		1. [Security] では セキュリティグループを追加できる<br>[Security] に進んだ時点で自動的に選択されるため、必要なグループが選択されていることの確認だけでOK
		1. [Operational] ページでは Auto Scaling ポリシーと CloudWatch アラームを追加できる
		1. [Summary (概要)] ページでは次のことができる
		  - テンプレートに追加したリソースを確認
		  - リソースに割り当てられている自動的に生成された論理名の変更
		  - サイトの IP アドレスや URL など、必要な情報を提供する出力内容を指定できる
	1. [AWS CloudFormation Template]に生成されたテンプレートが表示される<br>[S3 Bucket]を選択し[Save Template]ボタンを押下してテンプレートをバケットに保存する
　　　　　![cloudFormer32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/b7c2c3ff-a28c-f3c2-8802-6e073705ba16.png)

	1. [Launch Stack]を選択すると、指定したAmazonS3バケットにテンプレートが保存された後すぐにスタックが起動する<br>[Create Template]を選択した場合は指定したAmazonS3バケットにテンプレートが保存されるだけ
![cloudFormer17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/3c3ce117-de8d-ebf2-2019-a3b46cb05f4a.png)
 
   <font color="red">**ここまででテンプレート作成完了！！**</font>

1. CloudFomerのスタックを削除する
 1. テンプレートの作成は完了したのでCloudFormerのスタックは必要ないので削除する<br>CloudFormationで対象スタックを選択し、[削除]ボタンを押下する<br>※無駄に残しておくと不要な課金されるので不要になったらすぐ削除する
![cloudFormer33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574041/ce795a95-b8de-17cd-cc1b-e2b33e86a197.png)

## まとめ

β版なので本番環境などには適用することは難しいでしょうが、環境調査用としては十分でした

CloudFormerを使用しなければ管理コンソールから紐付けをひとつずつ辿っていかなければならなかったので
既存環境と同じ環境を作成したいけど設定値がわからない時やテンプレート化しておきたい環境があった場合にとても便利なツールだと思いました

私の場合はJSON形式ファイルのテンプレートの値から環境を調査するのも面倒臭かったので、テンプレートをCloudFormationデザイナーに貼り付けて図として現状を把握し、その図と設定値を元に環境構成図をアップデートしました

今回CloudFormerを使用してリソースを一覧化できたこっとによって、defaultの使用していないサブネットや既に使用していないサービスがあることもわかったので今後はこの情報を元に環境を綺麗にしていきます

私はJSON形式のままテンプレートを使用しましたが、CloudFormationデザイナーを使用してJSONをYAMLに変換して使用することもできるようです

## 参考資料
- [CloudFormer (ベータ) を使用して既存の AWS リソースから AWS CloudFormation テンプレートを作成する](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-using-cloudformer.html)
- [AWS CloudFormation デザイナー とは](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer.html)