web-dev-qa-db-ja.com

Lambda関数(ノード)からMySQLデータベースに接続する

Lambda関数からNodeを使用してMySQLデータベースに接続できませんでした。受け取るエラーはTask timed out after 4.00 seconds

ソリューションはありますか?

私の状態の概要は次のとおりです。

  1. AWS RDSデータベースはMySQLデータベースです。 VPCに限定されません(MySQLWorkbenchのHost/user/passwordを使用して接続できます)。
  2. Lambda関数の実行ロールは、Lambdaが信頼できるエンティティとして設定され、AdministratorAccessが指定されています。
  3. ローカルマシンにmysqlモジュールをインストールし、index.jsおよびnode_modulesフォルダーを圧縮して、Lambda関数にアップロードしました。
  4. CreateConnectionおよびconnect関数をハンドラー内に配置しようとしました。接続関数のコールバック関数内にクエリを配置しようとしました。タイムアウト時間を10秒に増やしてみました。
  5. 私のコード:

    var mysql = require('mysql');
    
    var connection = mysql.createConnection({
        Host     : 'Amazon-string.rds.amazonaws.com',
        user     : 'myusername',
        password : 'mypassword'
    });
    
    connection.connect();
    
    exports.handler = (event, context, callback) => {
    
        connection.query("SELECT * FROM table", function(err, rows, fields) {
            console.log("rows: " + rows);
            callback(null);
        });
    
    };
    
7
sketchedin

タイムアウトを1分に増やします。ラムダ関数のコールドスタートが原因である可能性があります。

同じ接続を再利用しているため、最初の呼び出しだけに時間がかかり、連続した呼び出しは非常に高速になります。

また、タイムアウトを長くすることは、そのタイムアウトに対して課金されることを意味するのではなく、Lambdaの実行時間に対してのみ課金されます。

また、coldstart時間を短縮するために、スクリプトをwebpackすることができます。

http://docs.aws.Amazon.com/sdk-for-javascript/v2/developer-guide/webpack.html

もう1つの問題があります。

var mysql = require('mysql');

var connection = mysql.createConnection({
    Host     : 'Amazon-string.rds.amazonaws.com',
    user     : 'myusername',
    password : 'mypassword'
});

connection.connect();

exports.handler = (event, context) => {

    connection.query("SELECT * FROM table", function(err, rows, fields) {
        console.log("rows: " + rows);
        context.succeed('Success');
    });

};

それが役に立てば幸い。

7
Kannaiyan

RDSを使用しているため、セキュリティグループの構成を確認してください。デフォルトでは、RDSのセキュリティグループは、独自のIPおよびデフォルトVPC上のデフォルトセキュリティグループからのインバウンド接続を許可します。ただし、LambdaはデフォルトでVPCなしで実行されるため、RDSへの接続を確立できません。

RDSインスタンスを変更してすべてのIPアドレスを許可するか、RDSインスタンスがアクセスできるVPCでLambda関数を実行し、セキュリティグループへのアクセスを許可します。

3
heneryville