【发布时间】:2018-11-30 13:00:53
【问题描述】:
已解决/无效 - 见下文
我正在尝试从 Google Cloud Function 按需部署 Google Cloud Function。
但是,无论我尝试什么,都会收到 403 Forbidden:
请求https://cloudfunctions.googleapis.com/v1/projects/MY_PROJECT/locations/MY_REGION/functions?alt=json时HttpError 403返回“调用者没有权限”
我最终授予云功能服务帐户项目所有者角色以确保它可以执行任何操作,但我仍然收到相同的错误。
这是有意限制的(例如为了避免分叉炸弹或其他东西)还是我做错了什么?
有人能做到吗?
记录一下:我使用自己的帐户在 Flask 本地运行了相同的 (Python) 函数,然后它将完美地部署新的云函数,所以代码本身似乎没问题。
更新
我如何尝试部署云功能的代码 sn-p:
cf_client = discovery.build('cloudfunctions', 'v1')
location = "projects/{MYPROJECT}/locations/europe-west1"
request = {
"name": "projects/{MYPROJECT}/locations/europe-west1/functions/hopper--2376cd24d318cd2d42f000f4f1c31a8f",
"description": "Hopper hopper--2376cd24d318cd2d42f000f4f1c31a8f",
"entryPoint": "pubsub_trigger",
"runtime": "python37",
"availableMemoryMb": 256,
"timeout": "60s",
"sourceArchiveUrl": "gs://staging.{MYPROJECT}.appspot.com/deployment/hopper.zip",
"eventTrigger": {
"eventType": "providers/cloud.pubsub/eventTypes/topic.publish",
"resource": "projects/{MYPROJECT}/topics/hopper-test-input"
},
"environmentVariables": {
"HOPPER_ID": "hopper--2376cd24d318cd2d42f000f4f1c31a8f"
}
}
response = cf_client.projects() \
.locations() \
.functions() \
.create(location=location, body=req) \
.execute()
更新
我觉得自己像个白痴……事实证明,出于某种原因,我将主功能部署在另一个项目中,然后是我授予权限的项目。难怪它不起作用。
【问题讨论】:
-
Cloud Functions 服务帐户不在运行时使用,仅在管理期间使用。 App Engine 默认服务帐户在运行时使用。或者,您可以配置并带上自己的服务帐户来进行身份验证和调用其他 API。
-
您介意用代码更新您的问题吗?
-
@DougStevenson 默认的 Cloud Functions 服务帐户似乎是 App Engine 服务帐户 ->
@appspot.gserviceaccount.com 我将项目所有者角色赋予此帐户,但它仍然拒绝部署云功能。我设置了一个新的服务帐户以用于云功能。这似乎是“alpha”功能 - 在 Web 控制台中它不可用,在命令行上我必须使用“gcloud alpha functions deploy ...”让它接受 --service-account 参数。结果是仍然作为默认帐户运行的 CF,但在任何地方都不可见。 -
@NicksonThanda 我不能完全分享代码,我认为这并不重要。在尝试部署新的云功能时,我可以共享主云功能发出的 REST 请求。一会儿我会更新。
-
没关系,事实证明我在另一个项目中启动了云功能,然后应该在其中启动它。
标签: google-cloud-platform google-cloud-functions