Аутентифицировать AWS лямбда по API Google Таблиц - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь создать лямбда-функцию aws, которая будет читать строки из нескольких документов Google Sheets с помощью Google Sheet API, а затем объединять их и записывать в другую электронную таблицу. Для этого я выполнил все необходимые шаги в соответствии с несколькими руководствами:

  • Создайте учетные данные для пользователя AWS, чтобы иметь пару ключей.
  • Создайте учетную запись службы Google, загрузите учетные данные. json файл.
  • Совместное использование каждой необходимой электронной таблицы с учетной записью службы Google client_email .

При выполнении программы локально он работает отлично, он успешно входит в систему с использованием учетных данных . json файл и читает и записывает все необходимые документы.

Однако при загрузке в AWS Lambda с использованием serverless framework и google-spreadsheet , программа молча терпит неудачу на этапе аутентификации. Я попытался изменить разрешения, как рекомендовано в этом вопросе , но все равно не удалось. Файл прочитан правильно, и я могу распечатать его на консоли.

Это упрощенный код:

async function getData(spreadsheet, psychologistName) {
    await spreadsheet.useServiceAccountAuth(clientSecret);

    // It never gets to this point, it fails silently

    await spreadsheet.loadInfo();

    ... etc ...    
}


async function main() {
    const promises = Object.entries(psychologistSheetIDs).map(async (psychologistSheetIdPair) => {
        const [psychologistName, googleSheetId] = psychologistSheetIdPair;
        const sheet = new GoogleSpreadsheet(googleSheetId);
        psychologistScheduleData = await getData(sheet, psychologistName);
        return psychologistScheduleData;
    });
    //When all sheets are available, merge their data and write back in joint view.
    Promise.all(promises).then(async (psychologistSchedules) => {
        ... merge the data ...
    });
}


module.exports.main = async (event, context, callback) => {
  const result = await main();
  return {
    statusCode: 200,
    body: JSON.stringify(
      result,
      null,
      2
    ),
  };

1 Ответ

0 голосов
/ 17 июня 2020

Я решил это,

Хотя локально наличие Promise.all(promises).then(result =>...) в конечном итоге вернуло значение и выполнило то, что было внутри then(), aws лямбда, возвращенного до того, как обещания были разрешены.

Это решило это:

const res = await Promise.all(promises);
mergeData(res);
...