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

创建带Cloud Function端点的Pub/Sub推送订阅时VPC SC报错求助

解决VPC SC边界下Terraform创建Pub/Sub推送订阅的403权限问题

问题场景

在启用VPC服务控制(VPC SC)边界的GCP环境中,通过Terraform创建Pub/Sub推送订阅时触发403权限错误,订阅、主题及推送端点(Cloud Function)均位于同一项目ProjectA内。

报错信息

Error: Error creating Subscription: googleapi: Error 403: Request is prohibited by organization's policy

订阅配置详情

  • 订阅与关联主题均部署在ProjectA
  • 为推送类型订阅,推送端点指向ProjectA内的Cloud Function

VPC SC审计日志详情

{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "status": {
      "code": 7,
      "message": "Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: <id>",
      "details": [
        {
          "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
          "violations": [
            {
              "type": "VPC_SERVICE_CONTROLS",
              "description": "<id>"
            }
          ]
        }
      ]
    },
    "authenticationInfo": {},
    "requestMetadata": {
      "callerIp": "<IP>"
    },
    "serviceName": "storage.googleapis.com",
    "methodName": "google.storage.buckets.testIamPermissions",
    "resourceName": "projects/<PROJ_NUMBER>",
    "metadata": {
      "vpcServiceControlsUniqueId": "<ID>",
      "violationReason": "NO_MATCHING_ACCESS_LEVEL",
      "ingressViolations": [
        {
          "servicePerimeter": "accessPolicies/<org_policy_id>/servicePerimeters/<perimeter_name>",
          "targetResource": "projects/<PROJ_NUMBER>"
        }
      ],
      "deviceState": "Unknown",
      "resourceNames": [
        "projects/_/buckets/eu.artifacts.<project_name>.appspot.com"
      ],
      "securityPolicyInfo": {
        "organizationId": "<org_id>",
        "servicePerimeterName": "accessPolicies/<org_policy_id>/servicePerimeters/<perimeter_name>"
      },
      "@type": "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
    }
  },
  "insertId": "<id>",
  "resource": {
    "type": "audited_resource",
    "labels": {
      "method": "google.storage.buckets.testIamPermissions",
      "service": "storage.googleapis.com",
      "project_id": "<project_name>"
    }
  },
  "severity": "ERROR",
}

排查与解决步骤

从日志可见,错误根源是Pub/Sub创建订阅时尝试访问项目的Artifact Registry存储桶(eu.artifacts.<project_name>.appspot.com),但该操作被VPC SC边界拦截,原因是NO_MATCHING_ACCESS_LEVEL,可按以下步骤修复:

  1. 确认VPC SC边界包含相关资源

    • 检查当前VPC SC服务边界配置,确保ProjectA以及对应的Artifact Registry存储桶被纳入边界资源列表。若存储桶未在列表中,需添加该资源到边界。
  2. 配置匹配的VPC SC访问级别

    • 为执行Terraform的身份(用户或服务账号)分配符合边界要求的访问级别:
      • 确保访问级别规则包含Terraform执行环境的IP地址(日志中的callerIp);
      • 若使用身份验证类访问级别,需确认该身份已被纳入允许列表。
  3. 验证服务间通信的VPC SC兼容性

    • 确认Cloud Function的配置符合VPC SC要求:
      • 若Cloud Function部署在VPC网络内,需确保该网络属于VPC SC边界;
      • 无服务器模式下,需确保ProjectA在边界内,且Pub/Sub服务被允许与边界内的Cloud Function通信。
  4. 检查Terraform执行身份的权限

    • 确保执行Terraform的身份拥有以下必要权限:
      • pubsub.subscriptions.create
      • cloudfunctions.functions.setIamPolicy(用于授予Pub/Sub调用Cloud Function的权限)
      • storage.buckets.testIamPermissions
  5. 临时验证(可选)

    • 若环境允许,可临时将ProjectA从VPC SC边界移除,尝试创建订阅,确认问题是否由VPC SC配置导致,之后再重新添加边界并调整配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:34:59