我按照文档调用存储传输 API。 https://cloud.google.com/storage-transfer/docs/reference/rest/v1/transferJobs/patch
这是我的代码。
from pprint import pprint
from googleapiclient import discovery
import google.auth
credentials, project = google.auth.default()
service = discovery.build("storagetransfer", "v1", credentials=credentials)
job_name = "transferJobs/XXXXXXXXXXXXXXXX"
update_transfer_job_request_body = {
"transferJob": {"description": "xxxxxxxxxxx"},
"projectId": project,
}
request = service.transferJobs().patch(
jobName=job_name, body=update_transfer_job_request_body
)
response = request.execute()
pprint(response)
在执行此脚本之前,我运行了gcloud config list
以确保项目 ID 正确且未设置环境变量GOOGLE_APPLICATION_CREDENTIALS
。
但是我在下一个返回的错误消息中看到另一个项目 ID(aaa)。
googleapiclient.errors.HttpError:请求 https://storagetransfer.googleapis.com/v1/transferJobs/XXXXXXXXXXXXXXXX?alt=json 时
[{'@type': 'type.googleapis.com/google.rpc.Help', '链接': [{'description': 'Google 开发者控制台 IAM admin', 'url': 'https://console.developers.google.com/iam-admin/iam/project?project=aaaaaaaaaaa'}]}, {'@type': 'type.googleapis.com/google.rpc.ErrorInfo', '原因': 'USER_PROJECT_DENIED', '域': 'googleapis.com', '元数据': {'服务': 'storagetransfer.googleapis.com', '消费者': '项目/aaa
我假设项目 IDaaaaaaaaaaa
与您的一个项目的 ID 不对应。
我不在可以轻松使用gcloud
的设备上,但是,当我到达一个设备时,我将添加gcloud
使用的项目 ID,以从具有gcloud auth application-default
凭据的用户帐户合成服务帐户。
我认为您不应该使用gcloud auth application-default
凭据,而应该在您的项目中创建一个服务帐户,授予它适当的权限并对其进行身份验证。
如果您的代码在 GCP 下运行,则需要在运行代码之前export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key
。
使用gcloud auth application-default
对于测试代码很有用,但越来越不鼓励使用正确的服务帐户。它的一个问题是,综合服务帐户由Google拥有的项目(aaaaaaaaaaa
)拥有,而不是用户拥有的项目,并且Google拥有的项目并未启用每个Google API。
我认为这就是您遇到的问题。
正如@DazWilkin所说,使用服务帐户会更合适,除此之外,还可以添加Cloud IAM权限serviceusage.services.enable
来启用服务。根据您需要的功能(例如列表服务),您需要serviceusage.services.list
可以解决错误。
通常,您可以添加角色roles/serviceusage.serviceUsageAdmin
其中包括以下权限:
- serviceusage.services.get
- serviceusage.services.list
- serviceusage.services.enable
- serviceusage.services.disable
有关服务使用情况使用 IAM 控制对服务的访问的更多信息,请参阅此文档,并参考此文档以向服务账户添加角色。