s3.putObject (params) .promise () не загружает файл, но успешно выполняет обратный вызов then () - PullRequest
0 голосов
/ 19 сентября 2019

У меня было довольно много попыток поместить файл в корзину S3, после чего мне пришлось обновить мою модель.

У меня следующий код (обратите внимание, что я тоже пробовал закомментированные строки. Он тоже не работаетс комментариями и без него.)

Наблюдаемая проблема: Все в первом блоке .then() (successCallBack()) успешно выполнено, но я не вижу результат s3.putObject().

Рассматриваемая область общедоступна, ограничений доступа нет.Раньше она работала с автономной опцией sls, затем из-за того, что она не работала в AWS, мне пришлось внести множество изменений, и мне удалось заставить работать successCallback (), которая успешно работает с базой данных.Тем не менее, загрузка файла по-прежнему не работает.

Некоторые вопросы:

При решении этой проблемы, реальные вопросы, которые я обдумываю / ищу, следующие:

  • Лямбда должна что-то возвращать?Я видел документы AWS, но в них есть фрагментированные фрагменты кода.

  • Помещение await перед s3.putObject(params).promise() не помогает.Я вижу образцы с и без ожидания перед вещами, которые имеют вызов функции AWS Promise ().Не уверен, какие из них правильные.

  • Как правильно, если у вас есть цепочка асинхронных функций для выполнения в одной лямбда-функции?

ОБНОВЛЕНИЕ:

var myJSON = {}
const createBook = async (event) => {

    let bucketPath = "https://com.xxxx.yyyy.aa-bb-zzzzzz-1.amazonaws.com"
    let fileKey = //file key
    let path = bucketPath + "/" + fileKey;

    myJSON = {
      //JSON from headers
    }

    var s3 = new AWS.S3();
    let buffer = Buffer.from(event.body, 'utf8');

    var params = {Bucket: 'com.xxxx.yyyy', Key: fileKey, Body: buffer, ContentEncoding: 'utf8'};

    let putObjPromise = s3.putObject(params).promise();

    putObjPromise
    .then(successCallBack())
    .then(c => {
      console.log('File upload Success!');
      return {
        statusCode: 200,
        headers: { 'Content-Type': 'text/plain' },
        body: "Success!!!"
      }
    })
    .catch(err => {   
        let str = "File upload /  Creation error:" + err;
        console.log(str);
        return {
          statusCode: err.statusCode || 500,
          headers: { 'Content-Type': 'text/plain' },
          body: str
        }
    });
}

const successCallBack = async () => {
  console.log("Inside success callback - " + JSON.stringify(myJSON))  ;
  const { myModel } = await connectToDatabase()
  console.log("After connectToDatabase")
  const book = await myModel.create(myJSON)

  console.log(msg);
}

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Если лямбда работает в VPC, то вам потребуется конечная точка VPC для доступа к сервису за пределами vpc.S3 будет вне VPC.Возможно, если безопасность является проблемой, то создание конечной точки VPC решит проблему лучше.Кроме того, если безопасность является проблемой, то, возможно, добавление политики (или использование политики AmazonS3FullAccess по умолчанию) к роли, которую использует лямбда, тогда корзина S3 не должна быть общедоступной.

0 голосов
/ 20 сентября 2019

Наконец-то я получил это на работу.Мой код работал уже в автономной настройке SLS.

Что отличалось на конечной точке AWS?

На консоли я заметил тот факт, что моя лямбда была настроена для работы под VPC.

Когда я выбрал Нет VPC , это сработало.Я не знаю, является ли это лучшей практикой.Должно быть какое-то преимущество в безопасности, получаемое функциями, работающими под VPC.

Я натолкнулся на это огромное объяснение о VPC , но я не смог найти ничего, связанного с S3.

код, указанный в вопросе, в настоящее время нормально работает на конечной точке AWS.

...