您需要为存储桶(创建它的位置)配置特定于区域的端点。你可以这样做:
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
在上面的示例中,存储桶是“bucket/name”,它不兼容 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