能否识别触发Cloud Build构建的调用者身份?
Cloud Build工作流识别触发主体的方案
问题背景
我有一个Cloud Build工作流,通过gcloud builds triggers run my-workflow触发,想让工作流识别执行该命令的主体(比如wasabi@foo.com或1234567890-service-account@google.com),不接受通过--substitution传递邮箱的方式。注意这里要识别的不是运行构建的服务账号(该信息可通过$SERVICE_ACCOUNT[_EMAIL]直接获取),而是执行触发命令的调用者。
调研后了解到IAP可能实现,但相关案例多针对Cloud Functions或应用服务,不确定是否适用于GCB,同时有两个疑问:
- 对调用者有何要求?是否需要执行额外操作/命令,还是只需正常运行
gcloud builds triggers run,IAP在后台自动生效? - 工作流如何获取该身份信息?
可行实现方案
方案一:通过Cloud Audit Logs反向查询调用者
当用户执行gcloud builds triggers run时,Google Cloud会生成对应审计日志(属于Cloud Build的google.devtools.cloudbuild.v1.CloudBuildService.RunBuildTrigger操作日志)。可以在工作流中添加步骤,调用Cloud Logging API查询对应日志提取调用者身份:
- 前置配置:为Cloud Build使用的服务账号(内置或自定义)授予
logging.viewer权限,允许读取审计日志。 - 构建脚本内的查询逻辑:
# 用当前构建的唯一ID作为查询条件 BUILD_ID="${BUILD_ID}" # 查询触发当前构建的审计日志,提取调用者邮箱 CALLER_EMAIL=$(gcloud logging read "resource.type=cloud_build AND protoPayload.build.id=${BUILD_ID} AND protoPayload.methodName=google.devtools.cloudbuild.v1.CloudBuildService.RunBuildTrigger" --format="value(protoPayload.authenticationInfo.principalEmail)" --limit=1) echo "触发者身份:${CALLER_EMAIL}" - 注意:审计日志生成有几秒延迟,建议在脚本中添加
sleep 5之类的等待逻辑,确保日志已生成。
方案二:IAP保护Cloud Build触发API(适用于API触发场景)
如果触发场景包含API调用,可通过IAP保护Cloud Build的REST API端点,但无法直接兼容默认的gcloud builds triggers run命令:
- 调用者要求:
- 调用者必须通过IAP认证,调用
runBuildTriggerAPI时需携带IAP生成的ID令牌。 - 若用命令行触发,需自定义调用逻辑,示例:
# 获取IAP身份令牌 IAP_TOKEN=$(gcloud auth print-identity-token --audiences="https://cloudbuild.googleapis.com/") # 调用Cloud Build API触发工作流,携带IAP令牌 curl -X POST "https://cloudbuild.googleapis.com/v1/projects/[你的项目ID]/triggers/my-workflow:run" \ -H "Authorization: Bearer ${IAP_TOKEN}" \ -H "Content-Type: application/json" \ -d '{}'
- 调用者必须通过IAP认证,调用
- 工作流获取身份信息:
- 经过IAP验证的请求,Cloud Build会将调用者身份映射到构建元数据中,可通过元服务器获取:
CALLER_EMAIL=$(curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/attributes/x-goog-authenticated-user-email) - 此方式需要额外配置IAP保护Cloud Build API,且无法直接使用默认
gcloud命令触发。
- 经过IAP验证的请求,Cloud Build会将调用者身份映射到构建元数据中,可通过元服务器获取:
针对疑问的直接解答
- 调用者要求:
- 方案一:无需额外操作,调用者正常执行
gcloud builds triggers run即可,只需确保Cloud Build服务账号有日志读取权限。 - 方案二:调用者必须通过IAP认证,不能用默认
gcloud命令,需自定义API调用流程并携带IAP令牌。
- 方案一:无需额外操作,调用者正常执行
- 工作流获取身份方式:
- 方案一:通过Cloud Logging API查询审计日志,提取
protoPayload.authenticationInfo.principalEmail字段。 - 方案二:通过构建元数据的
x-goog-authenticated-user-email属性获取调用者身份。
- 方案一:通过Cloud Logging API查询审计日志,提取
内容的提问来源于stack exchange,提问作者Wasabi
相关产品推荐
相关产品推荐

