我试图用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,会出现以下错误:

指定的密钥不存在。

我哪里做错了?


当前回答

我也遇到过同样的问题。经过一番挣扎,我发现真正的问题出在网站上。amazonaws依赖性。添加依赖项后,此错误消失。

其他回答

在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
            }
        );

对于许多S3 API包(我最近在npm S3包中遇到了这个问题),你可能会遇到区域被假设为美国标准的问题,如果你选择在该区域之外托管一个桶,通过名称查找将要求你显式定义该区域。

以上答案都不能解决我的问题。

上面的答案可能更可能是您的问题的原因,但我的问题是我使用了错误的桶名。这是一个有效的桶名,只是不是我的桶名。

我指向的桶是在不同的区域,我的lambda函数,所以检查你的桶名!

当我对用户(访问密钥/秘密密钥)用于创建s3桶的策略有一个源ip约束时,就发生了这种情况。我的IP是准确的——但出于某种原因,它不能工作,并给出了这个错误。

我住在英国,一直在尝试“美国西部2”地区。所以重定向到'eu-west-2'。S3的正确区域是'eu-west-2'