创建带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,可按以下步骤修复:
确认VPC SC边界包含相关资源
- 检查当前VPC SC服务边界配置,确保ProjectA以及对应的Artifact Registry存储桶被纳入边界资源列表。若存储桶未在列表中,需添加该资源到边界。
配置匹配的VPC SC访问级别
- 为执行Terraform的身份(用户或服务账号)分配符合边界要求的访问级别:
- 确保访问级别规则包含Terraform执行环境的IP地址(日志中的
callerIp); - 若使用身份验证类访问级别,需确认该身份已被纳入允许列表。
- 确保访问级别规则包含Terraform执行环境的IP地址(日志中的
- 为执行Terraform的身份(用户或服务账号)分配符合边界要求的访问级别:
验证服务间通信的VPC SC兼容性
- 确认Cloud Function的配置符合VPC SC要求:
- 若Cloud Function部署在VPC网络内,需确保该网络属于VPC SC边界;
- 无服务器模式下,需确保ProjectA在边界内,且Pub/Sub服务被允许与边界内的Cloud Function通信。
- 确认Cloud Function的配置符合VPC SC要求:
检查Terraform执行身份的权限
- 确保执行Terraform的身份拥有以下必要权限:
pubsub.subscriptions.createcloudfunctions.functions.setIamPolicy(用于授予Pub/Sub调用Cloud Function的权限)storage.buckets.testIamPermissions
- 确保执行Terraform的身份拥有以下必要权限:
临时验证(可选)
- 若环境允许,可临时将ProjectA从VPC SC边界移除,尝试创建订阅,确认问题是否由VPC SC配置导致,之后再重新添加边界并调整配置。
内容的提问来源于stack exchange,提问作者Ankit Srivastava
相关产品推荐
相关产品推荐

