11

我在 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....

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

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

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

4

5 回答 5

23

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

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

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

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应该是对象的一部分。

于 2012-10-16T06:23:10.147 回答
6

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

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
于 2012-10-19T04:15:58.983 回答
1
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'

为我工作:)

于 2015-05-12T09:36:06.580 回答
1

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

这对我来说适用于版本 2:

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

请参阅文档

于 2015-11-10T22:39:59.500 回答
0

如果有人正在寻找这个,这里是它应该如何根据https://github.com/aws/aws-sdk-ruby

creds = JSON.load(File.read('secrets.json'))
Aws.config[:credentials] = Aws::Credentials.new(creds['AccessKeyId'], creds['SecretAccessKey'])
Aws.config[:region] = 'us-east-1'

client = Aws::S3::Client.new(
    region: Aws.config[:region],
    credentials: Aws.config[:credentials]
)

File.open('/local_directory/picture.jpg', 'rb') do |file|
  client.put_object(bucket: 'bucket', key: 'folder_inside_bucket/picture.jpg', body: file)
end
于 2019-03-04T18:19:04.163 回答