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

ale*_*333 11 ruby ruby-on-rails amazon-s3

我在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....
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ana*_*oly 23

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

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

以下列表中选择您的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
Run Code Online (Sandbox Code Playgroud)

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

  • :s3_host_name而不是:s3_endpoint为我工作. (2认同)

Tre*_*owe 6

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

AWS.config(:s3_endpoint => '...')
s3 = AWS::S3.new
Run Code Online (Sandbox Code Playgroud)

要么

s3 = AWS::S3.new(:s3_endpoint => '...')
Run Code Online (Sandbox Code Playgroud)

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

http:://bucket-name.s3.amazonaws.com/path/to/object.txt
Run Code Online (Sandbox Code Playgroud)

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

http://s3.amazon.com/bucket/name/path/to/object.txt
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,存储桶是"存储桶/名称",与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
Run Code Online (Sandbox Code Playgroud)