AWS Lambda connect ETIMEDOUT
AWS LambdaでDB接続してデータをインサートするFunctionを書いていて、以下のような ETIMEDOUTエラーが出力されました。エラーがあったが、処理自体は正常に行われてデータがちゃんとDBに挿入されてます。
Error
2017-02-03T05:11:32.012Z c31fa576-e9cc-11e6-85b4-5dea6b0e5632 { [Error: connect ETIMEDOUT] errorno: 'ETIMEDOUT', code: 'ETIMEDOUT', syscall: 'connect', fatal: true }
Code
var mysql = require('mysql');
exports.handler = function(event,context,callback){
var No = event.No
var Birth = event.Birth
var Email = event.Email
var Name = event.Name
if(No == null || Birth == null || Email == null || Name == null){
context.done('FAILED');
}
var connection = mysql.createConnection({
host : 'rds endpoint url',
user : 'root',
password : 'password',
database : 'db'
});
connection.connect();
var insert_sql = "insert into User (No, Birth, Email, Name) value ('" + No + "','" + Birth +"','" + Email +"','" + Name + "')"
connection.query(insert_sql, function(err, rows, fields) {
if (err)
{
console.log("--err");
console.log(err);
callback(new Error("FAILED"));
}
});
connection.end(function(err) {
context.done('SUCCESSED');
});
}
いろいろ調べたのですが、LambdaのTimeout値を超えたとか、RDSへのアクセス権ないとか、いろいろありました。
自分の場合は、connection.connect() の一番先頭に持っていたらうまくいった。よくわからんけど。
以下の様な感じです。
var mysql = require('mysql');
exports.handler = function(event,context,callback){
var connection = mysql.createConnection({
host : 'rds endpoint url',
user : 'root',
password : 'password',
database : 'db'
});
connection.connect();
var No = event.No
var Birth = event.Birth
var Email = event.Email
var Name = event.Name
if(No == null || Birth == null || Email == null || Name == null){
context.done('FAILED');
}
var insert_sql = "insert into User (No, Birth, Email, Name) value ('" + No + "','" + Birth +"','" + Email +"','" + Name + "')"
connection.query(insert_sql, function(err, rows, fields) {
if (err)
{
console.log("--err");
console.log(err);
callback(new Error("FAILED"));
}
});
connection.end(function(err) {
context.done('SUCCESSED');
});
}