terraform 从 gcp secret 创建 k8s secret
terraform create k8s secret from gcp secret
我已经设法实现了在 terraform 中创建敏感资源的流程,而没有在任何时候透露敏感细节是什么,因此不会以纯文本形式存储在我们的 github 存储库中。我通过让 TF 创建一个服务帐户来完成此操作,它是关联的 SA 密钥,然后创建一个引用 SA 密钥输出的 GCP 机密。
我现在想看看是否有任何方法可以对某些预定义的数据库密码执行相同的操作。流程会略有不同:
- 手动创建 GCP 机密(在机密管理器中),它的值是我们的 PGbouncer 实例将使用的纯文本数据库密码列表(更多信息在流程后面)
- 我使用 terraform import 导入这个,所以 terraform state 现在知道这个资源,即使它是在 TF 之外创建的,但我刚刚添加的秘密版本为
secret_data = ""
(否则将纯文本密码详情打败对象!)
- 我现在想从
google_secret_manager_version
中获取 secret_data
以添加到 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
有什么办法可以解决这个问题吗?我想导入 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
。
我已经设法实现了在 terraform 中创建敏感资源的流程,而没有在任何时候透露敏感细节是什么,因此不会以纯文本形式存储在我们的 github 存储库中。我通过让 TF 创建一个服务帐户来完成此操作,它是关联的 SA 密钥,然后创建一个引用 SA 密钥输出的 GCP 机密。
我现在想看看是否有任何方法可以对某些预定义的数据库密码执行相同的操作。流程会略有不同:
- 手动创建 GCP 机密(在机密管理器中),它的值是我们的 PGbouncer 实例将使用的纯文本数据库密码列表(更多信息在流程后面)
- 我使用 terraform import 导入这个,所以 terraform state 现在知道这个资源,即使它是在 TF 之外创建的,但我刚刚添加的秘密版本为
secret_data = ""
(否则将纯文本密码详情打败对象!) - 我现在想从
google_secret_manager_version
中获取secret_data
以添加到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
有什么办法可以解决这个问题吗?我想导入 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
。