2016-06-09 6 views
0

Ich benutze GCSService zum Schreiben von Datei in einem GoogleCloudStorage Bucket, alles funktioniert gut mit Online-Instanz, aber wenn ich meinen Code auf meinem lokalen Dev-Server testen möchte Es ist nicht möglich, in einen Bucket zu schreiben (einen lokalen Bucket wie für den Datenspeicher zu emulieren). Zusätzliche Schwierigkeit, die ich versuche, auf meinem lokalen Server mit Remote-API von Fat-Client zu schreiben, suche ich im ganzen Web Ich finde meine Antwort nicht. Wenn ich meine createOrUpdate() -Methode aufrufe, habe ich diese Ausnahme:Google App-Engine Java-API im Bucket auf lokalen Dev-Server funktioniert nicht

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/InstanceName/FileInfos 

Es scheint zu versuchen, auf meinem Online-Eimer zu schreiben ...

GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance()); 
... 
RemoteApiOptions destination = RemoteConnection.connect(destinationServer); 
RemoteApiInstaller destinationInstaller = new RemoteApiInstaller(); 
destinationInstaller.install(destination); 
try 
{ 
    GcsOutputChannel outputChannel = gcsService.createOrReplace(new GcsFilename(destinationBucketServer, fileInfo.getFilename()), 
      GcsFileOptions.getDefaultInstance()); 

    outputChannel.write(ByteBuffer.wrap(data)); 
    outputChannel.close(); 
} 
catch (Exception e) 
{ 
    .... 
} 
finally 
{ 
    buffer.flush(); 
    destinationInstaller.uninstall(); 
} 

mit gleichem Code, den ich in Datastor schreiben kann, ohne jedes Problem, es ist nur ein Speicherprobleme.

Antwort

1

Siehe die Google Cloud Storage Errors and Error Handling und Service Account Dokumente.

403 zeigt an, dass der Benutzer nicht berechtigt war, die Anfrage zu stellen. Bei der Ausführung Ihrer GCE-Instanz vermute ich, dass Ihr Code in einem Dienstkonto ausgeführt wird, das über Schreibberechtigungen für Ihren Bucket verfügt. Wenn Sie lokal arbeiten, müssen Sie entsprechende Anmeldeinformationen bereitstellen, um das gleiche zu tun.

+0

Ja, ich weiß, was 403 bedeutet, aber wo ich lokale ACL für lokale Bucket konfigurieren kann, finde ich nichts über diese Konfiguration. In der Ausnahme gibt es eine entfernte URL POST https://storage.googleapis.com/InstanceName/FileInfos, wie es versuchen, online hochzuladen. Danke für die Beantwortung – Benjyyyyy

+0

Zusätzlich dazu verwende ich Development Server Credential für die Verbindung zu meinem lokalen Server, was ich hier verpasst habe? Warum bietet dieser Code keinen Zugriff? neuer RemoteApiOptions() .server (server.getAddress(), server.getPort()). UseDevelopmentServerCredential(); – Benjyyyyy

0

Ich fand heraus, warum dies nicht funktioniert, in der Tat Aufruf GCS über RemoteAPI nicht auf lokalen Server schreiben, schreibt es auf Online-Bucket. Deshalb hatte ich keine richtige ACL, mein Code versucht, eine Verbindung zu Cloud Storage herzustellen. Aber jetzt weiß ich nicht, wie GCSService gezwungen wird, auf meinem lokalen Server zu schreiben.

+0

App Engine unterstützt die Datenspeicheremulation. Sind Sie sicher, dass die Cloud Storage-Emulation unterstützt wird? – jarmod

+0

Ja, es unterstützt die Cloud Storage-Emulation, wenn Sie GCSService im lokalen Kontext verwenden. In meinem Fall versuchen wir über RemoteAPI in den lokalen Cloud-Speicher zu schreiben, in diesem Zusammenhang funktioniert es nicht – Benjyyyyy