4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GCPサービスアカウントの借用でterraformを実行する

Posted at

はじめに

以前書いた記事、サービスアカウントを借用で使うでは、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単体で使う際にサービスアカウントキーを発行する必要性はさらに低くなりました。
こうやって、情報漏洩リスクにおびえることなく開発に集中できる状況を作っていきましょう。

参考

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?