从 Compute Engine 调用 Cloud Functions

Posted

技术标签:

【中文标题】从 Compute Engine 调用 Cloud Functions【英文标题】:Calling Cloud Function from Compute Engine 【发布时间】:2019-11-21 10:22:43 【问题描述】:

我正在尝试从运行在 Compute Engine 实例上的节点服务器调用 HTTP 触发的云函数。 我已将计算引擎的服务帐户设置为上述函数的调用者,并且作为计算引擎实例的函数都在同一个 VPC 网络上运行。 但是,每次尝试从节点服务器调用该函数时,都会收到默认的 403 Forbidden 错误。但是,如果我将 Cloud Function 中的调用规则设置为“allUsers”,则调用成功。

编辑:我在 docker 容器上运行节点服务器。

对正在发生的事情有什么想法吗?

提前非常感谢。

编辑(解决方案):

所以我正在寻找的解决方案解释为here。尽管上述链接指向的示例代码可能对某人有所帮助,但我发现遵循 this 指南(服务帐户 JSON 证书)更有用,该指南指向可用于获取所需 OIDC 令牌的代码对函数的请求(请记住,创建令牌时的受众必须设置为函数的 url)。

有了前面提到的 OIDC 令牌,就可以使用普通的 HTTP 请求调用云函数,只需按以下格式传递标头 Authorization:Authorization: Bearer OIDC token。

如有任何问题,请随时发表,我会尽力回答所有问题。 再次感谢 petomalina 指出正确的方向。

【问题讨论】:

您能否添加服务帐户的名称(@ 后面的后缀是我们需要看到的)并确保您将函数调用程序添加到计算引擎实例使用的服务帐户中? 感谢您的回答 petomalina。我正在使用以@developer.gserviceaccount.com 结尾的帐户,并且该帐户已被授予云函数调用者的角色。此外,它已被设置为我所指的云函数中的云函数调用者成员。 默认计算引擎服务帐号为[PROJECT_NUMBER]-compute@developer.gserviceaccount.com。您能否检查一下您的计算实例是否使用此服务帐户而不是开发人员帐户?您可能需要将调用者角色添加到此服务帐户。 [PROJECT_NUMBER]-compute@developer.gserviceaccount.com 是计算引擎实例正在使用的帐户。此帐户还被授予项目中的云函数调用者角色,并已添加为我希望调用的云函数上的云函数调用者成员。不确定我是否在回答您的问题! 一个常见的错误是用户通常将“cloudfunctions.invoker”角色赋予服务帐户,但它也需要"iam.serviceAccounts.actAs" role.。另请查看 Google 文档以获取 Troubleshooting permission errors。 【参考方案1】:

如果您同时调用 Function-to-Function 或 Service-to-Function,您将需要一个自签名 JWT,例如来自无权访问计算元数据的计算实例。

请参阅此文档以了解服务到功能:https://cloud.google.com/functions/docs/securing/authenticating#service-to-function

这里还有一个关于程序化身份验证的示例:https://cloud.google.com/iap/docs/authentication-howto#authenticating_from_a_service_account

【讨论】:

你好,petomalina。因此,在浏览了您引用的文档后,我终于能够从计算引擎调用云函数。我将为面临相同问题的其他人提供解决方案来更新我的问题。再次感谢!

以上是关于从 Compute Engine 调用 Cloud Functions的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud 中的 Google Compute Engine、App Engine 和 Container Engine 有啥区别?

如何更改 Google Compute Engine 服务帐户的范围以将数据写入 Google Cloud Storage 存储桶?

Google Cloud Compute Engine 是不是与 Google Cloud SQL 分开

Google Cloud、Kubernetes 和 Cloud SQL 代理:默认 Compute Engine 服务帐户问题

无法在 Google Cloud Compute Engine 上使用 GPU

无法使用内部 IP 在 Cloud Run 和 Compute Engine 之间连接