2016-09-04 21 views
0

Google App Engineで実行中のjaxrsサービスを使用してGoogle Cloud Storageにファイルを保存しようとしています。ファイルを保存しようとしているうちに、エラーが発生しています。Google Cloud Storage - com.google.appengine.api.appidentity.AppIdentityServiceFailureException

com.google.appengine.tools.cloudstorage.NonRetriableException:com.google.appi.appi.appidentity.AppIdentityServiceFailureException:AppIdentityサービスが予期しないエラーをスローしました。詳細:

ファイルを新しいバケットに保存しようとしましたが、下位バージョン(計算エンジン、サービスエンジン、サービスアカウント)の権限をバケットに渡しました。私はまた、別のサービスアカウントを作成し、(プロジェクトにこのアカウントに編集者の役割を持つ)もライター許可をこのサービスアカウントを与えた

私は、デフォルトのサービスとアプリエンジンから、我々は、ファイルを保存することができなければならないため、サービスアカウントが必要とされていません理解しています。しかし、私はまた、上記のサービスアカウントを作成し、WEB-INF /リソース/ service_account_credentials.jsonの場所にファイルを保存しようとすると、私は二つの方法の下にしようとした

<property name="GOOGLE_APPLICATION_CREDENTIALS" value="WEB-INF/resources/service_account_credentials.json"/> 

のappengine-web.xmlに以下のプロパティを設定しますファイルを格納しますが、両方ともエラーを出しています。また、以下に示すよう

最初の方法は...

は...同じエラーを与えるファイル

GcsFileOptions gcsFileOptions = null ; 
    GcsFileOptions.Builder builder = new GcsFileOptions.Builder() ; 
    if(aclEntityName != null) 
     builder = builder.acl(aclEntityName) ; 


    if(fileMetaData != null && !fileMetaData.isEmpty()) 
    for(Map.Entry<String, String> entry : fileMetaData.entrySet()){ 
     builder = builder.addUserMetadata(entry.getKey(), entry.getValue()) ; 
    } 
    gcsFileOptions = builder.build() ; 
    GcsFilename fileName = new GcsFilename(bucketName, name) ; 
    GcsService gcsService = StorageFactory.getGcsService() ; 
    GcsOutputChannel outputChannel = gcsService.createOrReplace(fileName, gcsFileOptions); 
    copy(contentStream, Channels.newOutputStream(outputChannel)); 

第二の方法の保管サービス

GcsService gcsService = GcsServiceFactory.createGcsService(new RetryParams.Builder() 
      .initialRetryDelayMillis(10) 
      .retryMaxAttempts(10) 
      .totalRetryPeriodMillis(15000) 
      .build()); 

を取得します

は私が間違って何をやっている第二の方法

StorageObject objectMetaData = new StorageObject(); 
objectMetaData.setName(name); 

if(fileMetaData != null && fileMetaData.isEmpty() == false) 
    objectMetaData.setMetadata(fileMetaData) ; 

    // Set the access control list to publicly read-only 

if(aclEntityName != null && !aclEntityName.trim().equals("") 
    && aclRole != null && !aclRole.trim().equals("")) { 
    objectMetaData.setAcl(Arrays.asList(
     new ObjectAccessControl().setEntity(aclEntityName).setRole(aclRole))); 
} 

InputStreamContent mediaContent = new InputStreamContent("application/octet-stream", contentStream); 


// Do the insert 
Storage client = StorageFactory.getService(); 
Storage.Objects.Insert insertRequest = client.objects().insert(
     bucketName, objectMetaData, mediaContent);  
if (mediaContent.getLength() > 0 && mediaContent.getLength() <= 2 * 1000 * 1000 /* 2MB */) { 
    insertRequest.getMediaHttpUploader().setDirectUploadEnabled(true); 
    } 
insertRequest.execute(); 

ファイルを保存するサービス

HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport(); 
JsonFactory jsonFactory = new JacksonFactory(); 
GoogleCredential credential = 
GoogleCredential.getApplicationDefault(transport, jsonFactory); 
if (credential.createScopedRequired()) { 
     Collection<String> scopes = StorageScopes.all(); 
     credential = credential.createScoped(scopes); 
    } 
    return new Storage.Builder(transport, jsonFactory, credential) 
      .setApplicationName("GCS Samples") 
      .build(); 

を取得しますか?このエラーを修正するために必要な設定はありますか?助けてください !!! GOOGLE_APPLICATION_CREDENTIALS環境変数を使用してGoogle Application Default Credentialsの私の理解から、

+0

例外は詳細を提供しますか(「詳細:」の後)?もしそうなら、あなたの質問にそれを含めてください。 – SimonJ

+0

いいえ、詳細情報の前に情報はありません。ただ空白のスペース。 –

答えて

0

は、ローカルファイルを指すべきである、と一般的にローカルでコードをテストするときに認証するgcloudコマンドラインツールで使用されています。

つまり、https://stackoverflow.com/a/36408645/374638によれば、これはおそらく<env-variables>にあるはずです。

関連する問題