问题描述
我正在使用 Amazon S3 进行项目,并且正在使用 AWS SDK 2 与 S3 交互。 我在 S3 帐户中创建了许多旧存储桶,现在我想更改身份验证代码并设置 ACL。
我已经创建了 S3Client :
AwsBasicCredentials awsCreds = AwsBasicCredentials.create(
ACCESS_KEY,SECRET_KEY);
S3ClientBuilder s3ClientBuilder = S3Client.builder().credentialsProvider(StaticCredentialsProvider.create(awsCreds));
if (regionString != null) {
Region region = Region.of(regionString);
s3ClientBuilder.region(region);
}
S3Client s3Client = s3ClientBuilder.build();
return s3Client;
我给出的默认区域是:US_EAST_1。
如果我不指定这个区域,那么它显示bucket的创建日期错误。
现在通过使用上面的 S3client,我正在前进并使用 ACL :
software.amazon.awssdk.services.s3.model.GetBucketAclRequest getBucketAclRequest =
software.amazon.awssdk.services.s3.model.GetBucketAclRequest.builder().bucket(sbktname).build();
GetBucketAclResponse bucketAcl1 = s3Client.getBucketAcl(getBucketAclRequest);
但它抛出问题:software.amazon.awssdk.services.s3.model.S3Exception:授权标头格式错误; 'us-east-1' 区域是错误的;期待“eu-central-1”
我的问题是如何从仅使用存储桶名称创建的现有 s3 客户端获取区域。我没有桶对象,我只有桶名。
我尝试使用存储桶名称获取位置,但它抛出了与上述区域相同的问题。
解决方法
我无法用 Java 举例,但您需要使用 GetBucketLocation
API。
https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLocation.html
从以下示例中可以看出,我强制在 sa-east-1
区域上运行命令,但我的存储桶位于 us-east-2
上。
$ aws --region sa-east-1 s3api get-bucket-location --bucket my-bucket
{
"LocationConstraint": "us-east-2"
}
您可以从 Python SDK 中看到相同的行为
Python 3.9.4 (default,Apr 5 2021,01:49:30)
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help","copyright","credits" or "license" for more information.
>>> import boto3
>>> s3 = boto3.client('s3',region_name='sa-east-1')
>>> s3.get_bucket_location(Bucket='my-bucket')['LocationConstraint']
'us-east-2'
区域 us-east-1
中的存储桶具有 null
的 LocationConstraint。