1
1

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 1 year has passed since last update.

TerraformシークレットをGC SecretManagerに移行したら運用が楽になった話

Last updated at Posted at 2023-04-29

これは何?

今のプロジェクトでterraform運用を主導しているのですが、terraformで利用する秘匿情報(DBパスワード等)はBitwardenに格納していました。
これをGCP Secret Managerに移管したら結構良いことがあったという話です。

それまでの運用

  • シークレットは各環境別で分け、Bitwardenに格納
  • ローカルにsecret.variable.tfなどの名前でシークレットファイルを作成し、Bitwardenからコピペしてきて利用
  • シークレットファイルはgitignoreしてプッシュしないように運用

SecretManagerに移管した理由

Bitwardenのままだと、terraformを触るメンバーが増えた時に辛かったからです。

  • Bitwardenからコピペする作業が発生することによって
    • メンバーが増えた時の説明(オンボーディング)がダルい
    • Bitwardenでシークレットを更新すると、メンバー全員にローカル更新するよう呼びかける必要がある
  • Bitwardenだとバージョニングができず、管理上よくない
  • 誤って誰かがシークレットファイルをGitリモートプッシュしてしまうリスク

コード

SecretManagerから最新バージョンの値をdataとして取得してきて、ローカル変数にまとめて格納します。

secret.tf
# Terraformで利用するシークレット
resource "google_secret_manager_secret" "terraform_secrets" {
  secret_id = "TERRAFORM_GCP"
  replication {
    automatic = true
  }
} 

# シークレットから最新バージョンを取得する設定
data "google_secret_manager_secret_version" "gcp_secrets" {
  secret = google_secret_manager_secret.terraform_secrets.id
  version  = "latest"
}

# シークレットの値をローカル変数に格納
locals {
  db-pass-1 = jsondecode(data.google_secret_manager_secret_version.gcp_secrets.secret_data)["db-password-1"]
  db-pass-2 = jsondecode(data.google_secret_manager_secret_version.gcp_secrets.secret_data)["db-password-2"]
}

上では説明の都合上、ローカル変数名(db-pass-1)・Secretキー名(db-root-password-1)で異なる名前にしていますが、実際は普通に一緒にした方がいいです。
※ 上記tfを一気にapplyすると、SecretManagerキーだけ作成されてバージョン(中身)がなく参照エラーになるので、キーとバージョンをあらかじめ作成しておき terraform import するなど必要です。

SecretManagerシークレットには、手動で下記のようにjson形式で値を格納して最新バージョンとします。

{
  "db-password-1" : "password1", 
  "db-password-2" : "password2", 
}

あとは、普通にローカル変数として利用します。

cloudsql-user.tf
resource "google_sql_user" "user-1" {
  instance = "test-instance"
  host     = ""
  name     = "user-1"
  password = local.db-pass-1
}

別解として下記の通り、ローカル変数を介さず直接secretデータを入れ込めます。
ただ、ローカル変数で定義しておいた方が、シークレットがまとまって見やすいと思います。

password = jsondecode(data.google_secret_manager_secret_version.gcp_secrets.secret_data)["db-password-1"]
1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?