我将Terraform的秘密迁移到GC SecretManager后,运维变得更加轻松

这是什么东西?

我现在在这个项目中负责terraform的运营,我们之前是把terraform使用的敏感信息(如数据库密码)存储在Bitwarden中。
然后我们把这些信息迁移到了GCP Secret Manager,结果发现这样做挺好的。

之前的操作方式

    • シークレットは各環境別で分け、Bitwardenに格納

 

    • ローカルにsecret.variable.tfなどの名前でシークレットファイルを作成し、Bitwardenからコピペしてきて利用

 

    シークレットファイルはgitignoreしてプッシュしないように運用

将SecretManager托管的原因

因为有更多的成员开始使用Terraform,保持使用Bitwarden变得困难。

    • Bitwardenからコピペする作業が発生することによって

メンバーが増えた時の説明(オンボーディング)がダルい
Bitwardenでシークレットを更新すると、メンバー全員にローカル更新するよう呼びかける必要がある

Bitwardenだとバージョニングができず、管理上よくない
誤って誰かがシークレットファイルをGitリモートプッシュしてしまうリスク

程式碼

从SecretManager中获取最新版本的值,并将其作为data存储在本地变量中。

# 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)和密钥名称(db-root-password-1)命名为不同的名称,但实际上最好将它们起相同的名称。
※ 如果一次性应用上述 Terraform,只会创建 SecretManager 密钥,但没有版本(内容),会导致引用错误,因此需要事先创建密钥和版本,然后使用 terraform import 等进行操作。

秘密管理者中的秘密,可以手动以json格式存储值,并将其设置为最新版本。

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

然后,我们将其作为本地变量正常使用.

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

作为替代方案,可以直接将秘密数据输入,而不需要通过本地变量。
但是,我认为在本地变量中定义更容易阅读和管理秘密数据。

password = jsondecode(data.google_secret_manager_secret_version.gcp_secrets.secret_data)["db-password-1"]
广告
将在 10 秒后关闭
bannerAds