S3 API経由でcephオブジェクトストレージにバケットを作成したいと思います。これは私がニシキヘビboto3を使用している場合、正常に動作します:Java aws sdk - 指定された位置制約が無効です(アマゾン以外)
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
に "私たち-東-1" を設定する
UPDATE
について:
AwsClientBuilder.EndpointConfiguration config =
new AwsClientBuilder.EndpointConfiguration(
"https://my.non-amazon.endpoint.com",
"us-east-1");
1は別の領域を割り当てた場合、SDKが解析されます指定されたエンドポイントurlからの領域here。
私の場合、これは無効な領域につながります(例:non-amazon
)。 signingRegionに「私たち-東-1」を設定する