はじめに
以前書いた記事、サービスアカウントを借用で使うでは、gcloudコマンドを実行する際にサービスアカウントの借用を実施して、ローカルにサービスアカウントキーを持つことなくサービスアカウントの権限でコマンド実行できるようにしました。
そこからの派生版で、terraformの実行でもサービスアカウントの借用を使ってみましょう、というのが今回の話です。
よくあるサービスアカウントの使い方
terraformでサービスアカウントキーを用いるときも、キーファイル(json)へのパスを指定するというので、基本はgcloudコマンドの時と大差ありません。(サービスアカウントキーの発行方法は以前の記事に記述しているので割愛)
方法1. terraformソースコートで指定
適当なtfファイルに以下の記述を追加します。
provider.tf
provider "google" {
credentials = file("/path/to/serviceaccount-key.json")
project = "YOUR-GCP-PROJECT"
region = "YOUR-GCP-REGION"
}
方法2. 環境変数で指定
terraformコマンドを実行するターミナルで、環境変数として設定します。
$ export GOOGLE_APPLICATION_CREDENTIALS="/path/to/serviceaccount-key.json"
サービスアカウント取扱注意
前述の以前書いた記事の通り、サービスアカウントキーをダウンロードして用いることはリスクがあります。今回のようにterraformを用いたインフラ管理をするとなると、なおのことキーファイルをterraformソースのディレクトリに置いていて、ソースはgit管理で、となるでしょうから、ファイルをgitに上げてしてしまう事故の可能性はさらに高まるかと思われます。
サービスアカウントの借用
借用のメリットについては、以前の記事に書いている通りなので割愛します。
terraformでの借用実施は、実際のterraformソースコードにて行います。
variable "impersonate_serviceaccount" {
type = string
default = "sa-terraform-executor@PROJECT_ID.iam.gserviceaccount.com"
}
provider "google" {
alias = "tokengen"
}
# get config of the client that runs
data "google_client_config" "default" {
provider = google.tokengen
}
data "google_service_account_access_token" "sa" {
provider = google.tokengen
target_service_account = var.impersonate_serviceaccount
lifetime = "1800s"
scopes = ["userinfo-email", "cloud-platform"]
}
/******************************************
GA Provider configuration
*****************************************/
provider "google" {
access_token = data.google_service_account_access_token.sa.access_token
project = var.project
}
provider "google-beta" {
access_token = data.google_service_account_access_token.sa.access_token
project = var.project
}
google_service_account_access_token
を用いてトークンを取得し、それプロバイダのアクセストークンとして用いる、というのが大まかな仕組みです。
ここで指定される lifetime
は生成したトークンの生存時間です。3600s(3600秒 = 60分)を最大に設定可能です。terraform実行途中で有効期限が切れてしまわないよう、構築の規模感に応じて設定するのが良いでしょう。
まとめ
これで、GoogleCloud単体で使う際にサービスアカウントキーを発行する必要性はさらに低くなりました。
こうやって、情報漏洩リスクにおびえることなく開発に集中できる状況を作っていきましょう。