web-dev-qa-db-ja.com

エラー:ETIMEDOUTrdsラムダを接続します

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
13
user1042327

私はこれと同じ問題を抱えていて、直しました。これがstackoverflowでのこの問題の上位の検索結果であることを考慮して、解決策をここに投稿します。

この回答はVPC内のRDSインスタンス用です

  1. lambda関数をRDSインスタンスと同じVPCに配置する
  2. ラムダ実行ロールには、VPC実行ポリシーが必要ですAWSLambdaVPCAccessExecutionRole

  3. ラムダ関数にセキュリティグループを割り当てます

  4. RDSインスタンスにアタッチされたセキュリティで、mysql/aurora(ポート3306)のインバウンドルールを追加し、IPアドレスに追加するのではなく、ラムダ関数セキュリティグループに追加します。

要約すると、これはラムダをRDSと同じVPCに配置し、ラムダ関数のIPに関係なく、ラムダ関数にMYSQLへのインバウンドアクセスを提供します。

19
ajmcgarry

私は同じ問題を抱えていて、グーグルであなたのエントリーを見つけましたが、今では解決しました。悲しいことに、どのアクションが実際にそれを解決したかは確かではありませんが、チェックしてください:

  • VPCを使用しない場合は、少なくともテスト目的で、それが公的にアクセス可能なRDSで動作するかどうかを確認してください。
  • Identity and Access Management領域内にロール(例:lambda_basic_execution)AmazonRDSFullAccessを付与します
  • DBインスタンスのRDS概要内で、選択したセキュリティグループをクリックして編集できます。次のウィンドウで、インバウンドおよびアウトバウンドのトラフィックルールを指定できます。私の実際の例では、すべてのポートとすべてのIP(0.0.0.0/0)からのすべてのトラフィックを双方向で許可しました。もちろん、これは安全なソリューションではありませんが、あなたの例に関しては、私と同じように、AWSにアクセスして、最初に実用的な例を作成しようとしているだけだと思います。これらのルールは後でいつでも編集して、トラフィックを徐々に制限できます。私は最初に自分のコンピューターを介してRDSへのアクセスをテストするためにこれを行いました

ラムダ関数で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自体がタイムアウトになりますが、見た目は異なります。

また、常に接続を終了することを忘れないでください。これは、クエリを直接使用することによって暗示されます。このメソッドは、それ自体で接続して終了します。私が別のスレッドで読んだことによると、この問題は、一度呼び出した接続がまだ開いているために理論的にも発生する可能性があります。

2
Scherwin

この問題を解決するために必要なものを見つけるために追加の作業が必要になったので、ajmcgarryの回答を補足したいと思います。

  1. はい、LambdaがVPCにアクセスして制御するための特別なロールを作成する必要があります。次のページの指示に従ってください: https://docs.aws.Amazon.com/lambda/latest/dg/vpc-rds-create- iam-role.html
  2. この新しいロールがLambdaに割り当てられたら、RDSインスタンスが実行されているのと同じVPCを使用する必要があります。
  3. Lambda関数で同じセキュリティグループを使用する必要があります。まず、RDSインスタンスで、セキュリティグループを見つけて変更し、インバウンドルールを追加して、テスト目的でどこからでもDBポートにアクセスできるようにします。
  4. 変更したばかりのセキュリティグループをLambda関数に割り当てます

視覚的な指示が必要ですか?この動画は長すぎません。Pythonの場合でも、手順はこのケースに適用されます: https://www.youtube.com/watch?v=-CoL5oN1RzQ

0
Sergio D.

私の場合、RDSのセキュリティの役割が着信接続をIPアドレスに制限していたため、当然、ローカルマシンから接続できましたが、ラムダ関数を公開すると接続できませんでした(Scherwinが書いたように) 、それは理想的ではありませんが、テストして遊んでみて機能します)、ラムダ関数を再デプロイしました(そうです、同じコードを再デプロイする必要がありましたが、それがどのように影響したかはわかりません)ラムダ関数は接続できました。

I しませんでしたデータベースはパブリックにアクセス可能であるため、同じVPCにラムダを含める必要があります。

しませんでしたセキュリティロールを変更またはラムダに追加する必要があります。

0
Naguib Ihab