我想通过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
。
答案 0 :(得分:1)
将signingRegion设置为“us-east-1”可启用存储桶创建功能:
AwsClientBuilder.EndpointConfiguration config =
new AwsClientBuilder.EndpointConfiguration(
"https://my.non-amazon.endpoint.com",
"us-east-1");
如果指定另一个区域,则sdk将根据指定的here从端点url解析该区域。
在我的情况下,这会导致无效区域,例如非亚马逊。