0

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

如果我没有指定这个区域,那么它会显示存储桶的创建日期错误。

现在通过使用上面的 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 客户端获取区域。我没有存储桶对象,我只有存储桶名称。

使用存储桶名称我试图获取位置,但它抛出了与上述区域相同的问题。

4

1 回答 1

1

我不能给你一个Java的例子,但你需要使用GetBucketLocationAPI​​。
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'

Regionus-east-1中的 Bucket 的 LocationConstraint 为null.

于 2021-05-12T00:18:31.077 回答