从 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 请求