web-dev-qa-db-ja.com

AWS LambdaはRDSインスタンスに接続できませんが、ローカルで接続できますか?

ラムダからRDSインスタンスに接続しようとしています。私はラムダをローカルで作成し、ローカルでテストしましたが、すべてがうまくいきました。ラムダにデプロイしたところ、突然機能しなくなりました。以下は私が実行しているコードです。それが役立つ場合は、キネシスストリームを介してラムダを呼び出しています。

'use strict';

exports.handler = (event, context, handlerCallback) => {
    console.log('Recieved request for kinesis events!');
    console.log(event);
    console.log(context);

    const connectionDetails = {
        Host:     RDS_Host,
        port:     5432,
        database: RDS_DATABASE,
        user:     RDS_USER,
        password: RDS_PASSWORD
    };

    const db = require('pg-promise')({promiseLib: require('bluebird')})(connectionDetails);

    db
            .tx(function () {
                console.log('Beginning query');

                return this.query("SELECT 'foobar'")
                           .then(console.log)
                           .catch(console.log)
                           .finally(console.log);
            })
            .finally(() => handlerCallback());
};

役立つ場合は、クラウドウォッチのログを以下に示します。

START RequestId: *********-****-****-****-********* Version: $LATEST 
2016-05-31T20:58:25.086Z    *********-****-****-****-*********  Recieved request for kinesis events! 
2016-05-31T20:58:25.087Z    *********-****-****-****-*********  { Records:  [ { kinesis: [Object], eventSource: 'aws:kinesis', eventVersion: '1.0', eventID: 'shardId-000000000000:**********************************', eventName: 'aws:kinesis:record', invokeIdentityArn: 'arn:aws:iam::******************:role/lambda_kinesis_role', awsRegion: 'us-east-1', eventSourceARN: 'arn:aws:kinesis:us-east-1:****************:stream/route-registry' } ] } 
2016-05-31T20:58:25.283Z    *********-****-****-****-*********  { callbackWaitsForEmptyEventLoop: [Getter/Setter], done: [Function], succeed: [Function], fail: [Function], logGroupName: '/aws/lambda/apiGatewayRouteRegistry-development', logStreamName: '2016/05/31/[$LATEST]******************', functionName: 'apiGatewayRouteRegistry-development', memoryLimitInMB: '128', functionVersion: '$LATEST', getRemainingTimeInMillis: [Function], invokeid: '*********-****-****-****-*********', awsRequestId: '*********-****-****-****-*********', invokedFunctionArn: 'arn:aws:lambda:us-east-1:*************:function:apiGatewayRouteRegistry-development' } 
END RequestId: *********-****-****-****-********* 
REPORT RequestId: *********-****-****-****-*********    Duration: 20003.70 ms   Billed Duration: 20000 ms Memory Size: 128 MB   Max Memory Used: 22 MB   
2016-05-31T20:58:45.088Z *********-****-****-****-********* Task timed out after 20.00 seconds
18
LordZardeck

@MarkB @ Michael-sqlbotはコメントで正しかった、それはセキュリティグループの問題でした。

RDSセキュリティグループが実際に特定のIPに対してプライベートであることを指摘するために、ついにAWSサポートの応答を受け取りました。これは設定したことがないので意味がありません。ローカルマシンとElastic Beanstalkからデータベースにアクセスできました。セキュリティグループに0.0.0.0/0を追加すると、ラムダが接続できるようになります。助けてくれてありがとう!

20
LordZardeck

これが私がこの問題を修正した方法です。

DBインスタンスを作成するときに、VPCを選択するように求められます。デフォルト値を選択した場合でも、システムのパブリックIPがデフォルトのインバウンドIPになります。一方、ラムダ関数には独自のIP設定があります。そのため、IDEまたはローカルでアクセスできますが、ラムダ関数ではアクセスできません。

IP制限を追加するには:

  1. インスタンスのセキュリティグループに移動します。デフォルトのセキュリティグループを選択した後、それをクリックします。新しいページで下にスクロールして、受信設定と送信設定を探します。

  2. 受信設定で、[編集]をクリックします。ここでIPを変更できます。 (0.0.0.0/0は世界中に公開します)

  3. ここにパブリックIPを追加すると、IDEまたはローカル接続が機能します。

  4. ラムダ関数を機能させるには、ラムダ関数のIPを追加します。 Lambda関数、[ネットワーク]-> [VPC]->(VPCが選択されていない場合は、DB関数と同じVPCを選択)に移動し、ここでIPをメモします。

  5. このIPをインバウンド設定に入力すると、自動フィラーが表示されます。

それを保存し、ラムダ関数をテストします。

13
Mohanty

これに対する答えは、世界規模のアクセスがない場合です。

AWS LambdaがRDSデータベースにアクセスすることを許可する

マークの答えを繰り返す:

  1. ラムダ関数へのvpcアクセスを追加する
  2. ラムダの新しいセキュリティグループを作成する
  3. RDSセキュリティグループをラムダのSGに追加します。
2
Trellan5E