gsutil AccessDenied 异常 - API Explorer 和服务帐户都需要登录
gsutil AccessDenied Exception - Login Required in both API Explorer and Service Account
我正在使用带有服务帐户的 gsutil 从 gs 存储桶下载文件。我 运行 一小时前它运行了一次并且没有问题,然后我再次 运行 相同的代码并且我得到一个 AccessDeniedException: 401 Login Required.
为了获得更多信息,我 运行 带有 -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 资源管理器
为了进一步探索,我使用了基于网络的 API 资源管理器 storage.objects.get,网址为:
https://developers.google.com/apis-explorer/#p/storage/v1/storage.objects.get
获取对象的"mediaLink"。当我单击 mediaLink 时,尽管我已在浏览器上登录到我的 google 帐户,但我仍然收到 "Login Required" 的响应。
当我按照案例 1 中的说明设置服务帐户并在案例 2 中登录到 API 浏览器时,为什么我在这两种情况下都会收到上述 "Login Required" 响应?
我通过查看 .boto 文件的读取权限解决了这个问题。
创建的文件
gsutil config -e
仅为当前用户设置了读取权限。由于服务 运行 正在以不同的用户身份读取它,因此它无法读取文件并产生 401 Login Required 错误。我通过为服务组添加读取权限来修复它。
在最简单的情况下,您可以通过
授予任何用户读取权限来修复它
chmod a+r .boto
我正在使用带有服务帐户的 gsutil 从 gs 存储桶下载文件。我 运行 一小时前它运行了一次并且没有问题,然后我再次 运行 相同的代码并且我得到一个 AccessDeniedException: 401 Login Required.
为了获得更多信息,我 运行 带有 -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 资源管理器
为了进一步探索,我使用了基于网络的 API 资源管理器 storage.objects.get,网址为:
https://developers.google.com/apis-explorer/#p/storage/v1/storage.objects.get
获取对象的"mediaLink"。当我单击 mediaLink 时,尽管我已在浏览器上登录到我的 google 帐户,但我仍然收到 "Login Required" 的响应。
当我按照案例 1 中的说明设置服务帐户并在案例 2 中登录到 API 浏览器时,为什么我在这两种情况下都会收到上述 "Login Required" 响应?
我通过查看 .boto 文件的读取权限解决了这个问题。
创建的文件gsutil config -e
仅为当前用户设置了读取权限。由于服务 运行 正在以不同的用户身份读取它,因此它无法读取文件并产生 401 Login Required 错误。我通过为服务组添加读取权限来修复它。
在最简单的情况下,您可以通过
授予任何用户读取权限来修复它chmod a+r .boto