Я пытаюсь использовать предварительно подписанный 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-адрес с префиксом домена, и загрузка работает нормально.
Другие примечания по моей настройке.
- Я настроил ресурс / upload на API-шлюзе для передачи S3 для метода PUT.
- Я включил CORS, где это необходимо. На ведре и на моем API. Я подтвердил, что CORS хорош, поскольку браузер проходит проверку.
- Я настроил свои политики. Лямбда-функция имеет доступ к Интернету из моего VPC, имеет полный доступ к S3 и имеет доверительные отношения как с S3, так и со шлюзом API. Эта исполнительная роль распределяется между ресурсами.
- Я использую пакет axios для загрузки файла через PUT.
- Я добавил журнал CloudTrail, но он сообщает о той же ошибке, что и браузер ...
- Временное обнародование моего ведра не имеет значения.
- Я безуспешно пытался добавить строки запроса в интеграцию запросов / ответов API-шлюза.
- Я добавил необходимые заголовки типов контента в запрос и в предварительно подписанную конфигурацию URL.
- Я погуглил эту штуку.
Я что-то упустил? Это возможно? Я планирую отключить свою пользовательскую конечную точку и в настоящее время перейти с предварительно подписанным URL-адресом по умолчанию, но в долгосрочной перспективе я хотел бы получить пользовательскую конечную точку. В худшем случае я могу заплатить за некоторую поддержку AWS.
Спасибо за помощь!