🛕
[GoogleCloudPlatform]から出た[terraformer]を使ってみた
published_at: 2019-05-05 00:20
2019/5/2 に現れた、GCPリソースをTerraform用のtfファイル化するっぽい
を使ってみた。小さく躓いたものの、使うことはできた。
まだ 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]
- provider.google v1.20.0 -> v2.0.0 を指定して
- terraformer v0.7 [3]
インストール
-
https://github.com/GoogleCloudPlatform/terraformer#installation に従って。
- 自分は、ちょいちょい躓きました。(後述)
git clone <terraformer repo>
1. Run ❯ 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
が抜けてた。細かいですが。
- README 直したい気になったので。次のステップとして
GO111MODULE=on go mod vendor
*
2. Run ❯ 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=
- ここがちょっと躓いたところ(その1)。
-
go.sum を
mv go.sum go.sum_
して回避。- 即日、fix された。 refs https://github.com/GoogleCloudPlatform/terraformer/issues/8
-
go.sum を
go build -v
3. Run ❯ 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
- モジュールが完成したっぽい。
- https://github.com/GoogleCloudPlatform/terraformer/releases の Assets があるのに後で気がつき、ここから取ればよかったのでは、と。。
~/.terraform.d/plugins/{darwin,linux}_amd64
, as appropriate.
4. Copy your Terraform provider's plugin(s) to ここは、 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 で採取失敗という感じっぽい。
- 自身のGCP環境は非常に小さいので、↑の画像にないリソースは未確認。
-
dns
だけ、確認方法がわかっていない。
-
- provider.tf しかないのが、そもそもリソースがない or bug で採取失敗という感じっぽい。
その他
- Usage:
import google [flags]
- 頭に
./terraformer
つけないのはなんでだろう。。
- 頭に
- Flags のどれが必須かを書いてほしいな...
なんか、今なら Contribute できちゃいそうな感じがするので、チャレンジしてみたい。
-
module でできそうな感じもしているので、そっちは後日に勘で試してみようかなと思っている。 ↩︎
-
https://www.terraform.io/docs/providers/google/version_2_upgrade.html ↩︎
-
./terraformer -v
や./terraformer --version
は使えなかった... -> すぐにfixされた。 refs https://github.com/GoogleCloudPlatform/terraformer/commit/316af851895bd6c0a07198465b8ef7f0313b3066 ↩︎
Discussion