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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:20:28