1

Appengine ProjectからデフォルトのGoogle Cloud Storageバケットにアクセスできません。このプロジェクトは1.9.0より前のApp Engine SDKバージョンで作成されました。私は手動でバケツを作成しました。GCS Documentationによれば、デフォルトではバケットはAppengine Projectsにアクセス可能ですが、私の場合はアクセスできません。これは、ファイルを作成しようとするコードスニペット..ですログで見つかったGoogle App Engine AppがGoogle Cloud Storageバケットにアクセスできない

... 
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バケットで作成され、同じコードがエラーなく正常に動作しています。私の古いプロジェクトには、保持したい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); 
+0

私はあなたの古いバケツが今日のデフォルトのバケットと同じ権限を持っていない疑いがあります。古いプロジェクトの新しいバケットを作成し、それを使用して必要な権限を取得し、必要に応じて古いバケットに手動で適用してください。バケットの名前の不一致も可能です。デフォルトのバケットの代わりに明示的に指定されたバケットを使用すると、このようなケースに対処できます。 –

+0

更新していただきありがとうございます。私は問題を解決しました。 – v7r

答えて

0

はこれを試してみてください。 IAMの「プロジェクトレベルでのアクセス制御」ドキュメントを読み、古いプロジェクトと新しいプロジェクトの権限を比較した結果、Appengineのプロジェクトレベルの権限が古いプロジェクトにはないことがわかりました。権限を追加した後、同じコードがデフォルトのバケットにアクセスし始めました。

IAM Permissions before fix screenshot

IAM Permissions after fix screenshot

0

のAppEngineのプロジェクトのためのIAM permissinを追加することで問題を解決しました - :

関連する問題