Docker Hubの公式イメージだけ使ってGCPにTerraformにてデプロイ

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のプロセス踏んで認可していきます。

f:id:yomon8:20200714233038p:plain

f:id:yomon8:20200714233130p:plain

取得したコードを入れると 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