【问题标题】:Google App Engine App failed to access Google Cloud Storage bucketGoogle App Engine 应用无法访问 Google Cloud Storage 存储分区
【发布时间】:2017-07-07 22:52:25
【问题描述】:

无法从 Appengine Project 访问默认的 Google Cloud Storage 存储分区。此项目是使用 1.9.0 之前的 App 引擎 SDK 版本创建的。我已经手动创建了存储桶,按照GCS Documentation,默认情况下,Appengine 项目可以访问存储桶,但在我的情况下它无法访问。这是尝试创建文件的代码 sn-p..

...
GcsService gcsService = GcsServiceFactory.createGcsService();
GcsFilename file = new GcsFilename(getGcsDefaultBucketName(), fileName);
GcsFileOptions.Builder builder = new GcsFileOptions.Builder();
GcsFileOptions options = builder.mimeType(mimeType).build();     
GcsOutputChannel channel = gcsService.createOrReplace(file, options); //erroring in this line
...

在日志中发现错误:

: com.google.appengine.tools.cloudstorage.NonRetriableException: java.lang.RuntimeException: Server replied with 403, verify ACLs are set correctly on the object and bucket: Request: POST https://storage.googleapis.com/1-ebilly.appspot.com/SERVICESTAGEREPORT-DEVICENAME-LYF2-CREATEDDATE-01012017-CREATEDDATE-19022017-.ZIP
: User-Agent: AppEngine-Java-GCS
: Content-Length: 0
: x-goog-resumable: start
: Content-Type: application/zip
: 
: no content: Response: 403 with 212 bytes of content
: X-GUploader-UploadID: AEnB2Upq0Lhtfy5pbt06pVib8J0-L0XiGqW4JpB0G9PL87keY3WV7RCMVLCPeclD-D4UATEddvvwpAG2qeeIxUJx--brKxdQFw
: Content-Type: application/xml; charset=UTF-8
: Content-Length: 212
: Vary: Origin
: <?xml version='1.0' encoding='UTF-8'?><Error><Code>AccessDenied</Code><Message>Access denied.</Message><Details>Caller does not have storage.objects.create access to bucket myprojectID.appspot.com.</Details></Error>
: 
:   at com.google.appengine.tools.cloudstorage.RetryHelper.doRetry(RetryHelper.java:120)
:   at com.google.appengine.tools.cloudstorage.RetryHelper.runWithRetries(RetryHelper.java:166)
:   at com.google.appengine.tools.cloudstorage.RetryHelper.runWithRetries(RetryHelper.java:156)
:   at com.google.appengine.tools.cloudstorage.GcsServiceImpl.createOrReplace(GcsServiceImpl.java:70)

PS:我尝试创建一个新的 Google Appengine 项目并部署了应用程序 init。该项目是使用默认的 GCS 存储桶自动创建的,并且相同的代码可以正常工作,没有任何错误。我的旧项目有很多数据库数据,我想保留这些数据并继续使用同一个项目而不对其进行处理。

请提出您的想法,以使 GCS 存储桶在旧项目中可访问。

【问题讨论】:

  • 我怀疑您的旧存储桶与今天的默认存储桶没有相同的权限。尝试为旧项目创建一个新存储桶,并使用它来获取必要的权限,然后在需要时手动将其应用于旧存储桶。存储桶命名不匹配也是可能的,也许使用明确命名的存储桶(而不是默认应用程序的存储桶)可以解决这种情况。
  • 感谢您的更新,问题已解决,详情请参阅我的回答。

标签: google-app-engine google-cloud-storage google-cloud-platform


【解决方案1】:

通过为 appengine 项目添加 IAM 许可解决了该问题。在阅读了IAM“项目级别的访问控制”文档并比较了旧项目和新项目的权限后,得知在旧项目中没有找到Appengine项目级权限。添加权限后,相同的代码开始访问默认存储桶。

IAM Permissions before fix screenshot

IAM Permissions after fix screenshot

【讨论】:

    【解决方案2】:

    试试这个:-

    GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
    GcsFileOptions options = new GcsFileOptions.Builder().mimeType(mime).build();
    GcsFilename gcsfilename = new GcsFilename(BUCKET_NAME, fileName);
    GcsOutputChannel outputChannel = gcsService.createOrReplace(gcsfilename, options);  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2014-03-10
      相关资源
      最近更新 更多