You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Terraform将GCP Cloud SQL证书导入Secret Manager?

解决Terraform中Cloud SQL SSL证书导入Secret Manager的类型不匹配问题

问题核心

你遇到的错误是因为google_sql_database_instance.instance.server_ca_cert返回的是对象(包含证书内容、过期时间等属性),而非Secret Manager模块要求的字符串格式。google_sql_ssl_cert的private_key和cert本身已是字符串,但需确保输出时正确传递并标记敏感数据。

修正步骤

1. 修正Cloud SQL模块的输出

修改Cloud SQL模块的输出,提取证书的字符串内容并标记为敏感数据:

output "server_ca_cert" {
  description = "Server CA certificate content for the SQL DB"
  value       = google_sql_database_instance.instance.server_ca_cert.cert
  sensitive   = true # 证书属于敏感数据,必须标记
}

output "client_key" {
  description = "Client private key content for the SQL DB"
  value       = google_sql_ssl_cert.client_cert.private_key
  sensitive   = true
}

output "client_cert" {
  description = "Client certificate content for the SQL DB"
  value       = google_sql_ssl_cert.client_cert.cert
  sensitive   = true
}

2. 修正Secret Manager模块调用

将提取后的字符串传入Secret Manager模块,确保类型匹配:

# 导入服务器CA证书到Secret Manager
module "server_ca" {
  source       = "../siac-modules/modules/secretManager"
  project_id   = var.project_id
  region_id    = local.default_region
  secret_ids   = local.server_ca_key # 确保此变量是单个Secret ID字符串
  secret_datas = module.sql_db_timeslot_manager.server_ca_cert
}

# 导入客户端证书到Secret Manager
module "client_cert" {
  source       = "../siac-modules/modules/secretManager"
  project_id   = var.project_id
  region_id    = local.default_region
  secret_ids   = local.client_cert_key # 定义对应的Secret ID
  secret_datas = module.sql_db_timeslot_manager.client_cert
}

# 导入客户端密钥到Secret Manager
module "client_key" {
  source       = "../siac-modules/modules/secretManager"
  project_id   = var.project_id
  region_id    = local.default_region
  secret_ids   = local.client_key_key # 定义对应的Secret ID
  secret_datas = module.sql_db_timeslot_manager.client_key
}

3. 批量导入(可选)

如果你的Secret Manager模块支持批量创建多个Secret,可以用列表形式传入:

locals {
  ssl_secret_ids = [
    "sql-server-ca-cert",
    "sql-client-cert",
    "sql-client-key"
  ]
  ssl_secret_datas = [
    module.sql_db_timeslot_manager.server_ca_cert,
    module.sql_db_timeslot_manager.client_cert,
    module.sql_db_timeslot_manager.client_key
  ]
}

module "sql_ssl_secrets" {
  source       = "../siac-modules/modules/secretManager"
  project_id   = var.project_id
  region_id    = local.default_region
  secret_ids   = local.ssl_secret_ids
  secret_datas = local.ssl_secret_datas
}

错误原因说明

之前的代码直接传递了server_ca_cert对象(包含cert、expiration_time等多个字段),但Secret Manager模块的secret_datas变量明确要求字符串类型,导致类型校验失败。通过提取对象中的cert字段,就能得到证书的纯文本字符串,满足模块的输入要求。

内容的提问来源于stack exchange,提问作者QR827

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:30:45