Google cloud storage gsutil cp成功,但从存储客户端上载\u from_filename()方法失败

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

我想使用python中的google存储客户端将文件上载到GCS,但由于权限问题而失败,但是
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)未正确设置以允许您的应用访问。有关设置访问权限的信息,请参阅
  • 你可以在官方网站上看到不同的原因
此错误(403)表示用户未经谷歌云存储授权发出请求,基本上您需要记住:

  • 此错误的常见原因是bucket权限(bucket ACL)未正确设置以允许您的应用访问。有关设置访问权限的信息,请参阅
  • 你可以在官方网站上看到不同的原因

    • 我已经找到了这个问题的根源。这是双重的

    • 我发现如果存储对象
      destination\u blob\u name
      不存在,代码就会成功。如果对象确实存在,则会发生上述错误
    • $ACCOUNT
      访问bucket的权限由应用于bucket的自定义角色提供。当我向该自定义角色添加权限
      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
      是否具有适当的权限来执行它需要能够执行的操作。您好,感谢您的回复。我已经解决了这个问题。请看我贴的答案。