我正在使用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
我使用/ 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。
在进一步探索中,我在:
使用了基于Web的API资源管理器storage.objects.gethttps://developers.google.com/apis-explorer/#p/storage/v1/storage.objects.get
获取对象的“mediaLink”。当我点击mediaLink时,尽管在浏览器上登录了我的Google帐户,我仍会收到“需要登录”的回复。
为什么我在案例1中按照说明设置了服务帐户并在案例2中登录API资源管理器时,在这两种情况下都收到了上述“需要登录”的响应?
答案 0 :(得分:1)
我能够通过查看.boto文件的读取权限来解决此问题。由
创建的文件gsutil config -e
仅为当前用户设置了读取权限。由于它是由作为不同用户运行的服务读取的,因此无法读取该文件并产生401 Login Required错误。我通过为服务组添加读取权限来修复它。
在最不复杂的情况下,您可以通过向
授予任何用户读取权限来修复它chmod a+r .boto