Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AWS Lambda无法连接到RDS实例,但我可以在本地连接?_Javascript_Amazon Web Services_Amazon Rds_Aws Lambda_Amazon Kinesis - Fatal编程技术网

Javascript AWS Lambda无法连接到RDS实例,但我可以在本地连接?

Javascript AWS Lambda无法连接到RDS实例,但我可以在本地连接?,javascript,amazon-web-services,amazon-rds,aws-lambda,amazon-kinesis,Javascript,Amazon Web Services,Amazon Rds,Aws Lambda,Amazon Kinesis,我正在尝试从lambda连接到我的RDS实例。我在本地编写了lambda,并在本地进行了测试,一切都很顺利。我部署到lambda,突然它不工作了。下面是我正在运行的代码,如果有帮助的话,我将通过kinesis流调用lambda 'use strict'; exports.handler = (event, context, handlerCallback) => { console.log('Recieved request for kinesis events!');

我正在尝试从lambda连接到我的RDS实例。我在本地编写了lambda,并在本地进行了测试,一切都很顺利。我部署到lambda,突然它不工作了。下面是我正在运行的代码,如果有帮助的话,我将通过kinesis流调用lambda

'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());
};
以下是cloud watch的日志(如果有帮助):

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的评论是正确的,这是一个安全组问题


我最终得到了AWS支持部门的回复,指出RDS安全组确实是特定IP的私有组。这没有意义,因为我从未配置过,我可以从本地机器和elastic beanstalk访问数据库。我向安全组添加了0.0.0.0/0,现在lambda可以连接了。谢谢你们的帮助,伙计们

下面是我如何解决这个问题的

创建DB实例时,会要求您选择VPC。即使选择默认值,它也会将系统的公共IP作为默认入站IP。另一方面,Lambda函数有自己的IP设置。这就是为什么您可以通过任何IDE或本地访问,但不能通过lambda函数

要添加Ip限制,请执行以下操作:

转到实例的安全组。选择默认安全组后,单击它。在新页面中,向下滚动以查找入站和出站设置

在入站设置中,单击编辑。您可以在这里更改IP。0.0.0.0/0使其向世界开放

如果在这里添加公共IP,则IDE或本地连接可以工作

要使lambda函数工作,请添加lambda函数的IP。 转到Lambda功能,网络->专有网络->如果未选择专有网络,请选择与DB功能相同的专有网络,并在此处记录IP

在入站设置中键入此IP,这将显示自动填充


保存并测试lambda功能。

以下是答案,无需全球访问

重复马克的回答:

将vpc访问添加到lambda功能 为lambda创建新的安全组 将RDS安全组添加到lambda的SG。
您是否为Lambda功能启用了VPC访问?@MarkB nope。我将下拉列表设置为No VPCSo您已在您的RDS实例上启用公开访问,并且您已将RDS实例的安全组向世界开放?@MarkB是的,我可以直接从我的笔记本电脑访问RDS。整个lambda在我的本地机器上运行得非常好。20秒似乎足够了,但是如果你将lambda超时临时增加到60秒,它会工作吗?喂,你能详细说明一下吗?您将0.0.0.0/0添加到了何处以及添加到了何处?但将0.0.0.0/0添加到安全组中的入站意味着打开与世界的连接。你不怕吗?@Nativ这是为了开发和测试。后来它被锁定到正确的安全组。是的,打开与世界的连接对于生产使用来说不是一个好主意。那么,您最终是否将lambda添加到VPC?@LordZardeck AWS会在创建RDS实例时自动将您的公共IP配置为安全组中的入站IP。这就是为什么代码在你的机器上运行,而不是在其他地方。我也是这样如果我将publiccessable设置为true,这是否适用?您是一个救生员。谢谢!这给答案增加了什么?我更喜欢这个答案,因为第一个答案向世界打开了你的RDS实例,而第二个答案不起作用,或者至少对我来说不起作用。这是一个优雅和良好的参考。