如何从命令行使用服务帐户访问 Google 云存储存储桶?

如何从命令行使用服务帐户访问 Google 云存储存储桶?

我认为这样做很简单,但我无法让它发挥作用:

我正在尝试将文件从服务器 (GCE) 推送到 Google 云存储桶。为了避免授予gsutil服务器上的命令过多权限,我在我的 Google 项目的凭据部分创建了一个“服务帐户”。

在存储桶中,gs://mybucket我已将该服务帐户的电子邮件地址以 USER 身份添加到存储桶,并具有 OWNER 权限。

在服务器上我像这样激活了服务帐户:

$gcloud auth activate-service-account --key-file <path-to-keyfile> myservice

$gcloud auth list
Credentialed accounts:
 - [email protected]
 - myservice (active)

To set the active account, run:
  $ gcloud config set account <account>

到目前为止一切似乎都很好。但是,访问存储桶失败:

$gsutil cp tempfile gs://mybucket
CommandException: Error retrieving destination bucket gs://mybucket/: [('PEM routines', 'PEM_read_bio', 'no start line')]

$gsutil cp tempfile gs://mybucket/tempfile
Failure: [('PEM routines', 'PEM_read_bio', 'no start line')].

当然,我确实验证了存储桶的 ACL 确实将服务帐户显示为 OWNER。我也在另一台使用不同操作系统的机器上尝试了此操作。结果相同。不用说,我自己无法理解错误消息。我很感激任何建议。详细错误日志这个要点

更新:

~/.config删除存储授权数据的后gcloud,使用已弃用的命令

gsutil config -e

将按预期使用服务帐户生成~/.boto。随后访问gs://mybucket 确实有效

但是,我不确定这是否是我应该遵循的路径。如何使用 来实现这一点gcloud auth

答案1

我遇到了同样的问题。Google 开发者控制台给我的默认密钥文件实际上是一个 .json 文件,其中密钥材料位于 json 字段中。我使用“gcloud auth revoke”撤销了服务帐户,从开发者控制台生成了一个新密钥,并将密钥下载为 .p12 文件,这次在激活服务帐户后,它就可以正常工作了。

答案2

记录一下,我今天尝试通过生成的 GCE 实例启用服务帐户时看到了同样的错误消息json 密钥文件。实例上预装的 Gcloud sdk 太旧,无法正确使用 json 密钥。此外,尝试以这种方式启用我的帐户时,该工具不会给出任何反馈,但尝试使用该帐户进行授权会失败并出现上述错误。

安装当前版本后,我能够通过启用我的服务帐户gcloud auth activate-service-account --key-file /key.jsongsutil cp file gs://testbucket/正常工作。

相关内容