如何通过Terraform将Google Secret Manager文件注入Cloud Run应用
问题概述
使用Terraform搭建Cloud Run后端服务,通过Google Secret Manager存储应用密钥及GCP服务账号文件。目前密钥值已成功注入应用,但服务账号文件无法被应用通过文件路径读取,需调整Terraform配置实现该需求。
解决方案
要让应用通过文件路径读取Secret Manager中的服务账号文件,需通过挂载Secret到容器文件系统实现,同时确保Cloud Run服务账号拥有Secret Manager的访问权限,具体配置如下:
1. 调整Cloud Run配置:挂载Secret到容器路径
修改后端模块的google_cloud_run_service资源配置,添加volumes和volume_mounts字段,将Secret Manager中的服务账号文件挂载到容器内指定路径,同时调整环境变量传递文件路径给应用:
resource "google_cloud_run_service" "backend_service" { name = "backend" location = var.region template { spec { # 可指定自定义服务账号,若使用默认则注释该行 service_account_name = "your-cloud-run-sa@${var.project_id}.iam.gserviceaccount.com" containers { image = var.app_image dynamic "env" { for_each = tomap({ "DB_NAME" = var.db_name "DB_USER" = var.db_user "DB_PASSWORD" = var.db_password "DB_HOST" = var.db_host "DB_PORT" = var.db_port "SERVER_PORT" = var.server_port "STRIPE_PUB_KEY" = var.stripe_pub_key "STRIPE_KEY_SECRET" = var.stripe_secret_key # 传递挂载的文件路径给应用,而非Secret ID "GCP_SERVICE_ACCOUNT_PATH" = "/secrets/gcp-service-account.json" }) content { name = env.key value = env.value } } # 将Secret挂载到容器内的文件路径 volume_mounts { name = "gcp-service-account-secret" mount_path = "/secrets/gcp-service-account.json" sub_path = "secret" # 固定指向Secret内容的标识 read_only = true } liveness_probe { http_get { path = "/health" port = 8000 } initial_delay_seconds = 30 period_seconds = 30 } } # 定义引用Secret Manager的Volume volumes { name = "gcp-service-account-secret" secret { secret_name = var.gcp_service_account items { key = "latest" # 使用Secret的最新版本 path = "secret" } } } } } autogenerate_revision_name = true }
2. 配置IAM权限:允许Cloud Run访问Secret Manager
给Cloud Run使用的服务账号添加Secret Manager Secret Accessor角色,确保其能读取目标Secret:
resource "google_secret_manager_secret_iam_member" "cloud_run_secret_access" { secret_id = google_secret_manager_secret.gcp_service_account.secret_id role = "roles/secretmanager.secretAccessor" # 若使用默认服务账号,格式为 serviceAccount:${var.project_id}@cloudrun.gserviceaccount.com member = "serviceAccount:your-cloud-run-sa@${var.project_id}.iam.gserviceaccount.com" }
3. 应用适配
在应用代码中,通过环境变量GCP_SERVICE_ACCOUNT_PATH获取文件路径(即/secrets/gcp-service-account.json),直接读取该路径下的文件内容即可。
内容的提问来源于stack exchange,提问作者Mabel Oza
相关产品推荐
相关产品推荐

