Lambda関数を使用してRDSに接続しようとしていますが、エラーが発生します。
var mysql = require('mysql');
exports.handler = function(event, context) {
//Connect to RDS
var connection = mysql.createConnection({
Host : 'hostname',
user : 'username',
password : 'password',
database : 'database'
});
connection.connect( function(err)
{
if (err)
{
throw err;
}
else
{
console.log('DB connection establish');
}
});
};
私が得ているエラーは:
START RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae Version: $LATEST
2016-03-08T23:08:06.737Z 9711e650-e582-11e5-af5f-97ba391a42ae
Error: connect ETIMEDOUT
at Connection._handleConnectTimeout (/var/task/node_modules/mysql/lib/Connection.js:412:13)
at Socket.g (events.js:180:16)
at Socket.emit (events.js:92:17)
at Socket._onTimeout (net.js:327:8)
at _makeTimerTimeout (timers.js:429:11)
at Timer.unrefTimeout [as ontimeout] (timers.js:493:5)
--------------------
at Protocol._enqueue (/var/task/node_modules/mysql/lib/protocol /Protocol.js:141:48)
at Protocol.handshake (/var/task/node_modules/mysql/lib/protocol /Protocol.js:52:41)
at Connection.connect (/var/task/node_modules/mysql /lib/Connection.js:123:18)
at exports.handler (/var/task/exports.js:21:12)
END RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae
REPORT RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae
Duration: 10988.17ms
Process exited before completing request
私はこれと同じ問題を抱えていて、直しました。これがstackoverflowでのこの問題の上位の検索結果であることを考慮して、解決策をここに投稿します。
この回答はVPC内のRDSインスタンス用です
ラムダ実行ロールには、VPC実行ポリシーが必要ですAWSLambdaVPCAccessExecutionRole
ラムダ関数にセキュリティグループを割り当てます
要約すると、これはラムダをRDSと同じVPCに配置し、ラムダ関数のIPに関係なく、ラムダ関数にMYSQLへのインバウンドアクセスを提供します。
私は同じ問題を抱えていて、グーグルであなたのエントリーを見つけましたが、今では解決しました。悲しいことに、どのアクションが実際にそれを解決したかは確かではありませんが、チェックしてください:
ラムダ関数でVPCオプションまたはAPIエンドポイントを設定せずに動作させ、経由で接続を確立しました
exports.handler = function(event, context) {
var mysql = require('mysql');
var connection = mysql.createConnection({
Host : 'hostwithoutport',
user : 'user',
password : 'password',
database : 'database'
});
connection.query('SELECT * FROM Xy WHERE ID = "1"', function(err, rows) {
if (err) {
console.error('error connecting: ' + err.stack);
context.fail();
return;
}
console.log('connected as id ' + connection.threadId);
context.succeed(rows);
});
};
別の方法で行うこともできますが、ラムダ関数は常に成功または失敗(または完了)することを覚えておいてください。そうしないと、クエリが結果を判断する前にラムダ関数が成功し、適切な結果が得られないために問題が発生する可能性があります。何らかの方法でラムダ関数を終了しないと、function自体がタイムアウトになりますが、見た目は異なります。
また、常に接続を終了することを忘れないでください。これは、クエリを直接使用することによって暗示されます。このメソッドは、それ自体で接続して終了します。私が別のスレッドで読んだことによると、この問題は、一度呼び出した接続がまだ開いているために理論的にも発生する可能性があります。
この問題を解決するために必要なものを見つけるために追加の作業が必要になったので、ajmcgarryの回答を補足したいと思います。
視覚的な指示が必要ですか?この動画は長すぎません。Pythonの場合でも、手順はこのケースに適用されます: https://www.youtube.com/watch?v=-CoL5oN1RzQ
私の場合、RDSのセキュリティの役割が着信接続をIPアドレスに制限していたため、当然、ローカルマシンから接続できましたが、ラムダ関数を公開すると接続できませんでした(Scherwinが書いたように) 、それは理想的ではありませんが、テストして遊んでみて機能します)、ラムダ関数を再デプロイしました(そうです、同じコードを再デプロイする必要がありましたが、それがどのように影響したかはわかりません)ラムダ関数は接続できました。
I しませんでしたデータベースはパブリックにアクセス可能であるため、同じVPCにラムダを含める必要があります。
私しませんでしたセキュリティロールを変更またはラムダに追加する必要があります。