从 Cloud Tasks 触发 HTTP Cloud Function 时出现 PERMISSION_DENIED 403 错误

Posted

技术标签:

【中文标题】从 Cloud Tasks 触发 HTTP Cloud Function 时出现 PERMISSION_DENIED 403 错误【英文标题】:PERMISSION_DENIED 403 error when triggering HTTP Cloud Function from Cloud Tasks 【发布时间】:2020-12-29 08:59:39 【问题描述】:

我正在尝试Using Cloud Tasks to trigger Cloud Functions 教程,但是当我尝试运行创建的任务时出现错误:

Status code: 7 (PERMISSION_DENIED)
Reason for retrying: PERMISSION_DENIED(7): HTTP status code 403

我创建了一个具有Cloud Functions Invoker 角色的新服务帐户。 并修改了我的代码,以便使用此服务帐户创建任务:

const task = 
    httpRequest: 
      httpMethod: protos.google.cloud.tasks.v2.HttpMethod.POST,
      url,
      oidcToken: 
        serviceAccountEmail: 'cloud-tasks-client@my-actual-project.iam.gserviceaccount.com',
      ,

任务是从云函数创建的。

我还修改了目标 Cloud Function 访问控制,以便 allAuthenticatedUsers 使用角色 Cloud Functions Invoker 访问它。 我可以使用云功能控制台测试触发该功能而不会出现任何错误。

我错过了什么?有什么想法吗?

【问题讨论】:

【参考方案1】:

我刚刚想通了。我使用ingress-settings=internal-only 部署了该功能。认为 Cloud Tasks 将被视为内部服务。我不得不把它改成默认的all,然后它就起作用了。 internal-and-gclb 也没有用。

【讨论】:

我在推送到云运行端点时遇到了这个问题。我在多层 prod-canary-etc 设置中部署了几个相同的应用程序,并且仅将一个入口设置为 internal-only。为了向其他旅行者重申您的答案的重要性,请先检查您的服务的入口! 显然不言而喻,这样做也会将服务暴露给公众。 正如@AlexanderTrauzzi 所说,这会将您的服务公开。有没有解决办法?【参考方案2】:

进入IAM页面,找到云任务服务代理服务账号:service-<projectNumber>@gcp-sa-cloudtasks.iam.gserviceaccount.com,并为其授予角色roles/iam.serviceAccountTokenCreator

你的教程中没有提到。我猜你没有这样做。

【讨论】:

感谢您的回复,但我才知道真正的原因。所以这个 IAM 更改对我来说是不必要的。 @guillaume 这对我仍然不起作用。

以上是关于从 Cloud Tasks 触发 HTTP Cloud Function 时出现 PERMISSION_DENIED 403 错误的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Tasks + Cloud Functions - 重复执行

ImportError:无法从“google.cloud”导入名称“tasks_v2”

Google Cloud Tasks 未分派 HTTP 请求

Cloud Tasks 条件执行

如何以安全的方式从 Cloud Tasks 调用 Firebase 函数?

GCP Cloud Tasks:缩短创建先前创建的命名任务的时间