来自 Compute Engine 的任务队列身份验证 - "Insufficient Permission"

Task queue authentication from Compute Engine - "Insufficient Permission"

我正在尝试使用 Google 的 python REST API 库从 Compute Engine VM 实例中使用拉取队列,并不断收到 403 错误 - "Insufficient Permission"

queue.yaml:

queue:
- name: queuename
  mode: pull

构建 api 客户端:

from apiclient.discovery import build
credentials = GoogleCredentials.get_application_default()
task_api = build('taskqueue', 'v1beta2', credentials=credentials)

正在获取任务:

lease_req = task_api.tasks().lease(project=PROJECT_NAME,
                                           taskqueue=QUEUE_NAME,
                                           leaseSecs=60 * 30,
                                           numTasks=1)
result = lease_req.execute()

结果始终是 HttpError 403 - 权限不足

VM 已启用完整的云平台 api 访问权限。

问题是 TaskQueue API 只是 App Engine 的一项功能,因此无法从 Google Compute Engine 访问。

您应该可以通过 GoogleCredentials.get_application_default:

从 GCE 访问 TaskQueue
  1. 您使用的服务器必须启用任务队列、云 API 访问范围。参见 this discussion
  2. 或者服务器必须连接到具有适当权限的 Google 帐户,即正确的密钥必须在 /root/.config/gcloud/application_default_credentials.json 中(如果进程是 运行 在另一个用户下,然后在用户家搜索密钥)。
  3. 或者将环境变量 GOOGLE_APPLICATION_CREDENTIALS 指向正确的 json 密钥文件(您需要 service_account 密钥,而不是 authorized_user)。

service_account 密钥必须能够访问正确的范围,https://www.googleapis.com/auth/taskqueuehttps://www.googleapis.com/auth/taskqueue.consumer。 (要生成 OAuth2 凭据,请访问 Web Google GAE 控制台 API 管理器 - 凭据)。

您必须设置队列 ACL,以及 queue.yaml:

queue:
- name: myqueue
  mode: pull
  acl:
  - user_email: myemail@myemailserver.com
  - writer_email: myemail@myemailserver.com

一般 REST API 访问

您可以从任何机器访问 TaskQueue REST API。您也可以手动加载凭据:

from oauth2client.service_account import ServiceAccountCredentials
# use the right scopes by the queue ACL
SCOPES = ['https://www.googleapis.com/auth/taskqueue']
credentials = ServiceAccountCredentials.from_json_keyfile_name('myemail.json', scopes=SCOPES)
# or
credentials = ServiceAccountCredentials.from_p12_keyfile('myemail@myemailserver.com', '/path/to/myemail.p12', scopes=SCOPES)