前職ではSREなのってたけどTerraform使ったことないというあるまじき状況だった。なんでや。
新しい仕事先でちょうどGCPを管理する権限をいただいたので、Terraform0.12でGoすることにした。とはいえ、情報が古いものも多く、どうかくのかわかんねーとかいうのも。
お金。
細かいやり方なので、正直こうするのがベストいプラクティスってわけのもんじゃない。
変数
terraformコマンドは実行した階層のtfファイルを全部読み込んでくれるので、variable.tfに記述していく。
variable “なんとかかんとか”っていう書き方。そのあとdefaultってのがあるんだけど、この中はworkspaceごとの設定を書く。僕は環境ごとに入れる値を変更したかったので、workspaceをつかった。ので、こういう書き方になった。とくに分けることもないならdefaultイコールなんちゃらでいいみたい。
tfファイル
実際に書くtfファイル。
GCPのVPCを作る設定。なんか詳しいのは公式ドキュメントみればいいんだけど、ここでは変数とworkspaceのとこ。
変数は「var.[variable.tfで設定した変数]」で見ることができる。0.11までは「”${}”」で囲まなきゃいけなかったぽくて、試してみたけど「そんな古い書き方してんじゃねえよ」って怒られる。すみませんでした。
workspaceごとの変数を参照する方法はlookupを使うとうまく行った。「lookup(var[変数名],”${terraform.workspace}”)」で上手に切り替わってくれる。僕の場合はproduction / stagingとかで切り替えたかったので、こういうやり方にした。
なんでworkspace増やしたかって、将来的に日本だとかアメリカだとか複数リージョンに跨がる設定が増えるかもしれない、という要件だったのでこの形にした。これなら新しい環境作るときはworkspace切って、variable.tfにworkspace名の変数増やせばいい。それもそれで面倒なときもあるかもしれないけど。
モジュール
terraformのモジュールは今自分がいる階層のmain.tfとかの最後に書く。
module〜module〜っていろんなところで言われているけど、みんなどうしてるんだろ、と思ってたけど、なんとなくふに落ちた。これを使いこなすとworkspaceいらなさそうだけど、そこまでうまくいけそうにないので、ここはプロダクトごとにわけるくらいにした。
ただmodule単位でvariable.tf書かなくてはならなくなったので、そうではない方法が多分あるんだろうけど一旦このままでいいや、という感じ。
実行と試験
これは今まで?と同じ。多分他にもあるんだろうけどあとで追記。
import
最初手作業でやっちまった、っていうのをimportしたりする。これはterraformの機能というより、サードパーティになる。
僕はterraformingを使った。
インストールはhomebrewでいけたし、割とたくさんのプラットフォームに対応しているのでいいかも。ただリソースによってはだしてくれないものもあって、その辺りはtfファイルに書いてあげなくてはいけない。僕の場合はCloudSQLとCloudrunは取り出せなかった。
まとめ
完璧に理解した。