我试图用AWS-SDK-Core Ruby Gem删除上传的图像文件。

我有以下代码:

require 'aws-sdk-core'

def pull_picture(picture)
    Aws.config = {
        :access_key_id => ENV["AWS_ACCESS_KEY_ID"],
        :secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"],
        :region => 'us-west-2'
    }

    s3 = Aws::S3::Client.new

    test = s3.get_object(
        :bucket => ENV["AWS_S3_BUCKET"],
        :key => picture.image_url.split('/')[-2],   
    )
end

然而,我得到以下错误:

您试图访问的桶必须使用指定的端点进行寻址。请将所有将来的请求发送到此端点。

我知道这个区域是正确的,因为如果我把它改为us-east-1,会出现以下错误:

指定的密钥不存在。

我哪里做错了?


当前回答

对于使用@aws-sdk/client-s3的用户,请确保在发送命令之前将桶的区域提供给客户端。 使用CLI获取:

$ aws s3api get-bucket-location --bucket <bucket_name>
{
    "LocationConstraint": "ca-central-1"
}
const client = new S3Client({ region: "ca-central-1", credentials...

其他回答

我在使用不同的AWS配置文件时遇到了这个问题。当我使用一个具有管理权限的帐户时,我看到了这个错误,所以权限问题的可能性似乎不大。

从用户的角度来看,AWS很容易发出与所需操作几乎没有关联的错误消息,这真的是我的一个讨厌之处。

虽然S3桶是全局的,但在访问桶时,我们需要给出区域。我在.netcore中得到错误,一旦我在下面的代码中添加了区域,它就开始工作了。

var s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USWest2);

对于仍然面临此问题的ppl,尝试按如下方式将s3_host添加到配置散列中

   :storage => :s3,
   :s3_credentials => {:access_key_id => access key,
   :secret_access_key => secret access key},
   :bucket => bucket name here,
   :s3_host_name => s3-us-west-1.amazonaws.com or whatever comes as per your region}.

这为我解决了问题。

似乎这个桶是在一个不同的地区创建的,IE而不是us-west-2。这是我唯一一次看到“您试图访问的桶必须使用指定的端点进行寻址。请将所有未来的请求发送到此端点。”

美国标准是US -east-1

在c#中,你可以做以下检查,我假设类似的代码在其他sdk中是可能的:

        var client = new AmazonS3Client(
            credentials.AccessKey,
            credentials.ClientSecret,
            new AmazonS3Config{}
        );

        var bucketLocationRequest = new GetBucketLocationRequest
        {
            BucketName = amazonS3Bucket.BucketName
        };

        var response = await client.GetBucketLocationAsync(bucketLocationRequest);
        var region = response.Location;

        var regionEndpoint = region != null ? RegionEndpoint.GetBySystemName(region.Value) : RegionEndpoint.EUCentral1;
       
        var clientWithRegion = new AmazonS3Client(
            credentials.AccessKey,
            credentials.ClientSecret,
            new AmazonS3Config
            {
                RegionEndpoint = regionEndpoint
            }
        );