java - Google App Engine 和存储 API 身份验证错误

标签 java google-app-engine spring-boot

我有一个网络应用程序,它接收文件,然后尝试将其添加到在 Google App Engine 上运行的 Google Cloud Storage。这是我收到的错误:

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)

这在我的本地机器上运行得很好(有 gutil 和所有设置)。当部署到 GAE 时,它会失败并出现上述情况。已检查权限,它显示对所有 Google Cloud API 的访问权限。此代码是失败的部分,直接来自 Google 的示例 ( 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();
}

为了完整起见,这里是使用上面的 buildService 的代码(同样来自上面的 github 示例链接)

            Storage client = StorageFactory.getService();
        Storage.Objects.Insert insertRequest = client.objects().insert(
                bucketName, objectMetadata, contentStream);
        insertRequest.execute();

pom.xml 的 deps 部分

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

GAE 控制台显示它正在使用 GAE v1.9.35。这是来自实例的编辑信息,显示底部可用的权限

Module & 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.    

同样,该应用在本地运行并将文件上传发送到 Google Cloud Storage。多次尝试将应用程序上传到 GAE,但没有成功。该应用程序已部署到 GAE 灵活版本,它显示了以下内容:

latest: Pulling from google_appengine/openjdk8

此外,使用 GcsService 库会以不同的方式失败,但我怀疑这是因为,出于某种原因,我的应用程序在 GAE 上无法正确识别为具有适当授权的 GAE 应用程序:

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)

代码:

                GcsOutputChannel outputChannel = gcsService.createOrReplace(fileName, GcsFileOptions.getDefaultInstance());
            InputStream inputStream = uploadfile.getInputStream();
            copy(inputStream, Channels.newOutputStream(outputChannel));

最佳答案

您只能在支持 GAE 标准 API(如本例中的 com.google.appengine.api.memcache)的基本运行时上使用它。 列表如下:https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build#base_images

您的案例中使用的基本运行时是 google_appengine/openjdk8,它不支持 GAE 标准环境 API。

现在,您可以通过此 gcloud-java 库使用新的 Java Cloud API(包括 GCS 存储访问):https://github.com/GoogleCloudPlatform/gcloud-java

关于java - Google App Engine 和存储 API 身份验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36438739/

相关文章:

java - JDK1.6 中来自 ManagementFactory 的托管 Mbean - NotCompliantMBeanException :

java - GWT vs Flex vs?

java - 如何告诉检查器遗留方法将接受 Nullable 类型?

python - Google App Engine 身份验证失败

java - org.springframework.beans.NotReadablePropertyException :

java - 我正在编写一个 javafx 自定义 LoginModule 并收到以下有关 javafx 权限的 AccessControlException 。这是策略文件问题吗?

firebase - 为什么我在 Firestore(App 引擎)中有这些奇怪的配额数字?

java - Spring Boot - 使用 Gmail 发送电子邮件

java - 无法在 Spring-boot 中使用自签名 https 验证来自 Postman 的 POST/GET 请求方法

java-获取用户选择上传的文件的完整路径