GCP Cloud Run使用Terraform传Secret,如何隐藏修订历史中的明文?
解决Cloud Run修订历史中Secret明文暴露的问题
核心问题原因
Cloud Run的命令行参数(args)会明文存储在服务修订历史里,直接把Secret值写进args必然导致明文泄露。正确的做法是通过环境变量间接传递Secret,让args只引用环境变量名,而环境变量从Secret Manager挂载。
正确的Terraform配置方案
以下是完整的配置示例,包含环境变量挂载、权限配置和参数引用:
# 读取Secret Manager中的Token data "google_secret_manager_secret_version" "probe_api_token" { secret = "PROBE_API_TOKEN" } # 创建Cloud Run服务 resource "google_cloud_run_service" "synthetic_monitoring_agent" { name = "synthetic-monitoring-agent" location = "us-central1" template { spec { containers { image = "grafana/synthetic-monitoring-agent:latest" # 从Secret Manager挂载环境变量 env { name = "PROBE_API_TOKEN" value_from { secret_key_ref { name = data.google_secret_manager_secret_version.probe_api_token.secret key = "latest" # 可替换为具体版本号,比如"1" } } } # 在args中引用环境变量(shell变量格式) args = ["--api-token", "$PROBE_API_TOKEN"] } # 指定有权限访问Secret的服务账号 service_account_name = google_service_account.run_sa.email } } traffic { percent = 100 latest_revision = true } } # 创建专用服务账号(可选,推荐使用) resource "google_service_account" "run_sa" { account_id = "cloud-run-synthetic-agent-sa" } # 给服务账号赋予Secret访问权限 resource "google_project_iam_member" "run_sa_secret_access" { project = var.project_id role = "roles/secretmanager.secretAccessor" member = "serviceAccount:${google_service_account.run_sa.email}" }
关键注意事项
- 环境变量挂载方式:必须使用
value_from.secret_key_ref,而不是直接赋值value,这样Cloud Run只会存储Secret的引用,不会明文保存值。 - args中的变量引用:用
$PROBE_API_TOKEN引用环境变量,这是shell的标准变量格式,服务启动时会自动替换为实际的Secret值,修订历史中只会显示变量名。 - 权限配置:必须给Cloud Run使用的服务账号赋予
roles/secretmanager.secretAccessor角色,否则服务启动时无法读取Secret,会出现权限错误。
验证效果
部署完成后:
- 查看Cloud Run控制台的修订历史,
args字段只会显示--api-token $PROBE_API_TOKEN,看不到明文Token; - 查看服务日志,确认
synthetic-monitoring-agent正常启动并连接到Grafana,说明Token读取正确。
内容的提问来源于stack exchange,提问作者Young
相关产品推荐
相关产品推荐

