我正在使用无服务器框架来尝试让我的lambda函数将一些记录扔到"始终在线"的Aurora RDS实例中。到目前为止,我在使用 mysql npm 包并尝试连接到 RDS 实例时遇到了连接超时。
这是我检查\尝试过的:
- 将 lambda 函数放在 VPC 中的无服务器 .yml 中
- 在 YML 中包含与该 VPC 关联的 3 个子网
- 在 servless.yml 中指定安全组
- 已检查该服务组中是否存在允许访问服务组本身的 Aurora 路由规则
- 添加了 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 数据库时的典型配置为:
- 连接到 VPC 中的私有子网的 Lambda 函数
- Lambda 函数 (
Lambda-SG
( 上的安全组,允许所有出站访问 - RDS 数据库 (
RDS-SG
( 上的安全组,其入站规则允许来自Lambda-SG
的相应端口(例如 3306(上的流量
也就是说,RDS-SG
在入站规则中专门引用Lambda-SG
。
如果 Lambda 函数还需要连接到互联网,则 VPC 的公有子网中需要有一个 NAT 网关。