google-app-engine - Google App Engine 应用无法访问 Google Cloud Storage 存储桶

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

无法从 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 项目级别的权限。添加权限后,相同的代码开始访问默认存储桶。

IAM Permissions before fix screenshot

IAM Permissions after fix screenshot

关于google-app-engine - Google App Engine 应用无法访问 Google Cloud Storage 存储桶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42314419/

相关文章:

java - 如何更改JDO中对象的父对象?

google-cloud-storage - 保护 Google 存储桶的惯用方法

google-cloud-platform - 谷歌云存储每个文件的统计/下载

python - 如何使用时间戳过滤 dask.dataframe.read_parquet?

cassandra - Kubernetes集群架构

java - 无法从 Google 应用引擎发送电子邮件

java - 在 Gae 上创建一个大的 Zip 文件(在 blobstore 中)

google-app-engine - 使用 bulkloader 将字典导入 App Engine ndb.JsonProperty

java - Pubsub Java 订阅者在闲置一天后停止接收

ubuntu - Google Cloud VM 中的后台进程在一段时间后终止