created: 2022-03-06T09:05:38.000Z

GCP のプロジェクトで Terraformer を使ってみる

インストール

インストールまでは brew でできる。 terraform 自体のバージョンとの互換性をちゃんとしておいた方がよさそうなので、tfenv でサポート対象のバージョンを入れておく。

$ which terraformer
/usr/local/bin/terraformer
$ terraform version
Terraform v0.13.7

下準備

前もって準備をすることがいくつかある。

plugin をコピーしておく

2022/03/06 17:15:19 open ~/.terraform.d/plugins/darwin_amd64: no such file or directory

利用する前にディレクトリ(~/.terraform.d/plugins/{darwin,linux}_amd64/)を作成し、ここにプロバイダをインストールしておく必要があります。

ここから最新のプロバイダをもってきて使う

APIを有効にする

Compute Engine を使っていない場合でも Compute Engine API を有効にしておく必要がある。有効にしていないと実行時に以下のようなエラーがでる。

2022/03/06 17:29:48 googleapi: Error 403: Compute Engine API has not been used in project 123456789101 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/compute.googleapis.com/overview?project=123456789101 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

実行

$ terraformer import google --resources=bigQuery,gcs,logging,project,cloudFunctions,iam,pubsub --projects=$GCP_PROJECT_ID

以下のようにファイルが生成される。

$ tree
.
└── generated
    └── google
        └── proj-123456
            ├── bigQuery
            │   └── global
            │       ├── bigquery_dataset.tf
            │       ├── bigquery_table.tf
            │       ├── outputs.tf
            │       ├── provider.tf
            │       └── terraform.tfstate
            ├── cloudFunctions
            │   └── global
            │       ├── provider.tf
            │       └── terraform.tfstate
            ├── gcs
            │   └── global
            │       ├── outputs.tf
            │       ├── provider.tf
            │       ├── storage_bucket.tf
            │       ├── storage_bucket_acl.tf
            │       ├── storage_bucket_iam_binding.tf
            │       ├── storage_bucket_iam_policy.tf
            │       ├── storage_default_object_acl.tf
            │       └── terraform.tfstate
            ├── iam
            │   └── global
            │       ├── outputs.tf
            │       ├── project_iam_member.tf
            │       ├── provider.tf
            │       ├── service_account.tf
            │       └── terraform.tfstate
            ├── logging
            │   └── global
            │       ├── provider.tf
            │       └── terraform.tfstate
            ├── project
            │   └── global
            │       ├── outputs.tf
            │       ├── project.tf
            │       ├── provider.tf
            │       └── terraform.tfstate
            └── pubsub
                └── global
                    ├── provider.tf
                    └── terraform.tfstate

感想

生成されるコードのリソース名などはヒューマンリーダブルではない。「terraformer import したコードをもとにして terraform 化をしていくためのツール」という話かなと思っていたので少し勘違いをしていた。

$ head -1 ./generated/google/proj-123456/iam/global/project_iam_member.tf
resource "google_project_iam_member" "tfer--roles-002F-cloudbuild-002E-builds-002E-builderserviceAccount-003A-123456789101-0040-cloudbuild-002E-gserviceaccount-002E-com" {

「生成されたコードをもとに tf ファイルを育てていく」という使い方ではなく、「tfファイルを実装するために参考にするコードを履くツール」のようだ。

参考