问题
I created an AWS Lambda function that:
- logs onto Redshift via JDBC URL
- runs a query
Locally, using Node, I can successfully connect to the Redshift instance via JDBC, and execute a query.
var conString = "postgresql://USER_NAME:PASSWORD@JDBC_URL”;
var client = new pg.Client(conString);
client.connect(function(err) {
if(err) {
console.log('could not connect to redshift', err);
}
// omitted due to above error
However, when I execute the function on AWS Lambda (where it's wrapped in a async#waterfall block), AWS Cloudwatch logs tells me that the AWS Lambda function timed out after 60 seconds.
Any ideas on why my function is not able to connect?
回答1:
I find it's either you open your Redshift security group public to all sources, or none. Because a Lambda function isn't running on a fixed address or even a fixed range of IP addresses, which is completely transparent to users (AKA server-less).
I just saw Amazon announced the new Lambda feature to support VPC yesterday. I guess if we can run a Redshift cluster in a VPC, this could solve the problem.
回答2:
If you are using serverless-framework v1.5.0, you should add:
iamRoleStatements:
- Effect: Allow
Action:
- ec2:CreateNetworkInterface
Resource: '*'
- Effect: Allow
Action:
- ec2:DeleteNetworkInterface
- ec2:DescribeNetworkInterfaces
Resource: 'arn:aws:ec2:${self:provider.region}:*:network-interface/*'
Also should add all securityGroupIds to Inbounds Rules, like below:

More info: https://serverless.com/framework/docs/providers/aws/guide/functions/#vpc-configuration
来源:https://stackoverflow.com/questions/28265020/conecting-aws-lambda-to-redshift-times-out-after-60-seconds