Google Cloud Function能否跨项目使用其他项目的Serverless VPC Connector?
Google Cloud Function部署在项目foo中,能否使用项目bar中的Serverless VPC Connector?因使用量极低,不想在foo单独部署连接器以节省月度成本。
执行部署命令时出现权限错误:
gcloud functions deploy my-function --vpc-connector=projects/bar/locations/us-central1/connectors/my-connector
最初报错内容:
ERROR: (gcloud.functions.deploy) OperationError: code=7, message=Missing necessary permission vpcaccess.connectors.use for serviceAccount:service-{foo-project-number}@gcf-admin-robot.iam.gserviceaccount.com on project fareclockdev-billing.
Please grant serviceAccount:service-{foo-project-number}@gcf-admin-robot.iam.gserviceaccount.com the roles/vpcaccess.user role.
You can do that by running 'gcloud projects add-iam-policy-binding foo --member=serviceAccount:service-{foo-project-number}@gcf-admin-robot.iam.gserviceaccount.com --role=roles/vpcaccess.user'
在foo和bar项目中为该服务账号及函数服务账号授予roles/vpcaccess.user角色后,出现新错误:
ERROR: (gcloud.functions.deploy) OperationError: code=7, message=Missing necessary permission for service-{foo-project-number}@gcf-admin-robot.iam.gserviceaccount.com on resource foo. Please visit https://cloud.google.com/functions/docs/troubleshooting for in-depth troubleshooting documentation.
补充说明:该VPC Connector实际连接的是第三个项目baz中的网络,项目bar中的函数使用该连接器访问baz的Redis服务无问题。
跨项目使用Serverless VPC Connector完全可行
无需在foo项目单独部署连接器,只要配置正确的IAM权限和网络规则,foo的Cloud Function即可使用bar项目的连接器。正确的权限配置步骤
仅需在**项目bar**中操作,为foo项目的GCF管理服务账号(service-{foo-project-number}@gcf-admin-robot.iam.gserviceaccount.com)授予roles/vpcaccess.user角色,不需要在foo项目中配置该权限:gcloud projects add-iam-policy-binding bar --member=serviceAccount:service-{foo-project-number}@gcf-admin-robot.iam.gserviceaccount.com --role=roles/vpcaccess.user该角色包含连接器所需的
vpcaccess.connectors.use权限,确保服务账号能访问bar项目的连接器。网络层面的必要检查
由于连接器关联的是baz项目的VPC网络,需确认:baz项目的VPC网络已与bar的连接器正确绑定,且防火墙规则允许来自连接器的流量访问目标Redis服务。baz项目的VPC网络权限允许bar的连接器访问,同时放行foo项目函数通过连接器发起的流量。
新报错的排查要点
新错误指向foo项目资源的权限缺失,需检查:foo项目的GCF管理服务账号是否拥有cloudfunctions.functions.create或cloudfunctions.functions.update权限,确保部署操作能正常执行。- 确认部署命令中指定的函数名称、区域等资源在
foo项目中合法,无资源权限冲突。
内容的提问来源于stack exchange,提问作者jacob

