AWS S3:您尝试访问的存储桶必须使用指定的端点进行寻址

我正尝试使用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 ,那么下面的错误就会显示出来:

指定的键不存在。

我在这里做错了什么?

这个桶似乎可能是在另外一个地区创build的,IE不是我们西部2号。 这是我见过的唯一一次“你试图访问的桶必须使用指定的端点来处理,请将所有未来的请求发送到这个端点。

美国标准是us-east-1

检查控制台中的存储桶位置,然后将其用作要使用的端点的参考: http : //docs.aws.amazon.com/general/latest/gr/rande.html#s3_region

我正面临类似的错误,因为这个桶在us-west-2区域,URL模式在path中有bucketname。 有一次,我改变了URL模式,使bucketName作为URL子域来抓取文件,它的工作。

例如,以前的url是

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

然后我将其replace为

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

对于许多S3 API软件包(我最近遇到这个问题的是npm s3软件包 ),您可能会遇到这样的问题,即该区域被认为是美国标准,而如果您select托pipe一个存储桶,则按名称查找将要求您明确定义该区域在该地区之外。

对于仍然面临此问题的ppl,请尝试按如下所示向configuration散列添加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}. 

这为我解决了这个问题。

在创buildS3Client的过程中,您可以指定到特定区域的端点映射。 如果默认s3.amazonaws.com然后桶将在北弗吉尼亚州us-east-1创build。

有关AWS文档中S3端点和区域的更多详细信息: http : //docs.aws.amazon.com/general/latest/gr/rande.html#s3_region 。

因此,在创buildS3Client的同时,始终确保端点/区域,并使用同一区域中的相同客户端访问S3资源。

如果存储桶是从AWS S3控制台创build的,则从该控制台的控制台中检查该区域,然后使用上述链接中提到的端点详细信息在该区域中创build一个S3 Client。