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

指定的密钥不存在。

我哪里做错了?


当前回答

我遇到了类似的错误,因为桶位于us-west-2区域,URL模式的路径中有bucketname。有一次,我改变了URL模式,以bucketname作为URL子域来抓取文件,它工作了。

例如,以前的URL是

https://s3.amazonaws.com/bucketname/filePath/filename

然后我把它换成

https://bucketname.s3.amazonaws.com/filePath/filename

其他回答

当我试图访问一个不存在的桶时,我得到了这个错误。

我错误地将路径变量与桶名变量交换,因此桶名具有文件路径值。所以可能需要仔细检查,你在请求上设置的桶名是否正确。

我在c#.net上得到了这个异常,它在更改客户端创建的RegionEndpoint值后得到了修复,如下所示

var client = new AmazonS3Client(accesKey,secretKey, RegionEndpoint.APSoutheast2)

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

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

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

对于使用@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...

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