S3 Предварительно подписанный URL с пользовательской конечной точкой через API-шлюз, MethodNotAllowed - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь использовать предварительно подписанный URL для корзины S3 с пользовательской конечной точкой. Кажется, я так близко, но получаю сообщение об ошибке «Метод не разрешен». Вот где я нахожусь.

У меня есть API-шлюз, который соединяет конечную точку с лямбда-функцией. Эта функция, помимо прочего, генерирует предварительно подписанный URL. Вот так

var s3 = new AWS.S3({
    endpoint: 'custom.domain.com/upload',
    s3BucketEndpoint: true,
    signatureVersion: 'v4'
});

//...

s3.getSignedUrl('putObject', {
    ACL: 'bucket-owner-full-control',
    Bucket: process.env.S3_BUCKET_NAME,
    ContentType: "image/png",
    Key: asset.id + ".png"
};

Этот код успешно возвращает URL-адрес, в котором указаны все правильные параметры запроса, правильное имя ключа и URL-адрес указывает на мою конечную точку. Однако при попытке загрузить я получаю следующую ошибку:

MethodNotAllowed Указанный метод запрещен для этого ресурса. PUTSERVICE [идентификатор запроса был здесь] [идентификатор хоста был здесь]

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

Другие примечания по моей настройке.

  1. Я настроил ресурс / upload на API-шлюзе для передачи S3 для метода PUT.
  2. Я включил CORS, где это необходимо. На ведре и на моем API. Я подтвердил, что CORS хорош, поскольку браузер проходит проверку.
  3. Я настроил свои политики. Лямбда-функция имеет доступ к Интернету из моего VPC, имеет полный доступ к S3 и имеет доверительные отношения как с S3, так и со шлюзом API. Эта исполнительная роль распределяется между ресурсами.
  4. Я использую пакет axios для загрузки файла через PUT.
  5. Я добавил журнал CloudTrail, но он сообщает о той же ошибке, что и браузер ...
  6. Временное обнародование моего ведра не имеет значения.
  7. Я безуспешно пытался добавить строки запроса в интеграцию запросов / ответов API-шлюза.
  8. Я добавил необходимые заголовки типов контента в запрос и в предварительно подписанную конфигурацию URL.
  9. Я погуглил эту штуку.

Я что-то упустил? Это возможно? Я планирую отключить свою пользовательскую конечную точку и в настоящее время перейти с предварительно подписанным URL-адресом по умолчанию, но в долгосрочной перспективе я хотел бы получить пользовательскую конечную точку. В худшем случае я могу заплатить за некоторую поддержку AWS.

Спасибо за помощь!

1 Ответ

0 голосов
/ 05 сентября 2018

Я не могу найти документацию, в которой говорится, что предопределенный URL-адрес поддерживает прокси (alt / custom domain). IMO сценарий использования для аутентификации и предоставления запросов на доступ к ресурсам AWS из шлюза API (независимо от того, используете ли вы прокси-сервер S3) будет состоять в том, чтобы использовать авторизатор шлюза API с lambda, чтобы запрос принял роль IAM, которая имеет доступ к ресурсам AWS (в данном случае PUT OBJECT для корзины s3)

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html

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