Рекомендуемый способ создания предопределенного URL для S3 Bucket в Ruby

Я пытаюсь создать предварительно подписанный URL-адрес на моем сервере Rails для отправки в браузер, чтобы браузер мог загрузить его на S3.

Это похоже на aws-sdk-s3 это драгоценный камень, который нужно использовать для продвижения вперед. Но, к сожалению, я не сталкивался с документацией для драгоценного камня, которая обеспечила бы ясность. Кажется, есть несколько разных способов сделать это, и мы будем благодарны за любые указания относительно различий в следующих методах:

  1. С помощью Aws::S3::Presigner.new ( https://github.com/aws/aws-sdk-ruby/blob/master/aws-sdk-core/lib/aws-sdk-core/s3/presigner.rb), но, похоже, не принимает параметр объекта или аутентификационные данные.

  2. С помощью Aws::S3::Resource.new, но, похоже, aws-sdk-resources не будет поддерживаться. ( https://aws.amazon.com/blogs/developer/upgrading-from-version-2-to-version-3-of-the-aws-sdk-for-ruby-2/)

  3. С помощью Aws::S3::Object.new а затем позвонив put метод на этом объекте.

  4. С помощью AWS::SigV4 непосредственно.

Мне интересно, как они отличаются, и последствия выбора одного над другим? Любые рекомендации высоко ценятся, особенно с aws-sdk-s3,

Спасибо!

2 ответа

Итак, благодаря подсказкам @strognjz, приведенным выше, вот что сработало для меня, используя `aws-sdk-s3'.

require 'aws-sdk-s3'

#credentials below for the IAM user I am using
s3 = Aws::S3::Client.new(
  region:               'us-west-2', #or any other region
  access_key_id:        AWS_ACCESS_KEY_ID,
  secret_access_key:    AWS_SECRET_ACCESS_KEY
)

signer = Aws::S3::Presigner.new(client: s3)
url = signer.presigned_url(
  :put_object,
  bucket: S3_BUCKET_NAME,
  key: "${filename}-#{SecureRandom.uuid}"
)

Это будет работать с использованием гема aws-sdk-s3

aws_client = Aws::S3::Client.new(
  region:               'us-west-2', #or any other region
  access_key_id:        AWS_ACCESS_KEY_ID,
  secret_access_key:    AWS_SECRET_ACCESS_KEY
)


s3 = Aws::S3::Resource.new(client: aws_client)
bucket = s3.bucket('bucket-name')
obj = bucket.object("${filename}-#{SecureRandom.uuid}")

url = obj.presigned_url(:put)

дополнительные глаголы http:

obj.presigned_url(:put)                              
obj.presigned_url(:head)                    
obj.presigned_url(:delete)
Другие вопросы по тегам