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.