无法将 Lambda 函数连接到 Aurora RDS
Can't connect Lambda function to Aurora RDS
我正在使用无服务器框架尝试让我的 lambda 函数将一些记录放入 'always on' Aurora RDS 实例中。到目前为止,在使用 mysql npm 包并尝试连接到 RDS 实例时,我遇到了连接超时问题。
这是我的 checked\tried:
- 将lambda函数放在serverless.yml
中的VPC中
- 在 yml
中包含与该 VPC 关联的 3 个子网
- 在servless.yml
中指定了安全组
- 已检查该服务组中是否存在允许访问服务组本身的极光路由规则
- 添加了 ec2 弹性接口 iam 角色声明
serverless.yml:
service: myrds
provider:
name: aws
runtime: nodejs10.x
stage: ${opt:stage, 'dev'}
region: ${opt:region, 'us-east-2'}
iamRoleStatements:
- Effect: "Allow"
Action:
- "ec2:CreateNetworkInterface"
- "ec2:DescribeNetworkInterfaces"
- "ec2:DeleteNetworkInterface"
Resource: "*"
- Effect: "Allow"
Action:
- "sqs:SendMessage"
- "sqs:GetQueueUrl"
- "sqs:ListQueues"
Resource:
Fn::GetAtt:
- RDSQueue
- Arn
- Effect: "Allow"
Action:
- "sqs:SendMessage"
- "sqs:GetQueueUrl"
- "sqs:ListQueues"
Resource:
Fn::GetAtt:
- DeadLetterQueue
- Arn
functions:
consumer:
handler: handler.consumer
timeout: 20
vpc:
securityGroupIds:
- sg-123456
subnetIds:
- subnet-11111
- subnet-22222
- subnet-33333
events:
- sqs:
arn:
Fn::GetAtt:
- RDSQueue
- Arn
environment:
NODE_ENV: ${opt:stage, 'dev'}
resources:
Resources:
RDSQueue:
Type: 'AWS::SQS::Queue'
Properties:
QueueName: "RDSQueue-${opt:stage, 'dev'}"
RedrivePolicy:
deadLetterTargetArn:
"Fn::GetAtt":
- DeadLetterQueue
- Arn
maxReceiveCount: 3
DeadLetterQueue:
Type: 'AWS::SQS::Queue'
Properties:
QueueName: "DeadLetterQueue-${opt:stage, 'dev'}"
我在这里错过了什么?从 SQS 队列触发时连接超时。
从 AWS Lambda 函数连接到 Amazon RDS 数据库时的典型配置是:
- Lambda 函数连接到 VPC 中的私有子网
- Lambda 函数 (
Lambda-SG
) 上的安全组,允许所有出站访问
- RDS 数据库 (
RDS-SG
) 上的安全组,其入站规则允许来自 Lambda-SG
的适当端口(例如 3306)上的流量
即RDS-SG
入站规则中具体引用Lambda-SG
如果Lambda函数也需要连接到Internet,那么VPC的public子网中就需要有一个NAT网关。
我正在使用无服务器框架尝试让我的 lambda 函数将一些记录放入 'always on' Aurora RDS 实例中。到目前为止,在使用 mysql npm 包并尝试连接到 RDS 实例时,我遇到了连接超时问题。
这是我的 checked\tried:
- 将lambda函数放在serverless.yml 中的VPC中
- 在 yml 中包含与该 VPC 关联的 3 个子网
- 在servless.yml 中指定了安全组
- 已检查该服务组中是否存在允许访问服务组本身的极光路由规则
- 添加了 ec2 弹性接口 iam 角色声明
serverless.yml:
service: myrds
provider:
name: aws
runtime: nodejs10.x
stage: ${opt:stage, 'dev'}
region: ${opt:region, 'us-east-2'}
iamRoleStatements:
- Effect: "Allow"
Action:
- "ec2:CreateNetworkInterface"
- "ec2:DescribeNetworkInterfaces"
- "ec2:DeleteNetworkInterface"
Resource: "*"
- Effect: "Allow"
Action:
- "sqs:SendMessage"
- "sqs:GetQueueUrl"
- "sqs:ListQueues"
Resource:
Fn::GetAtt:
- RDSQueue
- Arn
- Effect: "Allow"
Action:
- "sqs:SendMessage"
- "sqs:GetQueueUrl"
- "sqs:ListQueues"
Resource:
Fn::GetAtt:
- DeadLetterQueue
- Arn
functions:
consumer:
handler: handler.consumer
timeout: 20
vpc:
securityGroupIds:
- sg-123456
subnetIds:
- subnet-11111
- subnet-22222
- subnet-33333
events:
- sqs:
arn:
Fn::GetAtt:
- RDSQueue
- Arn
environment:
NODE_ENV: ${opt:stage, 'dev'}
resources:
Resources:
RDSQueue:
Type: 'AWS::SQS::Queue'
Properties:
QueueName: "RDSQueue-${opt:stage, 'dev'}"
RedrivePolicy:
deadLetterTargetArn:
"Fn::GetAtt":
- DeadLetterQueue
- Arn
maxReceiveCount: 3
DeadLetterQueue:
Type: 'AWS::SQS::Queue'
Properties:
QueueName: "DeadLetterQueue-${opt:stage, 'dev'}"
我在这里错过了什么?从 SQS 队列触发时连接超时。
从 AWS Lambda 函数连接到 Amazon RDS 数据库时的典型配置是:
- Lambda 函数连接到 VPC 中的私有子网
- Lambda 函数 (
Lambda-SG
) 上的安全组,允许所有出站访问 - RDS 数据库 (
RDS-SG
) 上的安全组,其入站规则允许来自Lambda-SG
的适当端口(例如 3306)上的流量
即RDS-SG
入站规则中具体引用Lambda-SG
如果Lambda函数也需要连接到Internet,那么VPC的public子网中就需要有一个NAT网关。