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
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. –
@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
@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. –