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

Posted

技术标签:

【中文标题】Google App Engine 上的 Production App 突然无法访问 Google Cloud Storage【英文标题】:Production App on Google App Engine suddenly lost access to Google Cloud Storage 【发布时间】:2019-09-25 16:58:36 【问题描述】:

我们在 Google App Engine 上运行的生产应用(python 2.7 标准环境)突然失去了在 Google Cloud Storage 上写入(创建对象)的权限,而我们这边的代码没有任何更改。

代码能够创建新的存储桶,但不能在其中创建新对象。

似乎默认的应用引擎服务帐户没有被授予权限。 不用说,服务帐户具有存储对象创建者角色,以及项目级别的编辑者角色。

奇怪的是,在测试环境项目上运行的完全相同的代码仍然可以完美运行。 我们正在使用 api 客户端库来获取凭据,如下所示:

from oauth2client.appengine import AppAssertionCredentials
from apiclient.discovery import build as discovery_build

credentials = AppAssertionCredentials(scope=scope)
http = credentials.authorize(httplib2.Http())
service = discovery_build('storage', 'v1', http=http)

然后使用服务进行 api 调用。 所有创建对象的调用都突然失败并显示以下消息: "匿名调用者没有 storage.objects.create 访问 /"

有什么想法会突然出错吗??

【问题讨论】:

OAuth 访问令牌已过期(我怀疑正常错误是 403),或者您的代码未在 API 调用中使用访问令牌。 Anonymous caller 表示没有 HTTP 授权标头。对我来说,这表明您的代码中存在错误。 Google 客户端库会自动更新过期的令牌。我没用过AppAssertionCredentials。是否有理由使用此类而不是 ADC(应用程序默认凭据)样式类?能够创建存储桶但不能创建对象的问题可能表明您在这些 API 调用中使用了不同的凭据。 John,感谢您的评论,但是,1. 完全相同的代码在测试环境中运行,没有缺陷(相同的代码,不同的项目)。 2. 桶创建使用完全相同的凭据,并且成功。 3. 生产应用程序运行完美,直到几个小时前,没有更改任何代码...... 您的问题中没有提供足够的信息或代码让我知道问题所在。 嘿,我们目前遇到了同样的问题。它从 25.9 开始,在 26.9 上运行良好,但在 27.9 上再次出现,从那以后就一直存在。您在这些日期遇到同样的问题吗? 【参考方案1】:

这原来是 Google Cloud Storage (GCS) 的问题。 打开付费支持票,大约 90 小时后,Google GCS 工程师进行了回滚,解决了该问题,但未找到或报告问题的根本原因。 非常麻烦的是,一个生产应用程序会以这种方式受到如此长时间的影响,最终没有任何解释。

【讨论】:

以上是关于Google App Engine 上的 Production App 突然无法访问 Google Cloud Storage的主要内容,如果未能解决你的问题,请参考以下文章