🛕

[GoogleCloudPlatform]から出た[terraformer]を使ってみた

2020/09/27に公開

published_at: 2019-05-05 00:20


2019/5/2 に現れた、GCPリソースをTerraform用のtfファイル化するっぽい
https://github.com/GoogleCloudPlatform/terraformer
を使ってみた。

小さく躓いたものの、使うことはできた。
まだ v0.7 のようだし、今後に注目したい。

自分の狙いは Datastore の Terraform 化(?) だったので、叶わなかったのですが。[1]

実行時環境情報

  • macOS Mojave 10.14.4
  • Terraform v0.11.13
    • provider.google v1.20.0 -> v2.0.0 を指定して terraform init することで upgrade 可能 [2]
  • terraformer v0.7 [3]

インストール

1. Run git clone <terraformer repo>

❯ git clone https://github.com/GoogleCloudPlatform/terraformer.git
Cloning into 'terraformer'...
remote: Enumerating objects: 7025, done.
remote: Counting objects: 100% (7025/7025), done.
remote: Compressing objects: 100% (4238/4238), done.
remote: Total 7025 (delta 2226), reused 7018 (delta 2222), pack-reused 0
Receiving objects: 100% (7025/7025), 32.37 MiB | 5.68 MiB/s, done.
Resolving deltas: 100% (2226/2226), done.
Checking out files: 100% (4230/4230), done.
  • 実はこのあと、fork して ssh で clone し直しましたが。
    • README 直したい気になったので。次のステップとして cd terraformer が抜けてた。細かいですが。

2. Run GO111MODULE=on go mod vendor *

❯ GO111MODULE=on go mod vendor
go: finding github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af
go: finding github.com/Azure/azure-sdk-for-go v10.3.0-beta+incompatible
・・・
go: extracting github.com/golang/protobuf v1.2.0
go: downloading github.com/hashicorp/go-getter v0.0.0-20181119194526-bd1edc22f8ea
verifying github.com/hashicorp/go-getter@v0.0.0-20181119194526-bd1edc22f8ea: checksum mismatch
	downloaded: h1:o+/o9FSMvgMmv5Ss+EUutVEwZfcFR1nJKzOqlVJGFPY=
	go.sum:     h1:B2Aqv5hbW6F55OFgXAcSqGhqKi4Jb6IRLkKoA5ohgzU=

3. Run go build -v

❯ go build -v
$GOPATH/go.mod exists but should not

# おっとお、と思い調整
❯ export GOPATH=
  • ちょっと躓いたところその2。GOPATHを terraformer ディレクトリに設定していたのですが、アダとなったしまっていたようです。クリアしました。
❯ go build -v
go: downloading github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1
go: downloading github.com/hashicorp/go-getter v0.0.0-20181119194526-bd1edc22f8ea
・・・
github.com/GoogleCloudPlatform/terraformer/cmd
github.com/GoogleCloudPlatform/terraformer

# -> 3m 4s で build 完了
❯ ls -lah terraformer
-rwxr-xr-x  1 sogaoh  staff    68M  5  4 22:13 terraformer

4. Copy your Terraform provider's plugin(s) to ~/.terraform.d/plugins/{darwin,linux}_amd64 , as appropriate.

ここは、 terraform plan , terraform apply 実行ディレクトリに生成されている .terraform ディレクトリをまるごとコピー( cp -pr )しました。
.terraform.d にリネームするところがミソかなと思います。

実行してみる!

1. まとめて -> 失敗。。

❯ ./terraformer import google --resources=firewalls,globalAddresses,instances,networks,subnetworks,gcs,dns --connect=true --zone=asia-northeast1-a --projects={MY_PROJECT_ID} --state=bucket
2019/05/04 22:27:31 google importing project {MY_PROJECT_ID}
2019/05/04 22:27:31 google importing... firewalls
2019/05/04 22:27:33 google importing... globalAddresses
2019/05/04 22:27:34 google importing... instances
2019/05/04 22:27:36 google importing... networks
2019/05/04 22:27:38 google importing... subnetworks
2019/05/04 22:27:39 google importing... gcs
2019/05/04 22:27:42 google importing... dns
2019/05/04 22:27:44 project: required field is not set
2019/05/04 22:27:44 project: required field is not set
2019/05/04 22:27:44 project: required field is not set
2019/05/04 22:27:44 project: required field is not set
2019/05/04 22:27:44 project: required field is not set
2019/05/04 22:27:44 project: required field is not set
2019/05/04 22:27:44 project: required field is not set
2019/05/04 22:27:44 project: required field is not set
2019/05/04 22:27:44 project: required field is not set
2019/05/04 22:27:44 project: required field is not set
panic: interface conversion: interface {} is nil, not string

goroutine 1 [running]:
github.com/GoogleCloudPlatform/terraformer/gcp_terraforming.(*CloudDNSGenerator).PostConvertHook(0xc0006a4140, 0x2ff0800, 0xc0006a4140)
	/Users/sogaoh/src/temp/terraformer/gcp_terraforming/clouddns.go:125 +0x6a7
github.com/GoogleCloudPlatform/terraformer/cmd.Import(0x2ff09e0, 0xc0000d4080, 0xc000552000, 0x7, 0x7, 0xc000562030, 0x30, 0x2c20c82, 0x9, 0x7ffeefbff8a6, ...)
	/Users/sogaoh/src/temp/terraformer/cmd/import.go:88 +0x1ad
github.com/GoogleCloudPlatform/terraformer/cmd.newCmdGoogleImporter.func1(0xc0004cef00, 0xc00016d450, 0x0, 0x5, 0x0, 0x0)
	/Users/sogaoh/src/temp/terraformer/cmd/google.go:37 +0x34a
github.com/spf13/cobra.(*Command).execute(0xc0004cef00, 0xc00016d400, 0x5, 0x5, 0xc0004cef00, 0xc00016d400)
	/Users/sogaoh/go/pkg/mod/github.com/spf13/cobra@v0.0.3/command.go:762 +0x465
github.com/spf13/cobra.(*Command).ExecuteC(0xc0004cea00, 0xc0000c8e80, 0xc0000c8e40, 0xc000463f88)
	/Users/sogaoh/go/pkg/mod/github.com/spf13/cobra@v0.0.3/command.go:852 +0x2ec
github.com/spf13/cobra.(*Command).Execute(...)
	/Users/sogaoh/go/pkg/mod/github.com/spf13/cobra@v0.0.3/command.go:800
github.com/GoogleCloudPlatform/terraformer/cmd.Execute(0x0, 0x0)
	/Users/sogaoh/src/temp/terraformer/cmd/root.go:33 +0x28
main.main()
	/Users/sogaoh/src/temp/terraformer/main.go:25 +0x22

~/src/temp/terraformer master* 13s
  • 欲張りすぎたからなのか、 dns を入れたのが悪かったのかは追及しきっていない。

2. 個々で -> 取れた!

❯ ./terraformer import google --resources=networks --connect=true --zone=asia-northeast1-a --projects={MY_PROJECT_ID} --state=bucket
2019/05/04 22:28:59 google importing project {MY_PROJECT_ID}
2019/05/04 22:28:59 google importing... networks
2019/05/04 22:29:01 google Connecting....
2019/05/04 22:29:01 google save networks
2019/05/04 22:29:01 [DEBUG] New state was assigned lineage "0860a5f8-18d7-f500-f206-c74c5d033676"
2019/05/04 22:29:01 google upload tfstate to  bucket
2019/05/04 22:29:02 googleapi: got HTTP response code 404 with body: Not Found
  • 最後の 404 がなんだか気になるものの、リソースあれば tf ファイルが生成されてました。
    • provider.tf しかないのが、そもそもリソースがない or bug で採取失敗という感じっぽい。
      terraformer-1.png (29.0 kB)
      terraformer-2.png (21.7 kB)
    • 自身のGCP環境は非常に小さいので、↑の画像にないリソースは未確認。
      • dns だけ、確認方法がわかっていない。

その他

  • Usage: import google [flags]
    • 頭に ./terraformer つけないのはなんでだろう。。
  • Flags のどれが必須かを書いてほしいな...

なんか、今なら Contribute できちゃいそうな感じがするので、チャレンジしてみたい。

脚注
  1. module でできそうな感じもしているので、そっちは後日に勘で試してみようかなと思っている。 ↩︎

  2. https://www.terraform.io/docs/providers/google/version_2_upgrade.html ↩︎

  3. ./terraformer -v./terraformer --version は使えなかった... -> すぐにfixされた。 refs https://github.com/GoogleCloudPlatform/terraformer/commit/316af851895bd6c0a07198465b8ef7f0313b3066 ↩︎

Discussion