我遵循 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()