从GCP Cloud Tasks执行Workflow时遇401未授权错误,如何解决?
GCP Cloud Tasks调用Workflow报401未授权错误排查
问题描述
尝试通过GCP Cloud Tasks触发Workflow执行时,立即收到UNAUTHENTICATED 401错误。入队任务的Go代码如下:
req := &taskspb.CreateTaskRequest{ Parent: fmt.Sprintf("projects/%v/locations/us-central1/queues/myqueue", projectID), Task: &taskspb.Task{ PayloadType: &taskspb.Task_HttpRequest{ HttpRequest: &taskspb.HttpRequest{ HttpMethod: taskspb.HttpMethod_POST, Url: fmt.Sprintf("https://workflowexecutions.googleapis.com/v1/projects/%v/locations/us-central1/workflows/myworkflow/executions", projectID), Body: bodyJson, AuthorizationHeader: &taskspb.HttpRequest_OidcToken{ OidcToken: &taskspb.OidcToken{ ServiceAccountEmail: serviceAccount, }, }, }, }, }, } _, err = client.CreateTask(ctx, req)
错误截图:
已为使用的服务账号分配Workflow Invoker权限,请问遗漏了哪些配置?
排查方案
显式指定OIDC Token的受众(Audience)
Cloud Tasks生成的OIDC Token默认受众并非Workflow的API端点,必须手动指定Audience字段与请求URL一致,否则Token的aud声明不匹配会被Workflow API拒绝。修改代码中OidcToken部分:OidcToken: &taskspb.OidcToken{ ServiceAccountEmail: serviceAccount, Audience: fmt.Sprintf("https://workflowexecutions.googleapis.com/v1/projects/%v/locations/us-central1/workflows/myworkflow/executions", projectID), },确保入队身份具备Cloud Tasks权限
运行上述代码的身份(即调用CreateTask的账号)需要拥有cloudtasks.tasks.create权限,可分配Cloud Tasks Enqueuer角色(roles/cloudtasks.enqueuer)。验证Workflow权限的绑定范围
确认Workflow Invoker角色(roles/workflows.invoker)已绑定到目标Workflow资源上,而非仅绑定在项目级别(若项目级别绑定需确保无权限继承限制)。检查Cloud Tasks队列的IAM配置
目标队列的IAM规则可能限制了任务创建操作,需确保执行入队的身份被允许对该队列执行任务创建操作。
内容的提问来源于stack exchange,提问作者Raz Omessi
相关产品推荐
相关产品推荐

