【#DevOps】Google社が開発した Terraformer というツールを使って既存のAWS環境の「Infrastructure as Code(IaC)」化を行う #Terraform #Terraformer #AWS #jawsug

Google社が既存環境から`Terraform`のtfファイルを生成する`Terrafomer`という名前のツールを開発/公開しています↓

■GitHub - GoogleCloudPlatform/terraformer 
https://github.com/GoogleCloudPlatform/terraformer

なんと、この`Terrafomer`は、Google社が開発していますが、GCPだけではなくAWSなどの他クラウドにも対応しています。

今回、この`Terraformer`を使用して既存のAWS環境を『Infrastructure as Code（IaC）』化してみたので、その際の内容を自分用のメモとしてまとめました。

#### 実行環境の環境情報
|OS/ソフトウェア |バージョン |入手元 |
|------------|----------|-------|
|Windows 10 pro |バージョン1803(April 2018 Update) |Microsoft Corporation |
|aws-cli |1.16.200 |https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html |
|Go |1.12.7 |https://golang.org/dl/ |
|terraform |v0.12.6-dev |https://github.com/hashicorp/terraform |
|terraformer |version v0.7.6 |https://github.com/GoogleCloudPlatform/terraformer |

## 1.事前準備

### □手順 1-1: `aws-cli`のインストール

AWS環境を対象に`Terraformer`を実行するためには`aws-cli`をインストールしておく必要があります。

ここでは、`aws-cli`のインストール手順は割愛しますが、管理者権限を持たないWindows環境に`aws-cli`をインストール手順については↓に記載していますので参考にしてください。

[【#awscli】管理者権限を持たないWindows環境に「AWSコマンドラインインターフェイス(aws-cli)」をインストールする #AWS #jawsug #環境構築 #環境設定]
(https://qiita.com/kukita/items/6f19025ba9fea29f281c)

### □手順 1-2: `Go`のインストール

`Terraformer`をインストールするために`Go`をインストールします。

ここでは、`Go`のインストール手順は割愛しますが、管理者権限を持たないWindows環境に`Go`をインストール手順については↓に記載していますので参考にしてください。

[【#Go言語】管理者権限を持たないWindows環境に「Go」と「Visual Studio Code(vscode)」をインストールする #golang #golangjp #vscode #環境構築 #環境設定](https://qiita.com/kukita/items/641df7dbb3116811ee86)

### □手順 1-3: `aws configure`コマンドを実行して認証情報などを記録させます

```powershell
PS C:\> & aws configure
拡張子 .py のファイルの関連付けが見つかりません
AWS Access Key ID [None]: <My AWS Access Key>
AWS Secret Access Key [None]: <AWS Secret Access Key>
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

#### `--profile`オプションを付与することでプロファイルの作成も可能です

デフォルトのプロファイルには読み取り権限のみをもったアカウントを登録しておき変更可能な権限は`DevOps`、`Developers`などのプロファイルに紐付けておけば誤った変更などを避けられるので安全です

```powershell
PS C:\> & aws configure --profile DevOps
拡張子 .py のファイルの関連付けが見つかりません
AWS Access Key ID [None]: <My AWS Access Key>
AWS Secret Access Key [None]: <AWS Secret Access Key>
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

### □手順 1-4: まずは `go get`コマンドを使って`Terraform`をインストールします

```powershell
PS C:\> & go get -v -u github.com/hashicorp/terraform
```

```powershell
PS C:\> & terraform --version
Terraform v0.12.6-dev
```

### □手順 1-5: 同様に`go get`コマンドを使って`Terraformer`をインストールします

```powershell
PS C:\> & go get -v -u github.com/GoogleCloudPlatform/terraformer
```

```powershell
PS C:\> & terraformer --version
version v0.7.6
```

## 2. `Terraformer`による既存のAWS環境からのtfファイルの生成

### □手順 2-1: tfファイルを生成するための作業フォルダを作成します（ここでは`MyAWSTerraformManifests`という名前のフォルダを使用します）

```powershell
PS C:\> New-Item -ItemType Directory -Path $env:GOPATH\src\MyAWSTerraformManifests


    ディレクトリ: C:\Users\xxxxxx\gocode\src


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       YYYY/MM/DD     hh:mm                MyAWSTerraformManifests
```

### □手順 2-2: 任意のテキストエディタで`init.tf`ファイルを作成します

```text:$env:GOPATH\src\MyAWSTerraformManifests\init.tf
provider "aws" {
  region  = "ap-northeast-1"
}
```

### □手順 2-3: `terraform init`コマンドを実行します

#### 次のように表示されれば成功です

```powershell
PS C:\> cd $env:GOPATH\src\MyAWSTerraformManifests
PS C:\> & terraform init

Initializing provider plugins...
- Checking for available provider plugins on https://releases.hashicorp.com...
- Downloading plugin for provider "aws" (2.21.0)...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.aws: version = "~> 2.21"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```

### □手順 2-4: `terraformer import aws ~`を実行します

```powershell
terraformer import aws --regions=ap-northeast-1 --resources=ec2_instance
terraformer import aws --regions=ap-northeast-1 --resources=elb
terraformer import aws --regions=ap-northeast-1 --resources=iam
terraformer import aws --regions=ap-northeast-1 --resources=rds
terraformer import aws --regions=ap-northeast-1 --resources=route53
terraformer import aws --regions=ap-northeast-1 --resources=s3
terraformer import aws --regions=ap-northeast-1 --resources=sg
terraformer import aws --regions=ap-northeast-1 --resources=subnet
terraformer import aws --regions=ap-northeast-1 --resources=vpc
terraformer import aws --regions=ap-northeast-1 --resources=vpn_connection
terraformer import aws --regions=ap-northeast-1 --resources=vpn_gateway
```

#### □手順 2-5: `generated`というフォルダ下に各種tfファイルが生成されます

```powershell
PS C:> & tree /F
フォルダー パスの一覧:  ボリューム Local Disk
ボリューム シリアル番号は XXXX-XXXX です
C:.
│  init.tf
│
├─.terraform
│  └─plugins
│      └─windows_amd64
│              lock.json
│              terraform-provider-aws_v2.20.0_x4.exe
│
└─generated
    └─aws
        ├─ec2_instance
        │  └─ap-northeast-1
        │          instance.tf
        │          outputs.tf
        │          provider.tf
        │          terraform.tfstate
        │          variables.tf
        │
        ├─elb
        │  └─ap-northeast-1
        │          elb.tf
        │          outputs.tf
        │          provider.tf
        │          terraform.tfstate
        │          variables.tf
        │
        ├─iam
        │  └─ap-northeast-1
        │          iam_group.tf
        │          iam_group_membership.tf
        │          iam_policy.tf
        │          iam_policy_attachment.tf
        │          iam_role_policy.tf
        │          iam_user.tf
        │          outputs.tf
        │          provider.tf
        │          terraform.tfstate
        │
        ├─rds
        │  └─ap-northeast-1
        │          db_instance.tf
        │          db_option_group.tf
        │          db_parameter_group.tf
        │          db_subnet_group.tf
        │          outputs.tf
        │          provider.tf
        │          terraform.tfstate
        │          variables.tf
        │
        ├─route53
        │  └─ap-northeast-1
        │          outputs.tf
        │          provider.tf
        │          route53_record.tf
        │          route53_zone.tf
        │          terraform.tfstate
        │
        ├─s3
        │  └─ap-northeast-1
        │          outputs.tf
        │          provider.tf
        │          s3_bucket.tf
        │          s3_bucket_policy.tf
        │          terraform.tfstate
        │
        ├─sg
        │  └─ap-northeast-1
        │          outputs.tf
        │          provider.tf
        │          security_group.tf
        │          terraform.tfstate
        │
        ├─subnet
        │  └─ap-northeast-1
        │          outputs.tf
        │          provider.tf
        │          subnet.tf
        │          terraform.tfstate
        │          variables.tf
        │
        ├─vpc
        │  └─ap-northeast-1
        │          outputs.tf
        │          provider.tf
        │          terraform.tfstate
        │          vpc.tf
        │
        ├─vpn_connection
        │  └─ap-northeast-1
        │          outputs.tf
        │          provider.tf
        │          terraform.tfstate
        │          variables.tf
        │          vpn_connection.tf
        │
        └─vpn_gateway
            └─ap-northeast-1
                    outputs.tf
                    provider.tf
                    terraform.tfstate
                    variables.tf
                    vpn_gateway.tf
```
## 3. 生成した tfファイルを HCL2 にアップグレードします

現時点の`Terraformer`の最新バージョン`v0.7.6`が生成するtfファイルは、`Terraform 0.12`以降採用された`HCL2`に対応していないため、手動でアップグレードを行う必要があります

### 3-1. `terraform 0.12upgrade`コマンドの実行

```powershell
Get-ChildItem -Path ".\generated\aws\" | %{$path = $_.FullName + "\ap-northeast-1\"; echo $path; & terraform 0.12upgrade -yes -force $path}
```

### 3-2. `terraform validate`コマンドによる確認

```powershell
Get-ChildItem -Path ".\generated\aws\" | %{$path = $_.FullName + "\ap-northeast-1\"; echo $path; & terraform validate $path}
```

#### 私の環境では`terraform validate`コマンドを実行した結果いくつかエラーが出力されてしまいました。`Terraformer`側に未だいくつかの不具合があるようで、ある程度は手動で修正を行う必要がありそうです。

---

以上、`Terraformer`を使用して既存のAWS環境から`Terraform`のtfファイルを生成する手順でした。