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。
在我的例子中,这会导致无效区域,例如非亚马逊。
我想通过 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。
在我的例子中,这会导致无效区域,例如非亚马逊。