URL-адрес доступа к AWS s3 PRIVATE из приложения rails - PullRequest
0 голосов
/ 15 ноября 2018

Я новичок в RoR.

Я создаю небольшое приложение, которое загружает изображения и сохраняет их в S3, пользователь не может прикрепить все изображения в ZIP-файл и отправить его по электронной почте, чтобыдобейтесь того, чтобы я использовал rubyzip gem.

Локально это работает нормально (я следую документации по гемам)

https://github.com/rubyzip/rubyzip/

Но в производстве дляДействие «ZIP» Мне нужно указать исходную папку (в которой сохранено изображение), и так как все мои изображения сохранены в корзине s3, я даю путь, подобный следующему:

folder = 'https://'bucket-name'.s3.amazonaws.com/'

После исследования я увлекаюсьподобные случаи, но ни один из них не работает для меня, например, я попытался Как получить URL-адрес вложения с Rails Active Storage с S3 , и это дает мне «Нет такого файла или каталога»

2018-11-15T00:44:27.082416+00:00 app[web.1]: I, [2018-11-15T00:44:27.082337 #4]  INFO -- : [db52fa26-32c2-4f7e-a766-7d39fd3ef062] Completed 500 Internal Server Error in 1532ms (ActiveRecord: 21.4ms)
2018-11-15T00:44:27.082915+00:00 app[web.1]: F, [2018-11-15T00:44:27.082844 #4] FATAL -- : [db52fa26-32c2-4f7e-a766-7d39fd3ef062]
2018-11-15T00:44:27.082988+00:00 app[web.1]: F, [2018-11-15T00:44:27.082916 #4] FATAL -- : [db52fa26-32c2-4f7e-a766-7d39fd3ef062] Errno::ENOENT (No such file or directory @ rb_file_s_lstat - https://bucket-name.s3.amazonaws.com):
2018-11-15T00:44:27.083054+00:00 app[web.1]: F, [2018-11-15T00:44:27.082985 #4] FATAL -- : [db52fa26-32c2-4f7e-a766-7d39fd3ef062]

Моя корзина приватная, поэтому имейте в виду, что она не позволяет мне получить к ней доступ, пока я не предоставлю правильные учетные данные, и здесь есть часть, где я не представляю, как отправить подпись в URL для аутентификации.Я пробовал что-то вроде следующего, но он продолжает давать мне странные символы

kDate = OpenSSL::HMAC.digest('sha256', "AWS4" + secret_access_key, dateStamp)
    kRegion = OpenSSL::HMAC.digest('sha256', kDate, regionName)
    kService = OpenSSL::HMAC.digest('sha256', kRegion, serviceName)
    signature = OpenSSL::HMAC.digest('sha256', kService, "aws4_request")


    puts("#{s3_base_url}?AWSAccessKeyId=#{access_key_id}
            &Expires=#{expiration_date}
            &Signature=#{signature}")

, это результат, когда я печатаю подпись

https://bucket-name.s3.amazonaws.com?AWSAccessKeyId=my-access-key
            &Expires=1542416076
            &Signature=Q�����>�9`o���r}�9��`�m��g��

Ps.Я также создал пользователя IAM с правами администратора

Спасибо, я использую ruby ​​2.5.1 и rails 5.2.0 Я супер новичок в работе с AMAZON, так что извините, если мой вопрос очевиден

1 Ответ

0 голосов
/ 15 ноября 2018

Я не уверен, что нужно создать подписанный URL-адрес вручную; Я никогда не пробовал это. Однако в драгоценном камне AWS есть метод presigned_url для объектов S3, который создаст их для вас. Затем вы можете использовать этот URL для доступа к объекту в приватной корзине.

См. https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Object.html#presigned_url-instance_method

bucket = Aws::S3::Bucket.new bucket_name
object = bucket.object object_key
object.presigned_url(:get, expires_in: expiry)
...