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

如何在Cloud Run多服务架构中遵循PoLP并解耦部署与权限配置

解除Cloud Run后端与服务账号的部署耦合方案(无需开放allAuthenticatedUsers权限)

场景回顾

我们的GCP Cloud Run后端已启用认证,Ingress配置为「Internal + Load Balancing」,依赖服务通过专属服务账号以REST方式访问,需被授予roles/run.invoker角色。当前痛点是必须先部署后端应用才能分配角色,导致两者强耦合,需寻找替代方案。

可行解决方案

1. 自定义IAM角色+资源条件绑定

通过创建等价于roles/run.invoker的自定义角色,提前在项目/文件夹层级绑定到目标服务账号,并通过条件表达式限制权限仅作用于待部署的Cloud Run服务,无需等待后端部署完成。

  • 创建自定义角色(包含run.services.invoke核心权限):
    gcloud iam roles create CustomRunInvoker \
      --project=YOUR_PROJECT_ID \
      --title="Custom Cloud Run Invoker" \
      --description="Limited invoker access to specific Cloud Run services" \
      --permissions=run.services.invoke
    
  • 绑定权限到服务账号(带条件限制目标服务):
    gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
      --member="serviceAccount:YOUR_CLIENT_SA@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
      --role="projects/YOUR_PROJECT_ID/roles/CustomRunInvoker" \
      --condition="expression=resource.name.startsWith('projects/YOUR_PROJECT_ID/locations/YOUR_REGION/services/TARGET_BACKEND_SERVICE_NAME'),title=RestrictToTargetBackend"
    
    后端部署后,权限会自动匹配生效。

2. 服务账号组批量管理

将所有需要调用后端的服务账号加入一个Google Groups组,提前给该组绑定带条件的roles/run.invoker权限,后续新增服务账号只需加入组即可,无需重复配置权限。

  • 创建Google Groups组(如run-backend-invokers@yourdomain.com),并添加目标服务账号
  • 绑定组权限:
    gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
      --member="group:run-backend-invokers@yourdomain.com" \
      --role="roles/run.invoker" \
      --condition="expression=resource.name.startsWith('projects/YOUR_PROJECT_ID/locations/YOUR_REGION/services/TARGET_BACKEND_SERVICE_NAME'),title=RestrictToBackendService"
    

3. 基础设施即代码(IaC)统一编排

用Terraform、Deployment Manager等IaC工具,同时定义Cloud Run服务和对应的IAM绑定规则,工具会自动处理依赖关系,实现权限配置与后端部署同步完成,彻底消除手动操作的耦合。

示例Terraform片段:

# 定义Cloud Run后端服务
resource "google_cloud_run_service" "backend" {
  name     = "backend-service"
  location = "us-central1"

  template {
    spec {
      containers {
        image = "gcr.io/your-project/backend-image:latest"
      }
    }
  }
}

# 绑定调用者权限到客户端服务账号
resource "google_project_iam_member" "run_invoker" {
  project = var.project_id
  role    = "roles/run.invoker"
  member  = "serviceAccount:client-service-account@${var.project_id}.iam.gserviceaccount.com"
  
  condition {
    title       = "RestrictToBackendService"
    description = "Only allow access to the defined Cloud Run backend"
    expression  = "resource.name == '${google_cloud_run_service.backend.id}'"
  }
}

方案优势

所有方案均严格限制权限范围,不会将roles/run.invoker开放给allAuthenticatedUsers,同时实现后端部署与权限配置的解耦,可提前完成权限规划。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:17:46