![负载均衡器背后的云功能](https://linux22.com/image/766296/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%99%A8%E8%83%8C%E5%90%8E%E7%9A%84%E4%BA%91%E5%8A%9F%E8%83%BD.png)
我遵循 GCP 的指南,将 hello-world PHP 示例部署为一个函数,只允许来自内部和 Cloud Load Balancing 的连接。之后,我配置了负载均衡器,以便将该函数用作后端。所有内容都在同一个项目中。我本以为该函数会被调用,但我却一直收到 403 错误:
错误:禁止
您的客户端无权从该服务器获取 URL /。
经过一段时间的努力之后,我授予 allUsers Cloud Functions Invoker 角色,并且一切都按预期工作,但在我看来似乎存在错误。
如果负载均衡器和函数都在同一个项目中,为什么我需要允许 allUsers?为什么尝试允许 allAuthenticatedUsers 会导致它停止工作?
我是 GCP 的新手,所以如果我遗漏了什么,请向我道歉。
答案1
正如 John 所说,如果未指定 allusers,则只有授权用户才能访问 CF。您可以查看这文档以了解有关如何对 CF 进行身份验证的更多信息。但基本上,您需要将角色/cloudfunctions.invoker 角色添加到您要用于访问的 SA。
另一方面,也可以使用以下方式以编程方式生成令牌:客户端库。
def make_authorized_get_request(service_url):
"""
make_authorized_get_request makes a GET request to the specified HTTP endpoint
in service_url (must be a complete URL) by authenticating with the
ID token obtained from the google-auth client library.
"""
req = urllib.request.Request(service_url)
auth_req = google.auth.transport.requests.Request()
id_token = google.oauth2.id_token.fetch_id_token(auth_req, service_url)
req.add_header("Authorization", f"Bearer {id_token}")
response = urllib.request.urlopen(req)
return response.read()