Я безуспешно пытаюсь настроить разрешения на чтение для корзины AWS S3.
Мой пример использования: частное приложение, запущенное на Node.js / express, которое отображает статические файлы изображений логотипа из S3ведро.Файлы изображений, хранящиеся в корзине S3, не должны быть общедоступными, а выбираются только для отображения в представлениях моего приложения.Для целей этого вопроса я буквально обслуживаю одну HTML-страницу, содержащую один элемент изображения.
Я выполнил шаги в этом руководстве по Heroku , которое предполагает, что если вы установитедействительная пара ключей AWS (представляющая роль AWS с надлежащими учетными данными) и имя сегмента S3 в переменных конфигурации Heroku, вы должны просто иметь возможность вставить ссылку на файл изображения S3 в ваш HTML, и он должен отображаться на сайте.
До сих пор большую часть своего времени я играл с разрешениями AWS для корзины S3 и роли IAM, которую я использую.
Вот что я сделал до сих пор:
В AWS я создаю пользователя IAM с именем «userx» с «Программным доступом» (то есть сгенерированной парой ключей).Во время создания пользователя я устанавливаю разрешения через «Присоединять существующие политики напрямую» и присоединяю политику «AmazonS3FullAccess» к своему новому пользователю.Допустим, у этого пользователя ARN: «arn: aws: iam :: 12345: user / userx»
С созданным новым пользователем (и новым идентификатором ключа доступа + секретным ключом доступа), Я обновляю свою конфигурацию Heroku в окне терминала через:
heroku config: set AWS_ACCESS_KEY_ID = 123MYACCESSKEYID
С последующим:
heroku config:set AWS_SECRET_ACCESS_KEY=123MYSECRETKEYxyz
Я создаю корзину AWS S3 под названием «my-assets» и устанавливаю права «Не предоставлять общедоступный доступ для чтения к этой корзине».Я загружаю один файл изображения в это ведро: myimage.png.Я установил разрешения корзины, сгенерировав новую политику корзины и прикрепив ее к корзине:
{
"Version": "2012-10-17",
"Id": "Policy1528038465156",
"Statement": [
{
"Sid": "Stmt1528038463415",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::12345:user/userx"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-assets",
"arn:aws:s3:::my-assets/*"
]
}
]
}
На герою я установил название корзины через:
heroku config:set S3_BUCKET_NAME=my-assets
Я установил конфигурацию CORS на моем ведре следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
На heroku я перезагружаю свой сервер и запускаю приложение, которое в настоящее время обслуживает один html-файл с одним элементом:
<<img src="https://s3.amazonaws.com/my-assets/myimage.png" />
Inмой терминал chrome, когда страница загружается, запрос к корзине S3 завершается с ошибкой 403.
Насколько я понимаю, - для простой ситуации выборки статических файлов - Heroku должен обработать запрос GET для моегоВедро S3, подписывающее запрос парой ключей, которую я загрузил в переменные конфигурации, и этот запрос должен иметь доступ для чтения файла образа из моего хранилища S3 из-за IAM, политики ведра и конфигурации CORS, приведенной выше.
Я трижды проверил свои пары ключей и т. Д. Правильно ли я считаю, что не нужно ничего делать для настройки запроса, поступающего от heroku на AWS (т.е. мне не нужно использовать AWS SDK или что-то подобноечто)?