Aws-sdk для папки доступа Ruby в ведре

У меня есть ведро на 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....

Я получаю следующую ошибку:

Ведро, к которому вы пытаетесь получить доступ, должно быть адресовано с использованием указанной конечной точки. Пожалуйста, отправьте все будущие запросы в эту конечную точку.

Любые идеи, что я могу делать неправильно?

Ответ 1

Вероятно, используемый ведро 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 должно быть частью объекта.

Ответ 2

Вам нужно сконфигурировать конечную точку вашего региона для ведра (где он был создан). Вы можете сделать это с помощью:

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

Ответ 3

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'

работал у меня:)

Ответ 4

Ответ Бозаврав, по сути, правильный. Однако, похоже, он устарел, возможно, для SDK версии 1?

Это работало для меня для версии 2:

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

См. docs.