Как настроить простое статическое чтение изображений AWS S3 через Heroku / Node.js (403 ошибки доступа) - PullRequest
0 голосов
/ 03 июня 2018

Я безуспешно пытаюсь настроить разрешения на чтение для корзины AWS S3.

Мой пример использования: частное приложение, запущенное на Node.js / express, которое отображает статические файлы изображений логотипа из S3ведро.Файлы изображений, хранящиеся в корзине S3, не должны быть общедоступными, а выбираются только для отображения в представлениях моего приложения.Для целей этого вопроса я буквально обслуживаю одну HTML-страницу, содержащую один элемент изображения.

Я выполнил шаги в этом руководстве по Heroku , которое предполагает, что если вы установитедействительная пара ключей AWS (представляющая роль AWS с надлежащими учетными данными) и имя сегмента S3 в переменных конфигурации Heroku, вы должны просто иметь возможность вставить ссылку на файл изображения S3 в ваш HTML, и он должен отображаться на сайте.

До сих пор большую часть своего времени я играл с разрешениями AWS для корзины S3 и роли IAM, которую я использую.

Вот что я сделал до сих пор:

  1. В AWS я создаю пользователя IAM с именем «userx» с «Программным доступом» (то есть сгенерированной парой ключей).Во время создания пользователя я устанавливаю разрешения через «Присоединять существующие политики напрямую» и присоединяю политику «AmazonS3FullAccess» к своему новому пользователю.Допустим, у этого пользователя ARN: «arn: aws: iam :: 12345: user / userx»

  2. С созданным новым пользователем (и новым идентификатором ключа доступа + секретным ключом доступа), Я обновляю свою конфигурацию 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 или что-то подобноечто)?

1 Ответ

0 голосов
/ 03 июня 2018

Это не имеет ничего общего с heroku, heroku не обслуживает ваши файлы, вы обращаетесь к s3 прямо из браузера.

Если вы хотите обслуживать файлы непосредственно из s3, вы должны дать имПубличные права на чтение файлов.

Чтобы сделать файл общедоступным, просто:

click file > More > Make public

Вам понадобятся ключи доступа, если вы хотите загружать / читать файлы из частногос вашего сервера, но они вам не понадобятся, если вы запрашиваете в браузере изображение, размещенное на S3 и имеющее открытый доступ для чтения.

Что касается конфигурации CORS, вы можете проверить этот вопрос:

Ошибка Cors при загрузке изображения с S3


Если вы хотите сохранить свой файл закрытым и разрешить его просматривать только некоторым аутентифицированным пользователям, вы можете использовать aws-sdk для создания подписанного URL-адреса S3 и использования этого URL в браузере.

const AWS = require('aws-sdk')

const s3 = new AWS.S3()
AWS.config.update({ 
    accessKeyId: 'keyId', 
    secretAccessKey: 'accessKey'
})

const params = {
    Bucket: 'bucket-name',
    Key: 'my-assets/myimage.png',
    Expires: 60 // Seconds
};

(async() => {

    s3.getSignedUrl('getObject', params, (err, url) => {
        console.log(url);

        // This is the URL that you need to use on your HTML
    });

})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...