AWS Lambda: асинхронные вызовы вне обработчика (раздел инициализации, вызов лямбды) - PullRequest
1 голос
/ 18 марта 2019

Я хотел бы вызвать асинхронную функцию вне лямбда-обработчика с помощью следующего кода:

var client;
(async () => {
    var result =  await initSecrets("MyWebApi");
    var secret = JSON.parse(result.Payload);
    client= new MyWebApiClient(secret.API_KEY, secret.API_SECRET); 
});

async function initSecrets(secretName) {
    var input = {
    "secretName" : secretName
    };
    var result = await lambda.invoke({
       FunctionName: 'getSecrets',
       InvocationType: "RequestResponse",
       Payload: JSON.stringify(input)
    }).promise();
    return result;
}

exports.handler = async function (event, context) {

    var myReq = await client('Request');
    console.log(myReq);
};

«Клиент» не инициализируется. Тот же код отлично работает, если выполняется внутри обработчика. initSecrets содержит лямбда-вызов getSecrets (), который вызывает AWS SecretsManager Кто-нибудь знает, как асинхронные функции могут быть правильно вызваны для целей инициализации вне обработчика?

Большое спасибо за вашу поддержку.

Ответы [ 2 ]

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

Я столкнулся с подобной проблемой, пытаясь заставить next-js работать с aws-serverless-express.

Я исправил это, выполнив следующее (используя машинопись, поэтому просто игнорируйте биты любого типа)

const appModule = require('./App');
let server: any = undefined;

appModule.then((expressApp: any) => {
  server = createServer(expressApp, null, binaryMimeTypes);
});

function waitForServer(event: any, context: any){
  setImmediate(() => {
    if(!server){
      waitForServer(event, context);
    }else{
      proxy(server, event, context);
    }
  });
}

exports.handler = (event: any, context: any) => {
  if(server){
    proxy(server, event, context);
  }else{
    waitForServer(event, context);
  }
}

Так что для вашего кода может быть что-то вроде

var client = undefined;

initSecrets("MyWebApi").then(result => {
    var secret = JSON.parse(result.Payload);
    client= new MyWebApiClient(secret.API_KEY, secret.API_SECRET)
})

function waitForClient(){
  setImmediate(() => {
    if(!client ){
      waitForClient();
    }else{
      client('Request')
    }
  });
}

exports.handler = async function (event, context) {
  if(client){
    client('Request')
  }else{
    waitForClient(event, context);
  }
};

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

client вызывается до инициализации;client var "экспортируется" (и вызывается) до завершения функции async.Когда вы звоните await client(), клиент все равно будет undefined.

редактировать, попробуйте что-то вроде этого

var client = async which => {
    var result =  await initSecrets("MyWebApi");
    var secret = JSON.parse(result.Payload);
    let api = new MyWebApiClient(secret.API_KEY, secret.API_SECRET); 
    return api(which) // assuming api class is returning a promise
}

async function initSecrets(secretName) {
    var input = {
    "secretName" : secretName
    };
    var result = await lambda.invoke({
       FunctionName: 'getSecrets',
       InvocationType: "RequestResponse",
       Payload: JSON.stringify(input)
    }).promise();
    return result;
}

exports.handler = async function (event, context) {

    var myReq = await client('Request');
    console.log(myReq);
};
...