如何通过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
相关产品推荐
相关产品推荐

