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

时间:2017-12-12 09:34:49

标签: java aws-sdk ceph

我想通过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将根据指定的here从端点url解析该区域。

就我而言,这会导致无效区域,例如non-amazon

1 个答案:

答案 0 :(得分:1)

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

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

如果指定另一个区域,则sdk将根据指定的here从端点url解析该区域。

在我的情况下,这会导致无效区域,例如非亚马逊。