GCS对象需要哪些ACL才能使getServingUrl工作?

时间:2014-12-23 04:36:53

标签: google-app-engine google-cloud-storage

当我通过JSON API将对象写入GCS然后尝试调用getServingUrl()时,我收到一个ACCESS_DENIED错误。我的App Engine应用程序可以读取/写入GCS对象没有问题,但是当它调用getServingUrl()时它不会工作,除非我向所有用户授予OWNER。如果我甚至将READER授予allUsers,它仍会生成ACCESS_DENIED。

我假设getServingUrl()需要读取元数据,因此它需要对象上的OWNER。所以问题是,我授予OWNER什么实体让getServingUrl()工作?

以下是相关代码:

StorageObject metadata = new StorageObject()
    .setMetadata( ImmutableMap.of(ExtendedMetaDataOriginalFile, originalFilename) )
    .setContentType(contentType);

this.storage.objects().copy(bucketName, objectName + ".chunk0", bucketName, objectName, metadata).execute();

// without this line the getServingURL generates an ACCESS_DENIED   
this.storage.objectAccessControls().insert(bucketName, objectName, 
                    new ObjectAccessControl().setEntity("allUsers").setRole("OWNER") 
                    ).execute();

    ServingUrlOptions options = ServingUrlOptions.Builder.withGoogleStorageFileName("/gs/"+bucketName+"/"+objectName).secureUrl(true);

    String imageServingURL = ImagesServiceFactory.getImagesService().getServingUrl(options); // throws an exception with ACCESS_DENIED unless i set allUsers to OWNER

2 个答案:

答案 0 :(得分:1)

如下所示,设置对象而不是存储桶的权限解决了getServingUrl()的问题:

 storage.objectAccessControls().insert(bucketName, objectName, 
      new ObjectAccessControl().setEntity("user-YOUR-PROJECT-ID@appspot.gserviceaccount.com")
      .setRole("OWNER") ).execute();

答案 1 :(得分:0)

听起来您的应用引擎应用可能无法完全控制存储桶或存储桶中的对象。尝试更改正在使用的存储桶上的默认对象ACL,以便为您的应用提供FULL_CONTROL权限,并在存储桶ACL上提供应用FULL_CONTROL。