微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用服务帐户创建用于公共访问的存储桶

如何解决使用服务帐户创建用于公共访问的存储桶

我正在以编程方式创建一个存储桶,如下所示:

String bucketName = UUID.randomUUID().toString();

List<Acl> aclList = new ArrayList<>();
if (gcsBucketEntity.isPublic()) {
    Acl publicAccessAcl = Acl.newBuilder(Acl.User.ofAllUsers(),Acl.Role.READER).build();
    aclList.add(publicAccessAcl);
}

BucketInfo bucketInfo = BucketInfo
        .newBuilder(bucketName)
        .setLocation(gcsBucketEntity.getLocation()) // Multi-regions
        .setStorageClass(valueOfStrict(gcsBucketEntity.getStorageType().toString()))
        .setAcl(aclList)
        .build();

Bucket bucket = this.storage.create(bucketInfo);   

我也尝试过设置 BucketTargetoption

Storage.BucketTargetoption bucketTargetoption = Storage.BucketTargetoption
        .predefinedAcl(Storage.PredefinedAcl.PUBLIC_READ);

Bucket bucket = this.storage.create(bucketInfo,bucketTargetoption);

结果完全相同。

存储桶已创建,我可以在 GCP 控制台中看到访问权限是公开的。

但是,我无法访问任何文件,而是收到 AccessDenied 错误

<Error>
  <Code>AccessDenied</Code>
  <Message>Access denied.</Message>
  <Details>Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object.</Details>
</Error>

如果我手动创建bucker,我想我必须向用户Storage Object Viewer添加一个allUsers角色:

enter image description here

这是我能看到的手动和自动创建的存储桶之间的唯一区别,所以我的问题是..

如何以编程方式添加此权限?

解决方法

实际上在the docs中有一个例子。

显然我们必须先创建存储桶,然后再设置 IAM 策略。

BucketInfo bucketInfo = BucketInfo
        .newBuilder(bucketName)
        .setLocation(gcsBucketEntity.getLocation()) // Multi-regions
        .setStorageClass(valueOfStrict(gcsBucketEntity.getStorageType().toString()))
        .build();

Bucket bucket = this.storage.create(bucketInfo);

if (gcsBucketEntity.isPublic()) {
    Policy policy = this.storage.getIamPolicy(bucketName);
    this.storage.setIamPolicy(
            bucket.getName(),policy.toBuilder()
                    .addIdentity(StorageRoles.objectViewer(),Identity.allUsers())
                    .build()
    );
}

恕我直言,这有点奇怪,因为如果出现问题,我可能最终会得到一个“破”的桶。

无论如何,上面的代码对我有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。