云函数端点 returns 403 禁止访问
Endpoint for Cloud Function returns 403 Forbidden
-
google-cloud-endpoints
-
google-cloud-platform
-
google-cloud-functions
-
google-cloud-iam
-
google-cloud-run
我正在按照 Google 的 tutorial 为我的云功能设置端点。
当我尝试使用 URL service_name.a.run.app/function1
从我的浏览器访问端点时,我得到
Error: Forbidden
Your client does not have permission to get URL /function1GET from this server
作为上述教程和来自 Google 产品经理的 的一部分,我通过授予 ESP 权限来调用我的函数来保护我的函数。
gcloud beta functions add-iam-policy-binding function1 --member "serviceAccount:id-compute@developer.gserviceaccount.com" --role "roles/cloudfunctions.invoker" --project "project_id"
我的openapi-functions.yaml
swagger: '2.0'
info:
title: Cloud Endpoints + GCF
description: Sample API on Cloud Endpoints with a Google Cloud Functions backend
version: 1.0.0
host: HOST
x-google-endpoints:
- name: "HOST"
allowCors: "true
schemes:
- https
produces:
- application/json
paths:
/function1:
get:
operationId: function1
x-google-backend:
address: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/function1GET
responses:
'200':
description: A successful response
schema:
type: string
注意我加了
- name: "HOST"
allowCors: "true'
到我的 .yaml
文件,因为我需要从 Firebase 上托管的静态站点访问端点。
我按照您提到的教程进行了操作,确实遇到了完全相同的错误。
关于权限和角色似乎没有任何错误。
经过深入研究,解决问题的方法是删除地址末尾的“GET
”。
所以 openapi-functions.yaml
会像这样:
swagger: '2.0'
info:
title: Cloud Endpoints + GCF
description: Sample API on Cloud Endpoints with a Google Cloud Functions backend
version: 1.0.0
host: [HOST]
schemes:
- https
produces:
- application/json
paths:
/function-1:
get:
summary: Greet a user
operationId: function-1
x-google-backend:
address: https://[REGION]-[PROJECT_ID].cloudfunctions.net/function-1
responses:
'200':
description: A successful response
schema:
type: string
然后确保您正确地按照教程中提到的所有步骤进行操作(上述部分除外)。
如果您在 运行 任何步骤中遇到“权限被拒绝”错误,请再次尝试 运行 sudo
。
我也试过和你一样添加:
host: [HOST]
x-google-endpoints:
- name: [HOST]
allowCors: "true"
一切正常。
特别注意随每个新部署而变化的 CONFIG_ID
示例:
2019-12-03r0
然后是这样的:
2019-12-03r1
如果部署步骤失败(它显示了一些成功的消息,但最终可能会失败),请确保删除现有端点服务以避免出现问题:
gcloud endpoints services delete [SERVICE_ID]
您还可以使用以下方法将 cloudfunctions.invoker
角色授予所有用户(仅供测试)
gcloud functions add-iam-policy-binding function-1 \
--member="allUsers" \
--role="roles/cloudfunctions.invoker"
google-cloud-endpoints
google-cloud-platform
google-cloud-functions
google-cloud-iam
google-cloud-run
我正在按照 Google 的 tutorial 为我的云功能设置端点。
当我尝试使用 URL service_name.a.run.app/function1
从我的浏览器访问端点时,我得到
Error: Forbidden
Your client does not have permission to get URL /function1GET from this server
作为上述教程和来自 Google 产品经理的
gcloud beta functions add-iam-policy-binding function1 --member "serviceAccount:id-compute@developer.gserviceaccount.com" --role "roles/cloudfunctions.invoker" --project "project_id"
我的openapi-functions.yaml
swagger: '2.0'
info:
title: Cloud Endpoints + GCF
description: Sample API on Cloud Endpoints with a Google Cloud Functions backend
version: 1.0.0
host: HOST
x-google-endpoints:
- name: "HOST"
allowCors: "true
schemes:
- https
produces:
- application/json
paths:
/function1:
get:
operationId: function1
x-google-backend:
address: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/function1GET
responses:
'200':
description: A successful response
schema:
type: string
注意我加了
- name: "HOST"
allowCors: "true'
到我的 .yaml
文件,因为我需要从 Firebase 上托管的静态站点访问端点。
我按照您提到的教程进行了操作,确实遇到了完全相同的错误。
关于权限和角色似乎没有任何错误。
经过深入研究,解决问题的方法是删除地址末尾的“GET
”。
所以 openapi-functions.yaml
会像这样:
swagger: '2.0'
info:
title: Cloud Endpoints + GCF
description: Sample API on Cloud Endpoints with a Google Cloud Functions backend
version: 1.0.0
host: [HOST]
schemes:
- https
produces:
- application/json
paths:
/function-1:
get:
summary: Greet a user
operationId: function-1
x-google-backend:
address: https://[REGION]-[PROJECT_ID].cloudfunctions.net/function-1
responses:
'200':
description: A successful response
schema:
type: string
然后确保您正确地按照教程中提到的所有步骤进行操作(上述部分除外)。
如果您在 运行 任何步骤中遇到“权限被拒绝”错误,请再次尝试 运行 sudo
。
我也试过和你一样添加:
host: [HOST]
x-google-endpoints:
- name: [HOST]
allowCors: "true"
一切正常。
特别注意随每个新部署而变化的 CONFIG_ID
示例:
2019-12-03r0
然后是这样的:
2019-12-03r1
如果部署步骤失败(它显示了一些成功的消息,但最终可能会失败),请确保删除现有端点服务以避免出现问题:
gcloud endpoints services delete [SERVICE_ID]
您还可以使用以下方法将 cloudfunctions.invoker
角色授予所有用户(仅供测试)
gcloud functions add-iam-policy-binding function-1 \
--member="allUsers" \
--role="roles/cloudfunctions.invoker"