2014-09-29 12 views
8

Sto tentando di impostare un caricamento del file di Google Cloud Storage seguendo lo sample from google con GcsExampleServlet.java. Ho completato tutto il passo, ma quando ho distribuire il progetto per aggengine e cerco di caricare un semplice testo in GCS, è riuscire con questo registro:Google Appengine & cloud storage: il servizio AppIdentity ha generato un errore imprevisto

com.google.appengine.tools.cloudstorage.NonRetriableException: com.google.appengine.tools.cloudstorage.NonRetriableException: com.google.appengine.api.appidentity.AppIdentityServiceFailureException: 
The AppIdentity service threw an unexpected error. Details: 
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) 
at com.appart.storage.server.GcsExampleServlet.doPost(GcsExampleServlet.java:88) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
(...) 

Eppure, non c'è niente di complicare il codice .. . in web.xml ho configurato il servlet:

<servlet> 
    <servlet-name>GcsExample</servlet-name> 
    <servlet-class> 
     com.example.server.GcsExampleServlet 
    </servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>GcsExample</servlet-name> 
    <url-pattern>/gcs/*</url-pattern> 
</servlet-mapping> 

Ecco la GcsExampleServlet.java servlet (esattamente come nel campione di google):

@SuppressWarnings("serial") 
public class GcsExampleServlet extends HttpServlet { 

    private final GcsService gcsService = GcsServiceFactory.createGcsService(new RetryParams.Builder() 
     .initialRetryDelayMillis(10) 
     .retryMaxAttempts(10) 
     .totalRetryPeriodMillis(15000) 
     .build());  
    //... 
    @Override 
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException 
    { 
    GcsOutputChannel outputChannel = 
    gcsService.createOrReplace(getFileName(req), GcsFileOptions.getDefaultInstance()); 
    copy(req.getInputStream(), Channels.newOutputStream(outputChannel)); 
    } 

    private void copy(InputStream input, OutputStream output) throws IOException { 
    try { 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     int bytesRead = input.read(buffer); 
     while (bytesRead != -1) { 
     output.write(buffer, 0, bytesRead); 
     bytesRead = input.read(buffer); 
     } 
    } finally { 
     input.close(); 
     output.close(); 
    } 
    } 
} 

Ecco il mio file upload.html :

<form action="/upload.html" enctype="text/plain" method="get" name="putFile" id="putFile"> 
    <div> 
     Bucket: <input type="text" name="bucket" /> 
     File Name: <input type="text" name="fileName" /> 
     <br /> File Contents: <br /> 
     <textarea name="content" id="content" rows="3" cols="60"></textarea> 
     <br /> 
     <input type="submit" onclick='uploadFile(this)' value="Upload Content" /> 
    </div> 
</form> 
<script> 

    function uploadFile() { 
    var bucket = document.forms["putFile"]["bucket"].value; 
    var filename = document.forms["putFile"]["fileName"].value; 
    if (bucket == null || bucket == "" || filename == null || filename == "") { 
     alert("Both Bucket and FileName are required"); 
     return false; 
    } else { 
     var postData = document.forms["putFile"]["content"].value; 
     document.getElementById("content").value = null; 

     var request = new XMLHttpRequest(); 
     request.open("POST", "/gcs/" + bucket + "/" + filename, false); 
     request.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); 
     request.send(postData); 
    } 
    } 
</script> 

Ho attivato Fatturazione, creato un bucket ma l'errore AppIdentity è ancora visualizzato. Non ho Oauth, l'API di cloud storage è abilitata, l'account appengine utilizzato per caricare ha accesso in scrittura al bucket. Ho anche provato a

gsutil acl ch -u [email protected]:WRITE gs://ctrlxbucket 

Per essere sicuro che l'utente abbia accesso in scrittura al mio bucket.

Please help me per capire che cosa significa questo errore, io sono qui dal bastone giorni :(

Grazie mille

PS: Se v'è solo qualche esempio di lavoro del GCS (non il google uno), sarò felice anche perché non c'è molta roba intorno all'argomento

+1

Sto riscontrando un problema simile per qualsiasi progetto AppEngine creato di recente per parlare con GCS. Nel codice AppEngine python ricevo InternalError relativo al codice token per l'accesso GCS. Il problema sembra essere la mancanza di credenziali in qualsiasi nuova app AppEngine, ad es. se si guarda Api e auth -> Credenziali in Dev Console, potrebbe non avere gli ID cliente "Compute Engine e AppEngine" per l'account di servizio. Ho un'app legacy, creata l'anno scorso, che funziona comunque bene. –

+1

@Abhijit Kalamkar +1. Lo stesso per me. Ho il mio vecchio progetto che sta andando bene. Ma 2 giorni fa ho creato un nuovo progetto con lo stesso codice e si è verificato questo errore. Ho anche notato che le credenziali di Compute Engine sono scomparse su un nuovo progetto ma immagino che non si tratti di un caso perché CtrlX ha l'account [email protected] menzionato in questo [commento] (http://stackoverflow.com/questions/26102319/google-AppEngine-cloud-storage-the-AppIdentity-servizio-gettato-an-unexpected-e # comment40919093_26109439). Immagino che la soluzione sia in qualche configurazione di AppEngine. – Juniper

+1

@Juniper Risolto il problema, ho visto questa nota su https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/activate Nota: in alcune circostanze insolite, potresti non essere in grado di aggiungere il tuo account di servizio utilizzando Aggiungi modulo membro. In tal caso, è necessario aggiungere il numero dell'account di servizio dell'app all'ACL del bucket. Per ulteriori informazioni, vedi Assegnare autorizzazioni al bucket o agli oggetti. –

risposta

1

Invece di [email protected] prova a usare [email protected] (sostituisci XXX con l'id del progetto della tua applicazione - preso da "Numero progetto console API di Google" in "Impostazioni amministrazione/applicazione" della console di amministrazione).

+0

Questo account ([email protected]) è già qui nell'autorizzazione e il tooltip dice che è per il codice che gira all'esterno della piattaforma cloud. Ha provato a riaggiungerlo ma non funziona ancora :( – CtrlX

+0

da dove stai eseguendo questo codice da? Un motore VM o un frontend del motore dell'app di regualr o un backend? Se quest'ultimo tenta, [email protected] Dove hai ottenuto la parte "-compute"? – ozarov

+0

In esecuzione tutto il codice direttamente su Appengine, nessuna VM, nessun localhost. Cosa intendi per "frontend" o "backend"? In Permission, ho aggiunto 593689673236 @ developer.gserviceaccount.com ma questa email necessita di validazione e non ho accesso a quella casella di posta. – CtrlX

Problemi correlati