Google Cloud Platformの環境をterraformで作る
そもそもGoogle Cloud Platformとは
Googleが出してるAWS的なやつ。GCPと略す。だいたいの比較表。
なんでAWS使わないの?
コンテナでぽんぽんアプリケーションをdeployしたいんだけどそれをAWSでやろうとすると、ECSというサービスを使うことになる。でも、このECSというのがdeployまわりの取り扱いがめんどくさくてちょっといけてない。 で、同じようなコンテナのスケジューリングとかやってくれるソフトウェアでkubernetesというのがあるんだけど、それをAWS上にたてようとするとちょいめんどい。GCPにはGKE(Google Container Engine)というkubernetesのマネージドサービスが最初から用意されてるのでこれを使いたいから。
GCPにおけるprojectという概念
GCPは一つのアカウントに対して、projectという概念を持ってる。たくさんprojectは作ることができる。すごくざっくりだけど、AWSでいうVPCぐらいの単位かも。
GCPにおける地域とゾーン
- AWSでいうregionはGCPだと地域で、アジアだと日本(asia-northeast1)と台湾(asia-east1)がある
- AWSでいうazはGCPだとゾーンと言って、日本には1a〜1cまである。
GCPのprovider
ここからterraformの話。とにもかくにもproviderを定義する。 GOOGLE CLOUD PROVIDER | terraform
provider "google" { credentials = "${file("../account.json")}" project = "elated-bebop-161001" region = "asia-northeast1" }
- account.jsonというのは、GCPのコンソールから認証情報(秘密鍵が書いてある)ファイルをjson形式で落としてきたもの。
- projectは上で言及してるもので全GCP上で一意になるもの。Project名ではなくIDが振られるのでそれを書く。
- regionは地域。ここでは日本を指定する。
terraformの実行🚀
terraformコマンドで直接実行してもいいけど、いろんなprojectを掛け持ちしてるとローカルのversionを揃えるのが大変なので、docker imagesで提供されているものを使う。 参考にしたサイト 実行するときにいろんなことをしたり、長いコマンドうつの面倒なのでRakefileを作ってそれで実行する。
Rakefileの中身とはまったポイント
- 🙅 terraformのdocを見ると
GOOGLE_CREDENTIALS
に認証情報のjsonの中身をつめて渡せばそれを使ってくれるとかいてあったが、これをdockerのコマンドに渡すようにするとstdoutに表示されてしまう - 😓 出力されないように環境変数にjsonの中身をいれようと試行錯誤したが、jsonの末尾の改行を取り除かないといけないのと、private keyが記述されてるのでそこに文字列として
\n
が入っててそれが環境変数として渡すと評価されてしまって改行扱いになってしまう
docker実行時に、GOOGLE_APPLICATION_CREDENTIALS
で認証情報のファイルの場所を渡してあげるようにする💯
@terraform_version = "0.8.8" @docker = %Q(docker run --rm -v ${PWD}:/work -w /work/terraform -e GOOGLE_APPLICATION_CREDENTIALS=/work/account.json hashicorp/terraform:#{@terraform_version}) namespace :tf do task :init do sh %Q(#{@docker} remote config \ -backend=gcs \ -backend-config="bucket=my-first-project-terraform-state-20170309" \ -backend-config="path=terraform.tfstate" \ -backend-config="project=elated-bebop-161001") end task :plan do sh %Q(#{@docker} plan) end end
- GCPの方の https://developers.google.com/identity/protocols/application-default-credentials に
GOOGLE_APPLICATION_CREDENTIALS
を使えって書いてあった。 - これをすれば、providerの方に
credentials = "${file("account.json")}"
って書かなくてOK
まとめ
俺はなぜあんな無駄な時間を・・ by 三井 寿