[英]How to make an external api call within an AWS Lambda function
我遇到了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 位于 VPC 中,它们需要通过 NAT 网关才能访问外部服务。
实现这一目标的一种方法是:
target
字段中选择 NAT 来实现)这将通过 NAT 和 Internet 网关正确路由来自 lambda 的流量,以便它们可以访问外部服务。
请注意,如果您还在 lambdas 中使用 RDS 并且您还打算从外部连接到 RDS(例如从本地计算机管理数据库),则不能将 RDS 实例放在 lambdas 的子网中,或者您将无法从外部连接到它(NAT 仅出站)。 在这种情况下,您应该确保您的 RDS 实例与一个可访问的子网相关联,例如 NAT 所在的子网(即,将出站流量发送到 Internet 网关的子网)。
您没有 VPC 集,对吗? 如果你这样做了,如果你在私有子网上,必须检查你是否连接了 NAT 网关。
这是您的解决方案,请阅读。
更远
此代码示例展示了如何在您的技能 Lambda 代码中调用和接收外部休息服务数据。 https://github.com/robm26/SkillsDataAccess/blob/master/src/CallService/index.js
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.