Former2を使って既存のAWSリソースからテンプレートを生成

既存のAWSリソースからCloudFormationやTerraformのテンプレートを生成できるツール「Former2」を試してみました。

# 環境構築
Former2はWebベースで動作するので、[former2](https://former2.com/) にアクセスすれば利用できます。
自分のAWSリソースにアクセスするための認証情報を登録する必要がありますが、サードパーティのツールに機密情報を入力したくない場合はDockerを使ってローカルにサクッと環境構築できます。

```bash
git clone https://github.com/iann0036/former2.git
cd former2/
docker-compose up -d
```

`docker-compose.yml`をのぞいてみると以下のような感じでした。

```yaml:docker-compose.yml
version: '3'
services:
  former2:
    image: nginx:1.17.8-alpine
    ports:
      - "127.0.0.1:80:80"
    volumes:
    - .:/usr/share/nginx/html
```

# IAMユーザーの作成

先にFormer2からAWSリソースにアクセスするためのIAMユーザーを作成します。
コンソール画面にアクセスする用途では使いませんので、ここでは「AWSマネジメントコンソールへのアクセス」のチェックは外しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402286/d7d2e22a-2f05-dbcb-8a96-d628cc5e45b2.png)

アタッチするポリシーは「ReadOnlyAccess」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402286/b77f65f5-3214-69da-a3ba-972a9cbda28b.png)

# 初期セットアップ

Chromeで localhost(127.0.0.1) へアクセスすると初期セットアップのウィザードが表示されます。
ブラウザの拡張機能が必要になりますので、該当するブラウザのリンクをクリックしてインストールしてから次へ進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402286/8df5f3bd-26b0-7a71-d7a7-d970c4dca73f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402286/25b586c4-7676-a469-4ad5-5dec3ef9b852.png)

続いて、クレデンシャルを入力します。
事前に作成したIAMユーザーのアクセスキーID / シークレットアクセスキーを入力して次へ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402286/c3f5374f-7b1d-de6b-b125-dd8840cea991.png)

次はパラメータです。
CloudFormationのパラメータを定義しておけるようですが、何も入力しないままで次へ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402286/de3db2be-3a85-1f9e-4087-43b48bb73e35.png)


最後の各種設定が表示されますが、とりあえずデフォルトのままで「Go to Dashboard」を押して完了させます。
ここで無理に「Scan Account」を押してリソースをスキャンしなくても良いみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402286/c8065a71-d628-281f-aaef-1f2e07cbbf7e.png)

コンソール画面とよく似たダッシュボードが表示されます。
リージョンが「バージニア北部」になっているので「東京」に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402286/e4c6dad5-464e-01af-d58f-e56591e0b0a4.png)

試しに、VPCを開いて既存のものにチェックを入れて「Add Selected」 → 「Generate」を押してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402286/9dedbf1e-b28b-08dc-f15d-ec3dd44920de.png)

YAML形式でCloudFormationのテンプレートが生成されました！

```yaml
AWSTemplateFormatVersion: "2010-09-09"
Metadata:
    Generator: "former2"
Description: ""
Resources:
    EC2VPC:
        Type: "AWS::EC2::VPC"
        Properties:
            CidrBlock: "10.0.0.0/16"
            EnableDnsSupport: true
            EnableDnsHostnames: false
            InstanceTenancy: "default"
            Tags: 
              - 
                Key: "Name"
                Value: "cloud01-vpc"
```

左側メニューのOutputsから出力形式を変更できます。
Terraformにするとこんな感じ。

```hcl
terraform {
    required_providers {
        aws = {
            source = "hashicorp/aws"
            version = "~> 3.0"
        }
    }
}

provider "aws" {
    region = "ap-northeast-1"
}

resource "aws_vpc" "EC2VPC" {
    cidr_block = "10.0.0.0/16"
    enable_dns_support = true
    enable_dns_hostnames = false
    instance_tenancy = "default"
    tags {
        Name = "cloud01-vpc"
    }
}
```

最後に、不要になったらDockerは停止しておきましょう

```bash
docker-compose down
```


# まとめ

昔はCloudFormerというツールがあったんですが、かなり使いにくかったのを覚えています。
今回のFormer2はセットアップも簡単で、UIも非常にわかりやすくて使いやすそうですね！

リソースIDなどの固有情報はべた書きされるようなので、他リソースを参照するよう関数を利用したり、冗長な部分は変数化するなどの工夫は必要になってきますが、既存リソースからコード化できるのはIaCの学習にはとても役立ちそうだと感じました。

以上、参考になれば嬉しいです。


# 参考リンク
- [former2](https://former2.com/)

- [知らなかった事を後悔した。既存のリソースからCloudFormationのテンプレート生成 Former2 の紹介](https://dev.classmethod.jp/articles/former2/)