terraform 从 gcp 秘密创建 k8s 秘密

Posted

技术标签:

【中文标题】terraform 从 gcp 秘密创建 k8s 秘密【英文标题】:terraform create k8s secret from gcp secret 【发布时间】:2021-10-26 16:23:56 【问题描述】:

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

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

手动创建 GCP 机密(在机密管理器中),其值是我们的 PGbouncer 实例将使用的纯文本数据库密码列表(在流程后面的详细信息) 我使用 terraform import 导入此资源,因此 terraform state 现在知道此资源,即使它是在 TF 之外创建的,但我刚刚添加为 secret_data = "" 的秘密版本(否则将纯文本密码详细信息放在这里失败对象!) 我现在想从google_secret_manager_version 中获取secret_data 添加到kubernetes_secret 中,以便在我们的GKE 集群中使用它。

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

  # 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 secret 版本以在 kubernetes 中使用,但不要在资源中设置 secret_data 值,因为我不希望它覆盖我手动创建的内容。这是我正在谈论的相关 terraform 配置:

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 = ""

【问题讨论】:

【参考方案1】:

如果您只是想检索/阅读秘密而不主动管理它,那么您可以改用关联的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

【讨论】:

我之前也尝试过,所以我将资源改为数据,当我运行 terraform plan 时,它说它将破坏 secret_version 资源。 @sc-leeds 是的,那是因为您导入了资源来管理它。我会根据您的具体情况更新附录的答案。 太棒了,这是有道理的,谢谢,我明天会试一试,并将其标记为答案一切都很好:)

以上是关于terraform 从 gcp 秘密创建 k8s 秘密的主要内容,如果未能解决你的问题,请参考以下文章

使用来自 GCP 市场的 terraform 创建实例

使用 terraform 创建多个 GCP 存储桶

使用 Terraform 创建 GCP 自定义 IAM 角色

使用 Terraformer\Terraform 克隆 GCP 项目

如何使用 Terraform 公开 gcp 云功能

我可以使用 Terraform 创建 GCP API 密钥吗?