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