terraform 从 gcp secret 创建 k8s secret

terraform create k8s secret from gcp secret

我已经设法实现了在 terraform 中创建敏感资源的流程,而没有在任何时候透露敏感细节是什么,因此不会以纯文本形式存储在我们的 github 存储库中。我通过让 TF 创建一个服务帐户来完成此操作,它是关联的 SA 密钥,然后创建一个引用 SA 密钥输出的 GCP 机密。

我现在想看看是否有任何方法可以对某些预定义的数据库密码执行相同的操作。流程会略有不同:

但是,当我运行terraform plan时,它想要更改我手动创建的GCP secret的值

  # google_secret_manager_secret_version.pgbouncer-secret-uat-v1 must be replaced
-/+ resource "google_secret_manager_secret_version" "pgbouncer-secret-uat-v1" {
      ~ create_time  = "2021-08-26T14:42:58.279432Z" -> (known after apply)
      + destroy_time = (known after apply)
      ~ id           = "projects/********/secrets/pgbouncer-secret-uat/versions/1" -> (known after apply)
      ~ name         = "projects/********/secrets/pgbouncer-secret-uat/versions/1" -> (known after apply)
      ~ secret       = "projects/********/secrets/pgbouncer-secret-uat" -> "projects/*******/secrets/pgbouncer-secret-uat" # forces replacement
      - secret_data  = (sensitive value) # forces replacement 

有什么办法可以解决这个问题吗?我想导入 google 秘密版本以在 kubernetes 中使用,但不在资源中设置 secret_data 值,因为我不希望它覆盖我手动创建的内容。这是我正在谈论的相关地形配置:

resource "google_secret_manager_secret" "pgbouncer-secret-uat" {
  provider = google-beta

  secret_id = "pgbouncer-secret-uat"

  replication {
    automatic = true
  }

  depends_on = [google_project_service.secretmanager]
}

resource "google_secret_manager_secret_version" "pgbouncer-secret-uat-v1" {
  provider = google-beta

  secret      = google_secret_manager_secret.pgbouncer-secret-uat.id
  secret_data = ""
}

如果您只想 retrieve/READ 秘密而不主动管理它,那么您可以改用关联的 data

data "google_secret_manager_secret_version" "pgbouncer-secret-uat-v1" {
  provider = google-beta
  
  secret = google_secret_manager_secret.pgbouncer-secret-uat.id
}

然后您可以使用 Kubernetes 集群中的值作为数据导出资源属性的秘密:data.google_secret_manager_secret_version.pgbouncer-secret-uat-v1.secret_data。请注意,提供者可能会将此导出的资源属性标记为 sensitive,并带有正常结果。

您还可以查看 full documentation 了解更多信息。

此外,由于您将资源导入您的状态以在您的 Terraform 配置中管理它,因此您需要在将其从您的配置中移除的同时将其从您的状态中移除。您可以使用 terraform state rm google_secret_manager_secret_version.pgbouncer-secret-uat-v1 最轻松地做到这一点。然后你可以安全地从你的配置中删除资源,并在你的配置中只包含 data