2016-04-05 6 views
0

Ich habe eine Web-App, die eine Datei empfängt und dann versucht, sie zu Google Cloud Storage hinzuzufügen, die auf Google App Engine läuft. Dies ist der Fehler Ich erhalte:Google App Engine & Storage API-Authentifizierungsfehler

com.google.apphosting.api.ApiProxy$CallNotFoundException: The API package 'memcache' or call 'Get()' was not found. 
at com.google.apphosting.api.ApiProxy$1.get(ApiProxy.java:173) 
at com.google.apphosting.api.ApiProxy$1.get(ApiProxy.java:171) 
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:88) 
at com.google.appengine.api.memcache.MemcacheServiceImpl.quietGet(MemcacheServiceImpl.java:26) 
at com.google.appengine.api.memcache.MemcacheServiceImpl.get(MemcacheServiceImpl.java:49) 
at com.google.appengine.api.appidentity.AppIdentityServiceImpl.getAccessToken(AppIdentityServiceImpl.java:286) 
at com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential.intercept(AppIdentityCredential.java:98) 
at com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential$AppEngineCredentialWrapper.intercept(AppIdentityCredential.java:243) 
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859) 

Dies funktioniert auf meinem lokalen Rechner ganz gut (hat gutil und alles Setup). Es schlägt mit dem oben genannten fehl, wenn es nach GAE eingesetzt wird. Überprüfen Sie die Berechtigungen und es zeigt Zugriff auf alle Google Cloud APIs. Dieser Code ist der Teil, der direkt aus dem Google-Probe bei (https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/storage/json-api/src/main/java/StorageFactory.java)

private static Storage buildService() throws IOException, GeneralSecurityException { 
HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport(); 
JsonFactory jsonFactory = new JacksonFactory(); 
GoogleCredential credential = GoogleCredential.getApplicationDefault(transport, jsonFactory); 

if (credential.createScopedRequired()) { 
    Collection<String> bigqueryScopes = StorageScopes.all(); 
    credential = credential.createScoped(bigqueryScopes); 
} 

return new Storage.Builder(transport, jsonFactory, credential) 
    .setApplicationName("GCS Samples") 
    .build(); 
} 

Der Vollständigkeit versagt, hier ist der Code, der die Build oben (wieder von der Github Probe Link oben) verwendet

  Storage client = StorageFactory.getService(); 
     Storage.Objects.Insert insertRequest = client.objects().insert(
       bucketName, objectMetadata, contentStream); 
     insertRequest.execute(); 

Die deps Abschnitte pom.xml

<parent> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-parent</artifactId> 
<version>1.3.2.RELEASE</version> 
<relativePath/> <!-- lookup parent from repository --> 
</parent> 
<dependencies> 
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
</dependency> 

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-test</artifactId> 
    <scope>test</scope> 
</dependency> 

<dependency> 
    <groupId>com.google.appengine.tools</groupId> 
    <artifactId>appengine-gcs-client</artifactId> 
    <version>RELEASE</version> 
</dependency> 

Die GAE Konsole zeigt es GAE v1.9.35 verwenden. Hier sind die geschwärzten Informationen von einer Instanz der perms verfügbar am unteren

zeigen
Module & version 
Module: default 
Version: 20160405t155800 
App Engine version: 1.9.35 
Managed by 
Google 
Availability 
... 
GAE managed VM for module: default, version: 20160405t155800 
Tags 
None 
Machine type 

g1-small (1 vCPU, 1.7 GB memory) 
CPU platform 

Intel Haswell 
Zone 

us-central1-c 

IP forwarding 

off 
Boot disk and local disks 

Name Size (GB) Type Mode  
redacted 
10 
Standard persistent disk 
Boot, read/write 

Delete boot disk when instance is deleted 
Additional disks 


Preemptibility 
Off (recommended) 
Automatic restart 
Off 
On host maintenance 
Terminate VM instance 
Service account 
----- 
Cloud API access scopes 

This instance has full API access to all Google Cloud services.  

Auch die App funktioniert lokal und sendet das Hochladen von Dateien in Google Cloud Storage. Habe mehrmals versucht, die App ohne Glück auf GAE hochzuladen. Diese App auf die GAE Flexible Ausgaben bereitgestellt wurde, zeigt dies:

latest: Pulling from google_appengine/openjdk8 

Auch mit der GcsService lib in einer anderen Art und Weise versagt, aber ich vermute, es liegt daran, dass aus irgendeinem Grunde, meine App nicht richtig erkannt wird auf GAE als GAE-App mit der entsprechenden Berechtigung:

Caused by: java.io.IOException: java.lang.NullPointerException 
at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService$BlobStorageAdapter.getInstance(LocalRawGcsService.java:186) 
at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService$BlobStorageAdapter.access$000(LocalRawGcsService.java:109) 
at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService.ensureInitialized(LocalRawGcsService.java:194) 
at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService.beginObjectCreation(LocalRawGcsService.java:249) 
at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService.beginObjectCreation(LocalRawGcsService.java:92) 
at com.google.appengine.tools.cloudstorage.GcsServiceImpl$1.call(GcsServiceImpl.java:74) 
at com.google.appengine.tools.cloudstorage.GcsServiceImpl$1.call(GcsServiceImpl.java:70) 

Code:

   GcsOutputChannel outputChannel = gcsService.createOrReplace(fileName, GcsFileOptions.getDefaultInstance()); 
      InputStream inputStream = uploadfile.getInputStream(); 
      copy(inputStream, Channels.newOutputStream(outputChannel)); 

Antwort

1

Sie die GAE Standard-APIs nur (wie in diesem Beispiel com.google.appengine.api.memcache) verwenden können, auf die Basislaufzeiten, die es unterstützen. Die Liste ist da: https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build#base_images

Die Basislaufzeit in Ihrem Fall verwendet wird, ist google_appengine/openjdk8, die nicht die GAE Standardumgebung APIs unterstützt.

Nun können Sie den neuen Java Cloud-APIs (dazu zählt auch GCS Speicherzugriff) über diese gcloud-Java-Bibliothek: https://github.com/GoogleCloudPlatform/gcloud-java