无法从 Appengine Project 访问默认的 Google Cloud Storage 存储桶。此项目是使用 1.9.0 之前的 App Engine SDK 版本创建的。我已经根据 GCS Documentation 手动创建了存储桶据说默认情况下,Appengine Projects 可以访问该存储桶,但在我的情况下无法访问。这是尝试创建文件的代码片段..
...
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 项目并部署应用程序初始化。该项目是使用默认 GCS 存储桶自动创建的,相同的代码运行良好,没有任何错误。我的旧项目有很多数据库数据,我想保留这些数据并继续使用同一个项目而不处理它们。
请提供您的想法,使旧项目中的 GCS 存储桶可访问。
最佳答案
通过为应用引擎项目添加 IAM 权限解决了这个问题。在阅读 IAM“项目级别的访问控制”文档并比较旧项目和新项目权限后,才知道在旧项目中找不到 Appengine 项目级别的权限。添加权限后,相同的代码开始访问默认存储桶。
关于google-app-engine - Google App Engine 应用无法访问 Google Cloud Storage 存储桶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42314419/