如何使用存储桶名称获取 S3 存储桶的区域?

问题描述

我正在使用 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。