gsutil AccessDenied Exception - API Explorer和服务帐户

时间:2016-03-16 09:38:51

标签: authentication google-cloud-storage gsutil

我正在使用gsutil和服务帐户从gs存储桶下载文件。我在一小时前运行它并且它没有问题,然后我再次运行相同的代码,我得到一个AccessDeniedException:401需要登录。

要获取更多信息,我使用-D标志运行命令,如:

gsutil -D cp gs://mybucket/file localpath

在调试输出中,我看一下:

Command being run: /path/to/gsutil
config_file_list: /path/to/boto/config

案例1:在服务帐户或其他用户

下运行gsutil

我使用/ path / to / gsutil中的可执行文件配置了服务帐户,而不是gcloud auth或计算机上的任何其他gsutil可执行文件,使用:

/path/to/gsutil config -e

这在我的主目录$ HOME / .boto中创建了一个.boto配置文件,然后我将其移动到另一个位置以供服务引用。

由于我以另一个用户身份运行该服务,因此我需要引用新创建的.boto文件。我设置了环境变量BOTO_CONFIG:

BOTO_CONFIG=/path/to/$HOME/.boto
export BOTO_CONFIG

我可以通过查看gsutil -D命令输出中的config_file_list变量来确认我引用了正确的配置文件。

要设置服务帐户,我遵循:

https://console.cloud.google.com/permissions/serviceaccounts

下载了服务帐户设置过程中的密钥文件,并在gsutil config -e步骤中包含了其路径。

但是,从服务帐户运行gsutil命令的响应是AccessDeniedException:401 Login Required。

案例2:API Explorer

在进一步探索中,我在:

使用了基于Web的API资源管理器storage.objects.get

https://developers.google.com/apis-explorer/#p/storage/v1/storage.objects.get

获取对象的“mediaLink”。当我点击mediaLink时,尽管在浏览器上登录了我的Google帐户,我仍会收到“需要登录”的回复。

为什么我在案例1中按照说明设置了服务帐户并在案例2中登录API资源管理器时,在这两种情况下都收到了上述“需要登录”的响应?

1 个答案:

答案 0 :(得分:1)

我能够通过查看.boto文件的读取权限来解决此问题。由

创建的文件
gsutil config -e 

仅为当前用户设置了读取权限。由于它是由作为不同用户运行的服务读取的,因此无法读取该文件并产生401 Login Required错误。我通过为服务组添加读取权限来修复它。

在最不复杂的情况下,您可以通过向

授予任何用户读取权限来修复它
chmod a+r .boto