2014-09-29 3 views
8

sample from google의 GcsExampleServlet.java를 따라 Google Cloud Storage 파일 업로드를 설정하려고합니다. 나는 모든 단계를 완료했습니다하지만 난 aggengine하는 프로젝트를 배포하고 내가 GCS에서 간단한 텍스트를 업로드하려고 할 때,이 로그와 함께 실패 :Google Appengine & cloud storage : AppIdentity 서비스에서 예기치 않은 오류가 발생했습니다.

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) 
(...) 

아직도, 거기에 아무것도 코드에서 복잡 .. . 여기

@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(); 
    } 
    } 
} 

내하고 Upload.html 파일 : 여기에
<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> 

는 서블릿 GcsExampleServlet.java (구글 샘플에서와 동일)입니다 : web.xml에 나는 서블릿을 구성한 :

<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> 

결제를 사용하도록 설정했지만 버킷을 만들었지 만 AppIdentity 오류가 계속 표시됩니다. Oauth가 없으며 클라우드 저장소 API가 활성화되어 있습니다. appengine 계정에 업로드 할 때 버킷에 대한 쓰기 권한이 있습니다. 심지어 시도해 보았습니다

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

사용자가 내 버킷에 대한 쓰기 권한이 있는지 확인하십시오.

이 오류가 무슨 뜻인지 알아 내기 위해 제발 도와주세요, 내가 일 때문에 여기에 스틱을 해요 :(

덕분에 많은

PS : 당신은 GCS의 일부 작업 샘플 (안 구글이있는 경우 하나), 그 주제 주위에 많은 것들이 없기 때문에 나는 기쁠 것이다.

+1

GCS와 대화하기 위해 최근에 만든 AppEngine 프로젝트에서 비슷한 문제가 있습니다. 파이썬 AppEngine 코드에서 GCS 액세스를위한 토큰 코드를 가져 오는 것과 관련된 InternalError를 얻고 있습니다. 예를 들어 새로운 AppEngine 앱에 문제가있는 것으로 보입니다. 개발자 콘솔의 Api & auth -> Credentials를 보면 서비스 계정에 대한 "Compute Engine 및 AppEngine"클라이언트 ID가 없을 수 있습니다. 작년에 만든 기존 앱이 있는데 제대로 작동합니다. –

+1

@Abhijit Kalamkar +1. 나를 위해 동일합니다. 나는 잘 수행하고있는 나의 오래된 프로젝트를 가지고있다. 하지만 2 일 전 동일한 코드로 새 프로젝트를 만들었으며이 오류가 발생했습니다. 또한 Compute Engine 자격 증명이 새 프로젝트에서 사라 졌다는 것을 알았지 만 CtrlX가 [email protected] 계정을이 [comment] (http://stackoverflow.com/questions/26102319)에서 언급했기 때문에이 경우가 아닌 것 같습니다./google-appengine-cloud-storage-the-appidentity-service-unexpected-e # comment40919093_26109439). AppEngine 구성에 솔루션이 있다고 생각합니다. – Juniper

+1

@ 주니퍼 문제를 해결했습니다. https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/activate에서이 메모를 보았습니다. 참고 : 일부 비정상적인 경우에는 추가 기능을 사용하여 서비스 계정을 추가하지 못할 수 있습니다 회원 양식. 이 경우 앱의 서비스 계정 번호를 버킷 ACL에 추가해야합니다. 자세한 내용은 버킷이나 객체에 권한 부여를 참조하십시오. –

답변

1

[email protected] 대신 [email protected] (XXX 대체 귀하의 응용 프로그램의 프로젝트 ID - "관리/응용 프로그램 설정"섹션의 "Google API 콘솔 프로젝트 번호"에서 을 가져 왔습니다. 관리 콘솔의).

+0

이 계정 ([email protected])은 이미 여기에 있으며 툴팁에 클라우드 플랫폼 외부에서 실행되는 코드에 대한 내용이 나와 있습니다. 다시 추가하려고했으나 여전히 작동하지 않습니다. ( – CtrlX

+0

어디에서이 코드를 실행하고 있습니까? VM 엔진이나 정규 앱 엔진 프론트 엔드 또는 백엔드가 있습니까? 후자가 시도하면 [email protected] – ozarov

+0

appengine, VM, localhost에서 직접 모든 코드를 실행하는 경우 "frontend"또는 "backend"는 무엇을 의미합니까? Permission에서 593689673236 @ developer.gserviceaccount.com하지만이 이메일에는 유효성 검사가 필요하며 메일 상자에 대한 액세스 권한이 없습니다. – CtrlX

관련 문제