Java aws sdk - 指定的位置约束无效(非亚马逊)

Java aws sdk - The specified location-constraint is not valid (non-amazon)

我想通过 S3 API 在 ceph 对象存储中创建一个桶。如果我使用 Pythons boto3:

s3 = boto3.resource(
   's3',
   endpoint_url='https://my.non-amazon-endpoint.com',
   aws_access_key_id=access_key,
   aws_secret_access_key=secret_key
)

bucket = s3.create_bucket(Bucket="my-bucket") # successfully creates bucket

对 java 进行相同的尝试会导致异常:

BasicAWSCredentials awsCreds = new BasicAWSCredentials(access_key, secret_key);

AwsClientBuilder.EndpointConfiguration config =
        new AwsClientBuilder.EndpointConfiguration(
                "https://my.non-amazon-endpoint.com",
                "MyRegion");

AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
        .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
        .withEndpointConfiguration(config)
        .build();

List<Bucket> buckets = s3Client.listBuckets();
// this works and lists all containers, hence the connection should be fine
for (Bucket bucket : buckets) {
    System.out.println(bucket.getName() + "\t" +
            StringUtils.fromDate(bucket.getCreationDate()));
}

Bucket bucket = s3Client.createBucket("my-bucket");
// AmazonS3Exception: The specified location-constraint is not valid (Service: Amazon S3; Status Code: 400; Error Code: InvalidLocationConstraint...

我知道几个相关问题,例如 this issue,但我无法针对我的非亚马逊存储调整建议的解决方案。

深入研究 boto3 代码后发现,如果未指定区域,则 LocationConstraint 设置为 None。但是省略 java 中的区域也会导致 InvalidLocationConstrain。

如何使用 java s3 aws sdk 配置端点才能成功创建存储桶?

亲切的问候

更新

signingRegion 设置为 "us-east-1" 启用存储桶创建功能:

AwsClientBuilder.EndpointConfiguration config =
            new AwsClientBuilder.EndpointConfiguration(
                    "https://my.non-amazon.endpoint.com",
                    "us-east-1");

如果分配另一个区域,sdk 将从端点 url 解析区域,如指定的那样 here

在我的例子中,这会导致无效区域,例如 non-amazon

将 signingRegion 设置为 "us-east-1" 启用存储桶创建功能:

AwsClientBuilder.EndpointConfiguration config =
        new AwsClientBuilder.EndpointConfiguration(
                "https://my.non-amazon.endpoint.com",
                "us-east-1");

如果分配另一个区域,sdk 将从端点 url 解析区域,如指定的那样 here

在我的例子中,这会导致无效区域,例如非亚马逊。