#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 можете ли вы пролить какой-либо свет на это, это беспокоит меня уже несколько дней. Был бы очень признателен.