【问题标题】:Configure path-style in Java SDK Amazon S3在 Java SDK Amazon S3 中配置路径样式
【发布时间】:2012-06-29 00:54:07
【问题描述】:

我正在使用 Amazon 提供的AWS Java SDK 与 S3 服务进行交互。

似乎默认情况下,SDK 对存储桶使用虚拟主机样式(即存储桶由 bucket-name.s3.amazonaws.com 引用。示例:

PUT / HTTP/1.1
Host: a-given-bucket.s3.amazonaws.com
Date: Tue, 26 Jun 2012 10:39:40 GMT
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 0

但是,我需要在我的应用程序中使用路径样式,如下所示:

PUT /a-given-bucket/ HTTP/1.1
Host: s3.amazonaws.com
Date: Thu, 21 Jun 2012 16:27:32 GMT
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 0

请问可以在 Java SDK 中使用路径样式吗?在积极的情况下,我该怎么做?我查看了 ClientConfiguration 和 AmazonS3Client 类,但我没有看到任何方法来做到这一点......

如果重要的话,我的 SDK 版本是:2.0.0v201206151133。

谢谢!


费尔明

PD。为简单起见,示例中省略了一些标题。

编辑: 这样的功能(用于配置 AmazonS3Client 使用的 URL 路径样式)在您有带有点(“.”)的存储桶的情况下非常有用。使用虚拟主机样式的 HTTPS 请求不起作用,请参阅 thisthis

【问题讨论】:

标签: java amazon-s3 amazon-web-services


【解决方案1】:

withPathStyleAccess 方法已被弃用。请改用以下内容:

AmazonS3 s3client = AmazonS3Client.builder()
            .withCredentials((new AWSStaticCredentialsProvider(credentials)))
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("host", "region"))
            .withPathStyleAccessEnabled(true)
            .build();

不推荐使用的方法:

这现在是可能的,我不确定它是什么时候引入的,但它至少在 Java AWS SDK 的 1.7.8 版本中可用。

只需在您的 AmazonS3 实例上调用 setClientOptions

AmazonS3 client = new AmazonS3Client(credentials);
client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));

【讨论】:

    【解决方案2】:

    对于 SDK v2,您可以通过以下方式启用路径样式:

        public S3Client build() {
    
            final S3Configuration config = S3Configuration.builder()
                    .pathStyleAccessEnabled(true)
                    .build();
    
            return S3Client.builder()
                    .serviceConfiguration(config)
                    // other set up
                    .build();
        }
    

    亚马逊原计划从 2020 年 9 月起弃用路径样式访问,但此弃用已被推迟:https://forums.aws.amazon.com/ann.jspa?annID=6776

    【讨论】:

    • 这很好。适用于 SDK v2。对于 SDK v1,请参阅下一个答案。
    【解决方案3】:

    无法使用 Java SDK 强制 V1(路径样式)存储桶寻址。唯一的例外是您的存储桶名称无法通过 DNS 寻址,在这种情况下,SDK 将自动使用 V1 寻址。例如,当您的存储桶名称包含句点时(因此不鼓励这样做),就会发生这种情况。

    如果您需要此功能,则必须修改 AmazonS3Client 类以允许它。

    https://github.com/amazonwebservices/aws-sdk-for-java/

    但是,我不确定我是否相信您声称您“需要”使用 V1 存储桶寻址。 SDK 已经处理了所有需要 V1 寻址的情况——或者如果您发现不需要的情况,请在论坛中告诉我们。

    https://forums.aws.amazon.com/forum.jspa?forumID=70

    【讨论】:

    • 亲爱的@Zach,您可能会拒绝它,但人们经常实施需要能够使用 AWS S3 的软件,只要其他兼容的解决方案和 AWS SDK 可能是非常好的集成点。例如,IBM SpectrumScale 具有 S3 仿真支持。您可以说“我们为什么需要支持第三方解决方案”。换个思路:为什么人们应该迁移到 AWS S3?只有他们可以放置允许过渡的SDK,他们才能做到。这需要对现有存储的全面支持,这些存储在模拟模式下工作,但存在一些兼容性问题。
    • 这也不是真的,可以按照@oggmonster 的回答强制执行路径式访问
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2014-05-07
    相关资源
    最近更新 更多