Я пытаюсь получить предварительно подписанный URL для загрузки файлов в корзину S3. Вот мой рабочий процесс:
1. Вызвать лямбду -> 2. Получить предварительно подписанный URL -> 3. Нажмите URL (PUT) с файлом
1. Вызвать лямбду
Я убедился, что клавиши AWS имеют правильное разрешение. На самом деле, он имеет полный доступ. Вот исходный код:
AWS.config.update({
accessKeyId: '*****************',
secretAccessKey: '*****************',
region: 'us-east-1',
signatureVersion: 'v4'
});
let requestObject = JSON.parse(event["body"]);
let fileName = requestObject.fileName;
let fileType = requestObject.fileType;
const myBucket = 'jobobo-resumes';
s3.getSignedUrl('putObject', {
"Bucket": myBucket,
"Key": fileName,
"ContentType": fileType
}, function (err, url) {
if (err) {
mainCallback(null, err);
} else {
mainCallback(null, url);
}
}
Итак, я получаю имя файла, тип файла (MIME) из запроса и использую его для создания подписи.
2. Получить предварительно подписанный URL Когда я нажимаю лямбду, я получаю предварительно подписанный URL. Теперь я буду использовать этот URL для загрузки файла на S3.
3. Нажмите на URL-адрес (PUT) с помощью файла
Теперь я нажимаю URL-адрес с помощью метода HTTP и добавляю файл (двоичный файл), см. Мой запрос почтальона:
Вы видите, что я обработал запрос с помощью PUT HTTP-метода. Я получаю ошибку 403. Вот заголовки в запросе, и вы можете видеть, что тип контента равен image/jpeg
:
Когда я пытаюсь POST метод, я получаю, что подпись недействительна. Я предполагаю, что это из-за подписи для метода PUT.
Вот настройки S3-корзины:
Так как Я получаю отказ в доступе, я полностью открыл ведро, я имею в виду Block Public access: off
.
Что не так с настройками? Может S3?