如何在AWS Lambda函数中进行外部api调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在AWS Lambda函数中进行外部api调用相关的知识,希望对你有一定的参考价值。

我遇到问题Lambda函数,出于某种原因,它超时]。

我试图添加一些console.log以了解正在发生的事情,并且一切正常,直到外部http请求

我使用npm模块请求

我可以在请求之前看到日志,但是回调中的日志永远不会显示,就像端点没有响应一样。

我想念什么吗?预先感谢!

var mysql = require('mysql'); 
var request = require('request');
var config = require('./config.json'); 

var pool = mysql.createPool({
  host: config.dbhost,
  user: config.dbuser,
  password: config.dbpassword,
  database: config.dbname
});

var openWeatherOptions = (device) => {
    let domain = 'https://api.openweathermap.org/data/2.5/';
    let apiEndpoint = 'weather?';
    let params = `lat=${device.lat}&lon=${device.lng}&APPID=${process.env.WEATHER_APP_ID}&units=metric`;
    let url = [domain, apiEndpoint, params].join('').toString();
    return {
      url: url,
      method: 'GET',
      headers: { 'Content-Type': 'application/json'},
    };
};

exports.handler = (event, context, callback) => {
    context.callbackWaitsForEmptyEventLoop = false;
    // Connect to DB
    console.log('fallback connecting to DB')
    pool.getConnection( (errOnConnection, connection) => {
        if(errOnConnection) {
            callback({"err": errOnConnection });
        }
        console.log('fallback connected to DB')
        // Retrieve device position
        let queryOne = 'SELECT lat, lng FROM T03_DevicesPosition WHERE deviceCode = (?);';
        console.log('fallback retrieving device position')
        connection.query( queryOne, [event.device], (errOnQ1, results, fields) => { 
            if(errOnQ1) {
                connection.release();
                callback({"err": errOnQ1 });
            }
            console.log('fallback device position retrieved')

            // Call openweather 
            let device = results[0];
            let options = openWeatherOptions(device);
            console.log('fallback calling openWeather with following data: ', device, options);

            request( options, (errOpenWeather, response, body) => {
                console.log('fallback openweather response received');
                if(errOpenWeather || (response.statusCode !== 200 && response.statusCode !== 201) ) {
                    connection.release();
                    callback({"err": errOpenWeather });
                }
                let meteo = JSON.parse(body).main;
                meteo.date = new Date(event.time*1000);
                meteo.pressure = Math.floor( meteo.pressure );
                console.log('fallback storing data', meteo);
                let query = `INSERT INTO T02_DevicesTransmissions (deviceCode, transmissionDate, temperature, humidity, pressure, unixDate, rawData) VALUES ( ?, ?, ?, ?, ?, ?, ?);`;
                let queryValues = [ event.device, meteo.date, meteo.temp, meteo.humidity, meteo.pressure, event.time, 'fallback']; 
                connection.query( query, queryValues, (errInsert, results, fields) => { 
                    connection.release();
                    console.log('fallback completed with', errInsert ? '' : 'out');
                    if (errInsert) callback({"err": errInsert });
                    else callback();
                });
            });

        });
    });
}

我遇到Lambda函数的问题,由于某种原因,它会超时。我试图添加一些console.log以了解发生了什么,并且一切正常,直到外部...

答案

这是一个古老的问题,但我花了几个小时才弄清楚如何正确设置它,因此希望可以节省别人的时间:)

另一答案

这是您的解决方案,请阅读。

另一答案

您没有设置VPC,对吗?如果是这样,如果您在专用子网中,则必须检查是否已连接NAT网关。

以上是关于如何在AWS Lambda函数中进行外部api调用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?

AWS Lambda函数对在EC2中部署的api进行rest api调用

AWS Lambda 设备上没有剩余空间错误

如何使用AWS Lambda函数在本地系统上执行文件

AWS Lambda + NAT 网关的替代方案

AWS Lambda:如何将秘密存储到外部 API?