Проблемы с внешними http-запросами в AWS Lambda

#amazon-web-services #http #aws-lambda

#amazon-web-services #http #aws-lambda

Вопрос:

Я использую города, хранящиеся в таблице DynamoDB, для выполнения вызовов внешнего погодного API, чтобы определить, будет ли дождь в этом городе в этот день. Затем он вызывает отдельный Lambda, который использует эту информацию для сообщения подписчикам темы SNS о том, что будет дождь.

 const AWS = require('aws-sdk');
AWS.config.update({ region: 'eu-west-2' });
const lambda = new AWS.Lambda();
const axios = require('axios');
const tableName = process.env.CITY_TABLE;
const docClient = new AWS.DynamoDB.DocumentClient();
const publishMessageLambda = process.env.PUBLISH_MESSAGE_LAMBDA_NAME;
const weatherApiKey = process.env.WEATHER_API_KEY;

exports.handler = async (event) => {
  const scanParams = {
TableName: tableName,
AttributesToGet: ['city'],
};

try {
let citiesArr = await docClient.scan(scanParams).promise();

citiesArr.Items.forEach(async (cityObj) => {
  // console.log('cityObj', cityObj);
  // console.log('city', cityObj.city);
  // console.log('weatherApiKey:', weatherApiKey);
  let weatherReport = await axios({
    method: 'get',
    url: 'http://api.weatherapi.com/v1/forecast.json',
    params: {
      key: weatherApiKey,
      q: cityObj.city,
      days: 1,
    },
  });

  // console.log(weatherReport);

  let city = cityObj.city;

  let dailyChanceOfRain = Number(
    weatherReport.data.forecast.forecastday[0].day.daily_chance_of_rain
  );
  let totalPrecip =
    weatherReport.data.forecast.forecastday[0].day.totalprecip_mm;
  let lambdaParams = {
    FunctionName: publishMessageLambda,
    InvocationType: 'RequestResponse',
    Payload: JSON.stringify({
      body: { dailyChanceOfRain, totalPrecip, city },
    }),
  };
  console.log('dailyChanceOfRain: ', dailyChanceOfRain);
  console.log('totalPrecip: ', totalPrecip);
  if (dailyChanceOfRain > 50 amp;amp; totalPrecip > 3) {
    let data = await lambda.invoke(lambdaParams).promise();
  }
  // console.log(
  //   'weatherReport: ',
  //   weatherReport.data.forecast.forecastday[0].day
  // );
});
} catch (error) {
console.log(error);
}
};
  

При локальном запуске функции в командной строке создаются нужные журналы, однако при запуске функции на Lambda журналы, связанные с внешним http-запросом, не отображаются при холодном запуске, а журналы отображаются только после многократного вызова функции, и часто не вместе.

Любые советы будут высоко оценены.

Комментарии:

1. Вы говорите, что холодный запуск завершается неудачно, но последующие вызовы завершаются успешно? Можете ли вы более подробно рассказать о том, что это значит? «связанные с этим журналы не отображаются при первом вызове, и все журналы отображаются только после многократного вызова функции».

2. Да, извините за путаницу. Я имею в виду, что всякий раз, когда я развертываю функцию с помощью бессерверной платформы, первый вызов после развертывания, который был бы холодным запуском, не создает ни одного из желаемых журналов. Журналы отображаются в CloudWatch только при последующих вызовах и часто не вместе.

3. @MarkB можете ли вы пролить какой-либо свет на это, это беспокоит меня уже несколько дней. Был бы очень признателен.