В настоящее время возникает ошибка в моей настройке Next. js, при которой я получаю временные ошибки при запросе объектов из S3 в пределах for
l oop. По сути, когда я запрашиваю отдельные файлы, ошибки нет, но когда я запрашиваю у al oop, он ломается, но только иногда. Кажется, это тип ошибки "разогрева", если я снова попробую пакетный запрос несколько раз, он в конечном итоге сработает (но мне не нужно делать это для моих запросов на один файл).
Точная ошибка:
VM1409:1 GET https://{link-to-bucket}{key.jpg}?response-content-disposition=attachment&response-content-type=image%2Fjpeg 403 (Forbidden)
, что является также показано с
Uncaught (in promise) SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.
Шаги, которые я пытался исправить:
- Убедился, что мой идентификатор ключа доступа и секрет верны (это не изменить, когда я запрашиваю один файл или когда я запрашиваю несколько, как показано ниже)
- Указан тип содержимого ответа и расположение содержимого ответа
- Пробовали с указанием и без указания
signatureVersion: "v4"
Код:
// getObjectS3 performs a request to the specified s3 bucket with
// the specified params and retries 3 times on failure.
function getObjectS3(params, bucketRegion, errorPrefix) {
/*
Inputs:
- params (object): Params object
- bucketRegion (string): Specified bucket name
- errorPrefix (string): Prefix string to be shown on failure
*/
aws.config.update(
{
"accessKeyId": process.env.AWS_SECRET_KEY_ID,
"secretAccessKey": process.env.AWS_SECRET_ACCESS_KEY,
"region": bucketRegion,
}
)
let S3 = new aws.S3({
signatureVersion: "v4"
})
let objectGetter = S3.getObject(params, (err) => {
if (err) {
return S3.getObject(params, (err2) => {
if (err) {
return S3.getObject(params, (err3) => {
if (err2) {
console.log(errorPrefix, err3)
}
})
}
})
}
})
return objectGetter.promise()
}
let imageFilenames = [
"key1.jpg",
"key2.jpg",
...
"key8.jpg"
]
let bucketRegion = "..."
let bucketName = "..."
let errorPrefix = "there is something wrong. hmm...."
let imageBatchData = []
for (let i = 0; i < imageFilenames.length; i++) {
let imageDataGetter = getObjectS3({
Bucket: bucketName,
Key: imageFilenames[i],
ResponseContentType: "image/jpeg",
ResponseContentDisposition: "attachment"
}, bucketRegion, errorPrefix)
imageBatchData.push(imageDataGetter)
}
Этот код запускается при монтировании компонента Page. Также стоит отметить, что в запрашиваемом мной списке никогда не бывает более 10-11 ключей.