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

时间:2014-07-30 01:32:13

标签: ruby-on-rails ruby amazon-web-services

我正在尝试使用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,则会出现以下错误:

  

指定的密钥不存在。

我在这里做错了什么?

15 个答案:

答案 0 :(得分:266)

这个桶很可能是在不同的地区创建的,IE不是us-west-2。这是我见过的唯一一次"您尝试访问的存储桶必须使用指定的端点进行寻址。请将以后的所有请求发送到此终端。"

  

美国标准为us-east-1

答案 1 :(得分:17)

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

答案 2 :(得分:16)

我遇到了类似的错误,因为存储桶位于区域us-west-2中,并且URL模式在路径中具有存储桶名称。有一次,我更改了URL模式,将bucketname作为URL子域来获取文件,并且工作正常。

例如,之前的网址是

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

然后我将其替换为

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

答案 3 :(得分:1)

对于许多S3 API包(我最近遇到了这个问题npm s3 package),您可能会遇到假定该区域为美国标准的问题,并且按名称查找将要求您明确定义该区域选择在该地区之外托管一个水桶。

答案 4 :(得分:1)

在使用其他AWS配置文件时遇到了此问题。当我使用具有管理员权限的帐户时看到此错误,因此似乎不太可能出现权限问题。

从用户的角度来看,AWS很容易发出错误消息,而这些错误消息与所需操作的关联性很小,这确实是我的宠儿。

答案 5 :(得分:0)

对于仍然面临此问题的ppl,请尝试按如下方式将s3_host添加到config hash

   :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}.

这解决了我的问题。

答案 6 :(得分:0)

在创建S3Client期间,您可以指定到特定区域的端点映射。如果默认为s3.amazonaws.com,那么将在us-east-1北弗吉尼亚州创建存储桶。

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

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

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

答案 7 :(得分:0)

当我尝试访问不存在的存储桶时出现此错误。

我错误地使用存储桶名称变量切换了路径变量,因此存储桶名称具有文件路径值。因此,如果您在请求中设置的存储桶名称正确,可以仔细检查。

答案 8 :(得分:0)

我有同样的错误。当s3客户端创建的端点与创建存储桶时设置的端点不同时,就会发生这种情况。

  • 错误代码-桶是使用EAST Region设置的。

s3Client =新的AmazonS3Client(AWS_ACCESS_KEY,AWS_SECRET_KEY,RegionEndpoint.USWest2)

  • 修复

s3Client =新的AmazonS3Client(AWS_ACCESS_KEY,AWS_SECRET_KEY,RegionEndpoint。 USEast1

答案 9 :(得分:0)

我也遇到过同样的问题。经过大量的努力,我发现真正的问题是com.amazonaws依赖关系。添加依赖关系后,该错误消失了。

答案 10 :(得分:0)

以上答案均未解决我的问题。

以上答案很可能是造成您问题的原因,但我的问题是我使用的存储桶名称错误。这是一个有效的存储桶名称,不是我的存储桶。

我指向的存储桶与lambda函数位于不同的区域,因此请检查您的存储桶名称!

答案 11 :(得分:0)

我住在英国,一直在尝试“ us-west-2”地区。因此重定向到“ eu-west-2”。 S3的正确区域是“ eu-west-2”

答案 12 :(得分:0)

当我对用户正在使用的策略(访问密钥/秘密密钥)创建s3存储桶具有源ip约束时,发生了这种情况。我的IP是准确的-但由于某种原因,它无法正常工作并出现了此错误。

答案 13 :(得分:0)

经过长时间的搜索,我找到了一个可行的解决方案。问题是由于错误的region-code

下面是区域代码列表,设置适当的区域代码,您的问题将得到解决。

Code                         Name
US East (Ohio)               us-east-2

US East (N. Virginia)       us-east-1

US West (N. California)     us-west-1

US West (Oregon)            us-west-2

Asia Pacific (Hong Kong)    ap-east-1

Asia Pacific (Mumbai)       ap-south-1

Asia Pacific (Osaka-Local)  ap-northeast-3

Asia Pacific (Seoul)        ap-northeast-2

Asia Pacific (Singapore)    ap-southeast-1

Asia Pacific (Sydney)       ap-southeast-2

Asia Pacific (Tokyo)        ap-northeast-1

Canada (Central)            ca-central-1

Europe (Frankfurt)          eu-central-1

Europe (Ireland)            eu-west-1

Europe (London)             eu-west-2

Europe (Paris)             eu-west-3

Europe (Stockholm)         eu-north-1

Middle East (Bahrain)      me-south-1

South America (São Paulo)   sa-east-1

点击存储桶名称右上角,即可找到您的区域代码。

enter image description here

有关模式的详细信息Click

答案 14 :(得分:0)

就我而言,我选择了错误的RegionEndpoint。选择正确的RegionEndpoint后,它开始工作:)