s3.getObject (). обещание () никогда ничего не возвращает - PullRequest
0 голосов
/ 18 марта 2019

Если использовать этот код в Lambda, который соответствует всем, что я прочитал в stackoverflow и в документации AWS SDK.

Однако он не возвращает ничего и не выдает ошибку.Код просто привязан к s3.getObject (params) .promise (), поэтому лямбда-функция запускается по тайм-ауту, даже спустя более 30 секунд.Файл, который я пытаюсь получить, на самом деле составляет 25 КБ.

Есть идеи, почему это происходит?

var AWS = require('aws-sdk');
var s3 = new AWS.S3({httpOptions: {timeout: 3000}});    

async function getObject(bucket, objectKey) {
        try {
            const params = {
                Bucket: bucket,
                Key: objectKey
            }
            console.log("Trying to fetch " + objectKey + " from bucket " + bucket)
            const data = await s3.getObject(params).promise()
            console.log("Done loading image from S3")
            return data.Body.toString('utf-8')
        } catch (e) {
            console.log("error loading from S3")
            throw new Error(`Could not retrieve file from S3: ${e.message}`)
        }
    }

При тестировании функции я получаю следующий таймаут.

START RequestId: 97782eac-019b-4d46-9e1e-3dc36ad87124 Версия: $ LATEST 2019-03-19T07: 51: 30.225Z 97782eac-019b-4d46-9e1e-3dc36ad87124 Попытка извлечь public-images / low / ZARGES_41137_PROD_TECH_ST_LI.jpg из 2019-го уровня z9 из 19-го уровня: 51: 54.979Z 97782eac-019b-4d46-9e1e-3dc36ad87124 ошибка загрузки из S3 2019-03-19T07: 51: 54.981Z 97782eac-019b-4d46-9e1e-3dc36ad87124 {"errorMessage": "Не удалось получить файл из S3:Время соединения истекло после 3000 мс "," errorType ":" Ошибка "," stackTrace ": [" getObject (/var/task/index.js:430:15)","","process._tickDomainCallback (internal / process /next_tick.js: 228: 7) "]} END RequestId: 97782eac-019b-4d46-9e1e-3dc36ad87124 REPORT RequestId: 97782eac-019b-4d46-9e1e-3dc36ad87124 Продолжительность: 24876,90 мсек. Объявленная длительность: 241200 мс памятиИспользуемая память: 120 МБ

Полученное изображение действительноy общедоступный: https://s3.eu -central-1.amazonaws.com / zarges-pimdata-test / public-images / low / ZARGES_41137_PROD_TECH_ST_LI.jpg

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Время ожидания AWS SDK по умолчанию составляет 120000 мс. Если тайм-аут вашей лямбды короче, вы никогда не получите фактическую ошибку.

Либо увеличьте время ожидания AWS

var AWS = require('aws-sdk');
var s3 = new AWS.S3({httpOptions: {timeout: 3000}});

или продлите время ожидания вашей лямбды.

0 голосов
/ 18 марта 2019

Если вы не хотите извлекать его в переменную перед доступом к телу, как предложило @tuulka, просто заключите его в скобки.

const data = (await (s3.getObject(params).promise())).Body.toString('utf-8')
0 голосов
/ 18 марта 2019

Эта проблема определенно связана с подключением.

Проверьте настройки VPC, так как он может заблокировать подключение Lambda к Интернету (управляемые сервисы AWS, как S3, доступны только через Интернет).

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