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

如何在Cloud Build步骤中调用需认证的Gen2 Cloud Function?

问题描述

我创建了一个Gen2 Cloud Function,为Cloud Build默认服务账号添加了Cloud Run Invoker角色,通过以下命令调用该函数:

gcloud functions call <func name> --region europe-central2 --gen2 --data "$(<payload.json)"

但遇到如下错误:

ERROR: gcloud crashed (HTTPError): 401 Client Error: Unauthorized for url <func url>

我还尝试了以下方法,但均未成功:

  • 使用gcloud auth print-identity-token为Cloud Build服务账号生成身份令牌,返回:
    ERROR: (gcloud.auth.print-identity-token) No identity token can be obtained from the current credentials
    
  • 通过curl调用Google元数据服务获取令牌:
    curl http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=<func url> -H "Metadata-Flavor: Google"
    
    返回结果:Not Found
  • 使用带impersonate参数的gcloud命令打印身份令牌:
    gcloud auth print-identity-token --impersonate-service-account="xxx@cloudbuild.gserviceaccount.com" --audiences="https://fun-url.a.run.app" --include-email
    
    返回结果:
    ERROR: (gcloud.auth.print-identity-token) Failed to impersonate [xxxx@cloudbuild.gserviceaccount.com]. Make sure the account that's trying to impersonate it has access to the service account itself and the "roles/iam.serviceAccountTokenCreator
    

Cloud Build服务账号已拥有Service Account Token Creator角色,请问是否可以通过认证从Cloud Build调用Cloud Function?


解决方案

当然可以从Cloud Build认证调用Gen2 Cloud Function,你的问题出在权限配置细节和调用方式上,按以下步骤修正:

1. 确认Cloud Function的权限配置

Gen2 Cloud Function基于Cloud Run构建,需确保:

  • Cloud Build默认服务账号(格式为[你的项目ID]@cloudbuild.gserviceaccount.com)被授予Cloud Run Invoker角色(roles/run.invoker),建议将该角色直接绑定到函数对应的Cloud Run服务上(项目级绑定也生效,但精准到服务更安全)。
  • 函数的访问权限设置为「需要身份验证」(默认配置,生产环境不建议改为允许未验证调用)。

2. 在Cloud Build中直接调用函数的正确方式

在cloudbuild.yaml里配置调用步骤时,无需手动生成令牌,Cloud Build会自动使用自身服务账号身份完成认证,示例配置如下:

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  args:
  - functions
  - call
  - <你的函数名称>
  - --region=europe-central2
  - --gen2
  - --data=$(cat payload.json)

注意:确保payload.json已在构建上下文内,或在前置步骤中生成。

3. 排查令牌生成失败的原因

本地gcloud auth print-identity-token失败

Cloud Build环境使用的是服务账号临时凭据,本地直接执行该命令无法获取对应令牌,若需在本地模拟调用,需使用服务账号密钥或impersonate方式。

元数据服务调用返回Not Found

Cloud Build运行在Serverless环境,而非GCE实例,元数据服务路径不含instance/,正确调用命令为:

curl "http://metadata.google.internal/computeMetadata/v1/service-accounts/default/identity?audience=https://fun-url.a.run.app" -H "Metadata-Flavor: Google"

Impersonate失败

你用本地账号impersonate Cloud Build服务账号时,**本地使用的账号(如你的个人Google账号)**需要被授予roles/iam.serviceAccountTokenCreator角色,且该角色需绑定到Cloud Build服务账号上——这个权限是给发起impersonate操作的账号,而非被impersonate的Cloud Build账号。

4. 验证权限配置

用以下命令检查Cloud Build服务账号的权限:

gcloud projects get-iam-policy <你的项目ID> --filter="bindings.members:serviceAccount:<Cloud Build服务账号邮箱>" --format="value(bindings.role)"

确认输出中包含roles/run.invoker,若需本地impersonate则还要包含roles/iam.serviceAccountTokenCreator(绑定到本地操作账号)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:03:24