Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine Google应用程序引擎应用程序无法访问Google云存储桶_Google App Engine_Google Cloud Storage_Google Cloud Platform - Fatal编程技术网

Google app engine Google应用程序引擎应用程序无法访问Google云存储桶

Google app engine Google应用程序引擎应用程序无法访问Google云存储桶,google-app-engine,google-cloud-storage,google-cloud-platform,Google App Engine,Google Cloud Storage,Google Cloud Platform,无法从Appengine项目访问默认的Google云存储桶。此项目是使用1.9.0之前的App engine SDK版本创建的。我已经手动创建了bucket,因为默认情况下Appengine项目可以访问bucket,但在我的例子中它是不可访问的。这是尝试创建文件的代码段 ... GcsService gcsService = GcsServiceFactory.createGcsService(); GcsFilename file = new GcsFilename(getGcsDefault

无法从Appengine项目访问默认的Google云存储桶。此项目是使用1.9.0之前的App engine SDK版本创建的。我已经手动创建了bucket,因为默认情况下Appengine项目可以访问bucket,但在我的例子中它是不可访问的。这是尝试创建文件的代码段

...
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:我已经尝试创建一个新的GoogleAppEngine项目,并部署了AppInit。该项目是使用默认的GCS bucket自动创建的,相同的代码工作正常,没有任何错误。我的旧项目有很多DB数据,我想保留这些数据,并继续使用同一个项目而不进行处理

请帮助您思考如何在旧项目中访问GCS存储桶。

尝试以下方法:-

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);  

通过为appengine项目添加IAM许可证解决了此问题。阅读IAM“项目级访问控制”文档并比较旧项目和新项目权限后,发现在旧项目中找不到Appengine项目级权限。添加权限后,相同的代码开始访问默认bucket


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