AWS S3 GetObject иногда выдает ошибку для пакетной обработки - PullRequest
0 голосов
/ 06 мая 2020

В настоящее время возникает ошибка в моей настройке 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 ключей.

...