当前位置: 首页 > 知识库问答 >
问题:

terraform从gcp秘密创建k8s秘密

杭泉
2023-03-14

我成功地实现了在terraform中创建敏感资源的流程,在任何时候都不会透露敏感细节是什么,因此在我们的github repo中不会以纯文本存储。我让TF创建一个服务帐户,它与SA密钥相关,然后创建一个引用SA密钥输出的GCP密钥。

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

  • 手动创建GCP secret(在secrets manager中),该密码的值为我们的PGbouncer实例将使用的纯文本数据库密码列表(稍后将在流程中提供更多信息)
  • 我使用terraform import导入这个资源,所以terraform state现在知道这个资源,尽管它是在TF之外创建的,但我刚刚添加的机密版本为secret_data=“”(否则,将纯文本密码详细信息放在这里会破坏对象!)
  • 我现在想从google_secret_manager_版本中获取secret_数据,将其添加到kubernetes_secret中,以便在我们的GKE集群中使用

然而,当我运行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 

你知道我该怎么解决这个问题吗?我想导入在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个答案

吴凯泽
2023-03-14

如果您只想检索/读取秘密而不主动管理它,那么您可以使用关联的data来代替:

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

然后,您可以使用库伯内特斯集群中的值作为数据导出资源属性的秘密:data.google_secret_manager_secret_version.pgbouncer-secret-uat-v1.secret_data。请注意,提供程序可能会将这个导出的资源属性标记为敏感的,这会带来正常的后果。

您还可以查看完整的文档以了解更多信息。

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

 类似资料:
  • 在图表部署CI/CD管道期间,有没有办法从GCP机密管理器中检索掌舵图表的机密?还是最好使用CI/CD secret manager,然后为图表部署获取凭据?

  • 我正在尝试从使用文件,以使用谷歌云平台机密管理器。我已经按照这里的说明操作了,但是我遇到了一个错误,说我没有权限访问这个秘密。 这就是我得到的错误: 我确实创建了一个具有“所有者”权限的服务帐户,下载了它,并使其

  • 我正在构建一个简单的应用程序,它将Twilio凭据存储在GCP秘密管理器中,并在需要时将其拉下来。但是,我一直收到项目资源上的拒绝权限错误(403): 谷歌。api_核心。例外。PermissionDenied:403资源项目的权限被拒绝。 我使用环境变量设置到包含服务号凭据的JSON文件的路径。 以下是我已经尝试过的: 确保在GCP控制台中正确设置权限。服务帐户被设置为项目的所有者和项目级别的机

  • 将来自Google secret Manager的秘密注入Kubernetes部署的最佳实践是什么?我已将Grafana实例的管理员密码存储到Google Secret Manager中。Grafana实例是使用Google Kubernetes引擎上的helm图表部署的。我确实尝试过使用kube secrets init,这是一个Kubernetes变异的网络钩子,它变异了任何引用秘密Googl

  • null 例如,轮转设定为7天。所以我在我的应用程序中编码每7天刷新一次...不好,因为很难精确计时。 另一种方法是,如果我的应用程序面临身份验证异常,只需刷新密码,建立一个新的连接,并重试应用程序逻辑。 行业标准是什么?

  • 我在Secrets Manager控制台上创建了一个秘密。然后我尝试使用Go code快速入门指南,如 但后来我得到了 这很有意义,因为secrets manager api怎么知道我的代码具有管理员权限?