HashicorpからTerraformのイメージが公式でDocker Hubに公開されています。
https://hub.docker.com/r/hashicorp/terraform
こちらを利用してGCPにインフラをデプロイします。その際に認証の部分もDockerの公式イメージだけで対応してみようと思います。
利用するTerraform定義
まず、ネットワーク作成するためのTerraformの定義を作成しておきます。
mkdir gcp_infra
cat <<EOF > gcp_infra/main.tf variable "gcp_project" {} provider "google" { version = "~> 3.3" project = var.gcp_project } resource "google_compute_network" "network" { name = "yomon8-network" } EOF
プロバイダーをインストールします
Googleのプロバイダーが必要なのでインストールします。ここまでは問題無く実行できるはずです。
docker run -it \ -v $(pwd)/gcp_infra:/infra \ -w /infra hashicorp/terraform:light init
Applyは認証が必要
次にplan飛ばしてapplyをしてみます。
docker run --rm -it \ -v $(pwd)/gcp_infra:/infra \ -w /infra hashicorp/terraform:light apply
当然認証が必要です。認証情報が無いと怒られました。
Error: google: could not find default credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information. on main.tf line 2, in provider "google": 2: provider "google" {
gcloudの公式イメージで認証情報取得
GCPのCLIであるgcloudですが、こちらも公式のDockerイメージが公開されています。
https://hub.docker.com/r/google/cloud-sdk
これを使って認証情報取得します。
では早速、 gcloud auth application-default login
コマンドで認証情報を取得します。
docker run -it \ --name gcloud-config \ google/cloud-sdk:alpine \ gcloud auth application-default login
認可のURLが発行されるので、これを使ってOAuth2のプロセス踏んで認可していきます。
取得したコードを入れると application_default_credentials.json
がDockerイメージ上にダウンロードされます。
Enter verification code: xxxxxxxxx Credentials saved to file: [/root/.config/gcloud/application_default_credentials.json]
認証情報のイメージ間使い回し
ここが面白いところで、この認証情報のjsonが入っているディレクトリはVolumeとして切り出されています。
$ docker inspect gcloud-config "Mounts": [ { "Type": "volume", "Name": "b2c1f16163bcc0276f2127d48aaa324a5198e17c96b83faf11c9b0c50a3def11", "Source": "/var/lib/docker/volumes/b2c1f16163bcc0276f2127d48aaa324a5198e17c96b83faf11c9b0c50a3def11/_data", "Destination": "/root/.config", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
このVolumeを以下のように --volumes-from
オプションで、別イメージ(今回はTerraformのイメージ)から利用することができます。
docker run --rm -it \ --volumes-from gcloud-config \ -v $(pwd)/gcp_infra:/infra \ -w /infra hashicorp/terraform:light apply
これで問題無くTerraformが実行できるようになりました。
[おまけ] gcloudを利用する場合
同じ考え方でgcloudコマンドを使った処理も可能です。
ここではGCEの踏み台にsshしてみます。
この場合は gcloud auth application-default login
ではなく gcloud auth login
を利用してGCPにログインします。
docker run -it --name gcloud-credentials google/cloud-sdk:alpine gcloud auth login
後は同じように --volumes-from
で指定しながら gcloudコマンドを実行するだけです。
docker run --rm -it \ --volumes-from gcloud-credentials \ google/cloud-sdk:alpine \ gcloud compute ssh bastion-vm --project your-project