Google Cloud App Engine - gsutil 访问问题

Posted

技术标签:

【中文标题】Google Cloud App Engine - gsutil 访问问题【英文标题】:Google Cloud App Engine - gsutil access issue 【发布时间】:2021-07-07 03:38:33 【问题描述】:

我正在寻求帮助,以解决我用 Python3/Flask 编写并托管在 Google App Engine 上的应用程序。部署成功,但 App Engine 存在无法访问 GCS 的问题。

代码如下:

gs_util_command = "gsutil "
gs_util_command =  gs_util_command + " cp gs://"+ re.match(r"https.//storage.googleapis.com/(.*)",url1).group(1)
gs_util_command = gs_util_command + " "+str(destination_file_path)

我不断收到如下错误信息

错误消息:ServiceException: 401 Anonymous caller does not have storage.objects.get 访问 Google Cloud Storage 对象。

IAM 确认该服务拥有对 GCS 存储桶的所有者访问权限,但仍无法正常工作。

我尝试在 Python3 代码中运行以下语句并将其部署到 GCP:

  os.system("gsutil version -l")

在云上部署和执行后,我在 shell 日志中收到以下消息:

2021-04-12 01:36:18 默认[20210412t013030] gsutil 版本:4.61 2021-04-12 01:36:18 默认[20210412t013030] 校验和: PACKAGED_GSUTIL_INSTALLS_DO_NOT_HAVE_CHECKSUMS (!= 61834ed701604b43c83de6cfae9b36a4) 2021-04-12 01:36:18 默认[20210412t013030] boto 版本:2.49.0 2021-04-12 01:36:18 默认[20210412t013030] python版本:3.7.10(默认,3月23日 2021, 05:09:08) [GCC 7.5.0] 2021-04-12 01:36:18 默认[20210412t013030] 操作系统:Linux 4.4.0 2021-04-12 01:36:18 默认 [20210412t013030] 多处理可用:真 2021-04-12 01:36:18 默认[20210412t013030] 使用云 sdk: False 2021-04-12 01:36:18 默认[20210412t013030] 将云 sdk 凭据传递给 gsutil:假 2021-04-12 01:36:18 默认 [20210412t013030] 配置 路径:未找到配置

当我尝试通过 Google Cloud Shell 在本地运行相同的命令时,它工作正常。

gsutil version -l

输出是:

gsutil version: 4.60 checksum: 4e34e1f62b6d54d4826625581f787044 (OK) boto version: 2.49.0 python version: 3.7.3 (default, Jan 22 2021,

20:04:44) [GCC 8.3.0] 操作系统:Linux 5.4.89+ 多处理可用: True using cloud sdk:True 将 cloud sdk 凭据传递给 gsutil:True 配置路径:/home/jobsage_sai/.boto gsutil 路径: /usr/lib/google-cloud-sdk/bin/gsutil 编译 crcmod: 假安装 通过包管理器:False 可编辑安装:False

所有这些都在虚拟环境中。

请提出建议。

阿文德·R.

【问题讨论】:

【参考方案1】:

当您在 App Engine 标准上部署代码时,您只部署您的代码。它由 Google Cloud 获取,创建一个容器(使用Buildpacks)然后部署它。

当您使用 App Engine 创建应用程序时,它已经创建了一个 default bucket 并连接到 GCS。您无需在项目中设置任何其他内容即可使用

请注意:“容器由 Google Cloud 构建”。这意味着,您无法控制执行环境,不在基础映像上的内容,您拥有自己的代码。也许今天已经安装了 gsutil,但未来没有任何保证!

所以,正如Dishant所说,使用客户端库,或者直接the APIs来实现你想要的。


如果您使用 App Engine Flex 或 Cloud Run,情况就不同了。在这两种情况下,您都可以部署自己的容器(在 app Engine flex 上使用自定义运行时)。因此,您可以依赖底层运行时,因为您自己选择和管理它。

【讨论】:

【参考方案2】:

在 App Engine 上使用 Cloud Storage python Client 而不是 gsutil。

【讨论】:

以上是关于Google Cloud App Engine - gsutil 访问问题的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 Google App Engine 与 Google Cloud *** 一起使用?

Google App Engine - 大查询 - Python 找不到库 google.cloud

Google App Engine 上的 Production App 突然无法访问 Google Cloud Storage

Google Cloud Platform:Cloud Functions 与 App Engine

使用 Google App Engine 签名的 Google Cloud Storage 网址

本地 Google App Engine:ImportError:没有名为 google.cloud.bigquery 的模块