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应该是对象的一部分.
您需要为存储桶(创建存储区)配置特定于区域的端点.你可以这样做:
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)
归档时间: |
|
查看次数: |
9382 次 |
最近记录: |