Google cloud storage gsutil cp成功,但从存储客户端上载\u from_filename()方法失败
我想使用python中的google存储客户端将文件上载到GCS,但由于权限问题而失败,但是Google cloud storage gsutil cp成功,但从存储客户端上载\u from_filename()方法失败,google-cloud-storage,Google Cloud Storage,我想使用python中的google存储客户端将文件上载到GCS,但由于权限问题而失败,但是gsutil cp成功。我不明白为什么 下面是我使用gsutil运行的内容: BUCKET=abc $gcloud iam服务帐户密钥创建--iam帐户$account key_file.json 已将[json]类型的键[5006838b5984f1d3b4de6523239e9bbd2c7f7047]创建为[key_file.json]用于[serviceaccountname@myproject.i
gsutil cp
成功。我不明白为什么
下面是我使用gsutil
运行的内容:
BUCKET=abc
$gcloud iam服务帐户密钥创建--iam帐户$account key_file.json
已将[json]类型的键[5006838b5984f1d3b4de6523239e9bbd2c7f7047]创建为[key_file.json]用于[serviceaccountname@myproject.iam.gserviceaccount.com]
$gcloud auth activate服务帐户--密钥文件key\u file.json
已激活的服务帐户凭据:[serviceaccountname@myproject.iam.gserviceaccount.com]
$touch test.txt
$gsutil cp test.txt gs://${BUCKET}/test.txt
临摹file://test.txt [内容类型=文本/普通]。。。
/[1个文件][0.0 B/0.0 B]
操作已完成超过1个对象。
以下是我从python中尝试的内容:
从google.cloud导入存储
导入操作系统
os.environ['GOOGLE_应用程序_凭据']=“key_file.json”#与上面下载的文件相同
storage\u client=storage.client()
bucket_name=“abc”#bucket名称
source\u file\u name=“test.txt”
destination_blob_name=f“{source_file_name}”
打开(源文件名为“w”)作为f:
f、 书写(“lorem ipsum”)
bucket=存储\客户端.bucket(bucket\名称)
blob=bucket.blob(目的地\u blob\u名称)
blob.upload\u from\u filename(源文件名)
upload\u from\u filename()
函数失败,出现错误:
google.api_core.exceptions.probled:403 POST:('Request failed with status code',403','Expected one of',)
我很困惑。我本以为,如果这在gsutil中起作用,那么在使用python存储客户机时也会起作用。任何建议都是非常受欢迎的。此错误(403)表示用户未经谷歌云存储授权提出请求,基本上您需要记住:
- 此错误的常见原因是bucket权限(bucket ACL)未正确设置以允许您的应用访问。有关设置访问权限的信息,请参阅
- 你可以在官方网站上看到不同的原因
- 此错误的常见原因是bucket权限(bucket ACL)未正确设置以允许您的应用访问。有关设置访问权限的信息,请参阅
- 你可以在官方网站上看到不同的原因
- 我发现如果存储对象
不存在,代码就会成功。如果对象确实存在,则会发生上述错误destination\u blob\u name
访问bucket的权限由应用于bucket的自定义角色提供。当我向该自定义角色添加权限$ACCOUNT
&storage.objects.get
时,我的代码成功了,即使该对象已经存在storage.objects.delete
我发现
- 我已经找到了这个问题的根源。这是双重的
storage.objects.get
和storage.objects.delete
被描述为
- 读取对象数据和元数据,不包括ACL
- 删除对象
我从中了解到,在某些情况下(例如,当目标对象已经存在时),需要不同的权限才能访问。如果有人能解释这两种操作之间的区别,那么我很想更好地理解它。我已经找到了这个问题的根源。这是双重的
destination\u blob\u name
不存在,代码就会成功。如果对象确实存在,则会发生上述错误$ACCOUNT
访问bucket的权限由应用于bucket的自定义角色提供。当我向该自定义角色添加权限storage.objects.get
&storage.objects.delete
时,我的代码成功了,即使该对象已经存在storage.objects.get
和storage.objects.delete
被描述为
- 读取对象数据和元数据,不包括ACL
- 删除对象
我从中了解到,在某些情况下(例如,当目标对象已经存在时),需要不同的权限才能访问。如果有人能解释这两种操作之间的区别,那么我很想更好地理解它。这个python脚本最终会在Google云之外运行吗(在prem,在其他云上)?它是在Google云之外运行的。它是在我的笔记本电脑上运行的。是的,但最后呢?它还会在你的笔记本电脑上运行吗?你打算在哪里部署这个脚本?啊,我明白了。此脚本旨在作为CI管道中的测试运行。测试将运行,以验证
$ACCOUNT
是否具有适当的权限来执行它需要能够执行的操作。您好,感谢您的回复。我已经解决了这个问题。请看我发布的答案。这个python脚本最终会在Google云之外运行吗(在prem,在其他云上)?它是在Google云之外运行的。它是在我的笔记本电脑上运行的。是的,但最后呢?它还会在你的笔记本电脑上运行吗?你打算在哪里部署这个脚本?啊,我明白了。此脚本旨在作为CI管道中的测试运行。测试将运行,以验证$ACCOUNT
是否具有适当的权限来执行它需要能够执行的操作。您好,感谢您的回复。我已经解决了这个问题。请看我贴的答案。