Former2をローカル環境に導入し、既存のAWS環境からCloudFormationの定義を自動生成してみる

# 1. はじめに
## 1.1 この記事の概要
former2をローカル環境に導入し、既存のAWS環境からCloudFormationの定義を作ろうというものです。

## 1.2 Former2をローカルに入れる動機
既存のAWS環境からCloudFormationの定義を作りたくてツールを探し、[https://former2.com/](https://former2.com/)というものを見つけました。
こちらのツール、会員登録等は不要なようで、AWSのアクセスキーを設定するとAWSにアクセスしてCloudFormationの設定を作ってくれる便利なサイトでした。
ただ、、、個人的に第三者が運営するサイトにアクセスキーを設定するのを躊躇してしまい、ローカルに導入できないかと調べたところ、Githubに[former2](https://github.com/iann0036/former2)のソースを見つけたのでローカル環境に導入するものです。


# 2. 本編
## 2-1 Former2の導入
### (1)前準備Ⅰ Docker環境の準備
以下の記事を参考にDockerの実行環境を用意します。
https://qiita.com/ka2taka/items/7889e9a0e01fc0824b66

### (2)前準備Ⅱ AWSのアクセスキーの取得
事前にAWSのアクセスキーを作って控えておきます。
ユーザのポリシーに「arn:aws:iam::aws:policy/ReadOnlyAccess」を与えます。
#### ①[IAM](https://console.aws.amazon.com/iam/)にアクセスする。
[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)

#### ②[アクセス管理]-->[ユーザ]に移動してユーザを作る。
##### ユーザ名を入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324770/6d0c3c24-6928-4052-ad3f-f27a0afefa82.png)
##### ReadOnyAccessを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324770/6e8a8ef2-e77d-70f8-2c02-c321016df5a3.png)
##### Step5まで次へ次へで進む。

#### ③アクセスキーを控える。
ユーザ作成のStep5で「アクセスキー ID」「シークレットアクセスキー」を控える。   


### (3)former2のダウンロード
1. ダウンロード<br>
以下のGithubからダウンロードします。<br>
[https://github.com/iann0036/former2](https://github.com/iann0036/former2)<br>
ZIPでダウンロードするなら以下のURL。<br>
[https://github.com/iann0036/former2/archive/master.zip](https://github.com/iann0036/former2/archive/master.zip)<br>
コマンドで実行するなら以下。<br>
git clone https\://github.com/iann0036/former2.git .
2. 保存先<br>
手順上、以下に解凍して保存します。<br>
C:\work\former2


### (4)docker-composeで構築
```dosbatch:docker-compose実行
C:\work\former2>docker-compose up -d
```
```dosbatch:docker-compose実行結果
Creating network "former2_default" with the default driver
Pulling former2 (nginx:1.17.8-alpine)...
1.17.8-alpine: Pulling from library/nginx
4167d3e14976: Pull complete
db94a93dfca0: Pull complete
Digest: sha256:9e81b8f9cef5a095f892183688798a5b2c368663276aa0f2be4b1cd283ace53d
Status: Downloaded newer image for nginx:1.17.8-alpine
Creating former2_former2_1 ... done
```
ローカル環境の80番ポートを使うようにdocker-compose.ymlファイル内に定義されています。
既に80番ポートを使ってる場合は、ポート番号を変えてから実行してください。
修正例：「127.0.0.1:80:80」--->「127.0.0.1:8080:80」
「127.0.0.1:8080」の部分がWindowsホスト上のポート番号、後半の:80がdockerコンテナ内のポート番号です。この２つがマッピングされてます。

### (5)Former2にアクセス
以下のアドレスをブラウザに入力して、ローカルで起動したformer2にアクセスします。
http\://127.0.0.1/
![former2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324770/44af7ca7-6f39-d643-0422-e25207c1855f.png)


### (6)Former2を設定
①最初の画面にあるブラウザのプラグインを入れます。
画面は前述参照。

②右上からリージョンを選択します。
![former2_1.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324770/7eeb91d5-203c-c374-4d7f-91fd013fe47c.png)

③左メニューから「セットアップ(Setup)-->資格情報(Credentials)」を選択
④IAM認証情報を入力（アクセスキーID、シークレットアクセスキー）
![former2_2_800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324770/db10ebf2-f0c2-7eb6-f134-8d098bef4282.png)

設定の保存ボタンは用意が無いようで、何かメニューを押すと自動で保持されます。
Former2の振る舞いを見ていると、資格情報(Credentials)はサーバサイドに保存されないようなので、忘れないように書き留めておいてください。

## 2-2. Former2の操作(EC2から設定を取得してみる）
### (1) EC2の設定を読み込む操作をする。
① Compute-->EC2に移動。
② リソースを選択して「Add Select」ボタンを押す。
③ 画面上部の「Generate」ボタンを押す。
![former4_mod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324770/bf74866f-e4b5-75e2-07bc-11cbc59fdd3a.png)


### (2) 表示されたCloudFormationの定義を見てみる。
```yaml
AWSTemplateFormatVersion: "2010-09-09"
Metadata:
    Generator: "former2"
Description: ""
Resources:
    EC2Instance:
        Type: "AWS::EC2::Instance"
        Properties:
            ImageId: "ami-#################"
            InstanceType: "t2.micro"
            KeyName: "#########################"
            AvailabilityZone: !Sub "${AWS::Region}a"
            Tenancy: "default"
            SubnetId: "subnet-###################"
            EbsOptimized: false
            SecurityGroupIds: 
              - "sg-#################"
            SourceDestCheck: true
            BlockDeviceMappings: 
              - 
                DeviceName: "/dev/xvda"
                Ebs: 
                    Encrypted: false
                    VolumeSize: 8
                    SnapshotId: "snap-#####################"
                    VolumeType: "gp2"
                    DeleteOnTermination: true
            Tags: 
              - 
                Key: "Name"
                Value: "bastion################"
            HibernationOptions: 
                Configured: false
            EnclaveOptions: 
                Enabled: false

```

# 後始末

```dosbatch:dockerで作った環境を削除
C:\>cd \work\former2
C:\>docker-compose down --rmi all --volumes --remove-orphans
```


# 最後に
### まとめ
1からCloudFormationの設定を作るよりは楽なのではないでしょうか？