1

無法從Appengine項目訪問默認的Google雲端存儲桶。此項目是使用1.9.0之前的App引擎SDK版本創建的。我已經手動創建了存儲桶,根據GCS Documentation,默認情況下該存儲桶可供Appengine項目訪問,但在我的情況下無法訪問。這是試圖創建一個文件中的代碼片段。在日誌中發現Google App Engine應用未能訪問Google雲端存儲桶

... 
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:我試圖創建一個新的谷歌的AppEngine項目和部署應用程序初始化。該項目是使用默認的GCS桶自動創建的,並且相同的代碼工作正常,沒有任何錯誤。我的舊項目有很多我想保留的DB數據,並繼續使用同一個項目而不處理它。

請幫助您的想法使舊項目中可以訪問GCS存儲桶。

+0

我懷疑你的舊桶不具有相同的權限目前的缺省桶。嘗試爲舊項目創建一個新存儲桶並使用它來獲取必要的權限,然後根據需要手動將其應用於舊存儲桶。一個桶命名不匹配也是可能的,也許使用明確命名的桶(而不是默認應用的桶)可以解決這種情況。 –

+0

感謝您的更新,我已解決問題,請參閱我的答案以獲取詳細信息。 – v7r

回答

0

試試這個: -

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); 
相關問題