ラムダから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
@MarkB @ Michael-sqlbotはコメントで正しかった、それはセキュリティグループの問題でした。
RDSセキュリティグループが実際に特定のIPに対してプライベートであることを指摘するために、ついにAWSサポートの応答を受け取りました。これは設定したことがないので意味がありません。ローカルマシンとElastic Beanstalkからデータベースにアクセスできました。セキュリティグループに0.0.0.0/0を追加すると、ラムダが接続できるようになります。助けてくれてありがとう!
これが私がこの問題を修正した方法です。
DBインスタンスを作成するときに、VPCを選択するように求められます。デフォルト値を選択した場合でも、システムのパブリックIPがデフォルトのインバウンドIPになります。一方、ラムダ関数には独自のIP設定があります。そのため、IDEまたはローカルでアクセスできますが、ラムダ関数ではアクセスできません。
IP制限を追加するには:
インスタンスのセキュリティグループに移動します。デフォルトのセキュリティグループを選択した後、それをクリックします。新しいページで下にスクロールして、受信設定と送信設定を探します。
受信設定で、[編集]をクリックします。ここでIPを変更できます。 (0.0.0.0/0は世界中に公開します)
ここにパブリックIPを追加すると、IDEまたはローカル接続が機能します。
ラムダ関数を機能させるには、ラムダ関数のIPを追加します。 Lambda関数、[ネットワーク]-> [VPC]->(VPCが選択されていない場合は、DB関数と同じVPCを選択)に移動し、ここでIPをメモします。
このIPをインバウンド設定に入力すると、自動フィラーが表示されます。
それを保存し、ラムダ関数をテストします。
これに対する答えは、世界規模のアクセスがない場合です。
AWS LambdaがRDSデータベースにアクセスすることを許可する
マークの答えを繰り返す: