TerraformでGoogle Cloudを扱うためのローカル端末環境構築

Terraformで必要になるGoogle Cloudの秘密鍵の取得しTerraformでリソース作成してみました。
2021.06.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Google Cloudデビューしました。初っ端からTerraformを強制されているわけではないのですが、どうしてもTerraformを使う必要がありました。Google Cloudの知識がない状態で調べながら設定していきます。

目的

  • Terraformに必要なGoogle Cloudの秘密鍵(認証情報)を発行する
  • ローカル端末からTerraformを使ってGoogle Cloud上にリソースを作成する

Terraformの導入

MacへTerraform導入方法は以下のブロブポストを参照ください。

環境情報

項目
Mac Mac OS X 10.15.7
Terraform v1.0.0

TerraformのGoogle Cloud設定

以下リンクのTerraformのドキュメントを参考に進めます。結局、わからないこといっぱいでいろいろと調べながら進めました。文中には要所要所で参照したリンクを、最後には全体通して参考にさせて頂いたサイトをまとめています。

Terraformは動作確認用のリソースを作成するだけです。メインはTerraformを実行するためのGoogle Cloudの秘密鍵(認証情報)をどう作成して、どうTerraformで使うかです。

  1. Google Cloudで秘密鍵(認証情報)を発行しダウンロード
  2. Terraformを実行して、Google Cloud上にVPC(Virtual Private Cloud)を作成
  3. Terraformでリソース作成できたこと確認

Google Cloud設定

実現したいことは特定のプロジェクトに対してローカル端末からTerraformを実行してリソースを作成したいです。プロジェクトに対して必要な秘密鍵・権限を持つサービスアカウントを作成し、秘密鍵をローカル端末に保存することになりました。

最初にプロジェクトを作成します。プロジェクトIDはohmura-yasutakaとしたプロジェクトを作成しました。

Google Cloud Shellからサービスアカウントの作成と、権限の付与を行います。GCPコンソールから権限付与の方法がわからなく諦めた結果CLIが早かったです。また、ローカル端末でgcloudコマンドを打てる環境も用意できていないため、WEBブラウザからGCPコンソールへログインしCloud Shellを活用してコマンドを実行していきます。

gcloud config set project [PROJECT_ID]コマンドでこれから作業するプロジェクトを指定します。

gcloud config set project ohmura-yasutaka

gcloud iam service-accounts createコマンドでサービスアカウントを作成しました。サービスアカウントは人以外使う用途のユーザです。今回はTerraform用のユーザとしてサービスアカウントを用意します。

gcloud iam service-accounts create terraform-account \
  --display-name "Used by Terraform on the local machine"

次にサービスアカウントに権限を付与します。サービスアカウントterraform-accountに対してgcloud projects add-iam-policy-bindingコマンドで編集者(Editor)ロールを付与しました。権限がオーナー(Owner)よりは弱い権限ではあるのですがGoogle Cloud初見で最小権限に絞るのは無理がありました。terraform applyを打てるのは数カ月後のことでしょう、現時点ではEditorが妥当と判斷として設定します。

gcloud projects add-iam-policy-binding ohmura-yasutaka \
  --member serviceAccount:terraform-account@ohmura-yasutaka.iam.gserviceaccount.com \
  --role roles/editor

GCPコンソールからサービスアカウントを開きました。コマンドで作成したサービスアカウントの権限タブから確認するとメンバーに作成したサービスアカウント名が追加され、ロールに編集者(Editor)として登録されていました。

最後に秘密鍵を作成しファイルをダウンロードします。鍵の管理をクリック。

新しい鍵を作成をクリック。

JSON形式で作成します。

JSONファイルがダウンロードされました。

ダウンロードしたファイルは任意の場所に保存します。鍵の名前はaccount.jsonにリネームしました。

Terraform実行テスト

東京リージョンにVPCを作成して秘密鍵が有効か、リソースを作成する権限はあるのか確かめます。Google CloudのProviderの最新バージョンは以下のリンクより確認しました。

main.tf

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "3.72.0"
    }
  }
}

provider "google" {
  credentials = file("ダウンロードしたJSONファイルへのフルパス")

  project = "ohmura-yasutaka"
  region  = "asia-northeast1"
  zone    = "asia-northeast1-a"
}

resource "google_compute_network" "vpc_network" {
  name = "terraform-network"
}

terraform initで初期化とGoogle CloudのProviderをダウンロードして、terraform applyでリソース作成します。

$ terraform init
$ terraform plan
$ terraform apply

問題なく終了しました。秘密鍵、権限は問題ないようです。

GCPコンソールからVPCの作成を確認しました。本当に問題ないようです。

作成したリソースを削除します。

$ terraform destroy

GCPコンソールからだと削除したできたという証明のキャプチャが難しかったので、Cloud ShellからVPC一覧を確認しました。defaultのVPC以外存在していないことが確認できました。これでTerraformでGoogle Cloudを管理できる!

$ gcloud compute networks list
NAME     SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
default  AUTO         REGIONAL

目的は達成しました。手を動かすときはTerraformでGoogle Cloudにリソース作成できる最低限の環境を準備できました。

おわりに

Google Cloudではサービスアカウントと権限付与だけできれば、後はTerraformのお作法の話になります。Google Cloud初見でがんばるポイントはわずかでした。用語がわからなくて調べながらだったので時間はかかりましたが。Google Cloudの秘密鍵(JSONファイル)をTerraformへ渡す方法は他にもあるようなので改めて調べてみます。ここについて以下のリンクを見て思いました。

参考