存储桶中的Ruby访问文件夹的aws-sdk

我在Amazon S3上有一个存储桶,其中包含文件夹。 我试图通过aws-sdk gem以下方式访问它:

s3 = AWS::S3.new( :access_key_id => "KEY", :secret_access_key => "SECRET" ) bucket = s3.buckets["my_bucket/my_folder"] bucket.do_stuff.... 

我得到以下错误作为回报:

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

我有什么想法可能做错了吗?

可能S3存储桶试图使用位于US-EAST(默认位置)之外,所以这应该可以帮助您:

 s3 = AWS::S3.new( :access_key_id => "KEY", :secret_access_key => "SECRET" :s3_endpoint => 's3-eu-west-1.amazonaws.com' ) 

从以下列表中选择您的S3 enpdpoint:

 US Standard * s3.amazonaws.com(default) US West (Oregon) Region s3-us-west-2.amazonaws.com US West (Northern California) Region s3-us-west-1.amazonaws.com EU (Ireland) Region s3-eu-west-1.amazonaws.com Asia Pacific (Singapore) Region s3-ap-southeast-1.amazonaws.com Asia Pacific (Tokyo) Region s3-ap-northeast-1.amazonaws.com South America (Sao Paulo) Region s3-sa-east-1.amazonaws.com 

在对象访问方面,存储桶名称为my_bucket ,但my_folder应该是对象的一部分。

您需要为存储桶(创建存储区)配置特定于区域的端点。 你可以这样做:

 AWS.config(:s3_endpoint => '...') s3 = AWS::S3.new 

要么

 s3 = AWS::S3.new(:s3_endpoint => '...') 

您可以通过使用DNS可比较的存储桶名称来避免这种情况(也可以避免存储桶名称中的点)。 如果存储桶名称是有效的子域,则可以在不配置区域特定端点的情况下寻址存储桶。 考虑以下:

 http:://bucket-name.s3.amazonaws.com/path/to/object.txt 

将存储桶命名为“bucket-name”,对象键为“path / to / object.txt”。 此存储桶可以存在于任何区域,但您可以使用“默认”区域访问它。 当存储桶名称与dns不兼容时,则url如下所示:

 http://s3.amazon.com/bucket/name/path/to/object.txt 

在上面的示例中,存储桶是“存储桶/名称”,它不是dns兼容的。 它成为路径的一部分,现在必须用区域特定端点替换s3.amazon.com(如果未在经典区域中创建存储桶)。

正如其他人提到的,路径应该是对象密钥的一部分,而不是存储桶名称。 这允许您通过公共前缀对对象进行分组。 ‘/’用作虚拟文件夹(仅限惯例)。

 # print the key of every object with the given prefix s3.buckets['bucket-name'].objects.with_prefix('path/to/').each do |object| puts object.key end 
 has_attached_file :photo, storage: :s3, styles: { medium: "300x300>", thumb: "100x100>" }, s3_credentials: "#{Rails.root}/config/aws.yml", bucket: "bucket-name", s3_host_name: "s3-ap-southeast-1.amazonaws.com", url: ":s3_domain_url", path: 'books/:id/photo/:style_:basename.:extension' 

为我工作:)

Godsaur的答案基本上是正确的。 但是,它似乎已经过时了,也许对于SDK版本1?

这适用于版本2:

 s3 = Aws::S3::Client.new(endpoint:'https://s3-ap-southeast-1.amazonaws.com') 

查看文档 。