如何通过Serverless Framework创建Lambda和公网均可访问的RDS实例
问题根因
你当前的配置缺失3个核心部分:
- RDS未绑定VPC子网组和专属安全组,公网访问、VPC内访问的端口规则未放行
- Lambda未配置VPC访问权限,无法访问VPC内的RDS资源
- 缺少Lambda访问VPC资源所需的IAM权限
修改后的完整配置片段
service: myapp provider: name: aws runtime: provided.al2 lambdaHashingVersion: 20201221 # 新增:Lambda访问VPC资源所需的官方托管权限 iam: managedPolicies: - arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole # 新增:Lambda绑定的VPC配置,和RDS同子网 vpc: subnetIds: - <替换为你的VPC公有子网ID1> - <替换为你的VPC公有子网ID2> securityGroupIds: - !Ref LambdaSecurityGroup functions: console: handler: bin/console timeout: 120 # in seconds layers: - ${bref:layer.php-80} # PHP - ${bref:layer.console} # The "console" layer resources: Resources: # 新增:Lambda专用安全组 LambdaSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Security group for Lambda functions to access RDS VpcId: <替换为你的VPC ID> # 新增:RDS专用安全组 RDSSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Security group for RDS instance VpcId: <替换为你的VPC ID> SecurityGroupIngress: # 规则1:放行Lambda安全组访问RDS的3306端口 - IpProtocol: tcp FromPort: 3306 ToPort: 3306 SourceSecurityGroupId: !Ref LambdaSecurityGroup # 规则2:放行本地公网IP访问RDS的3306端口 - IpProtocol: tcp FromPort: 3306 ToPort: 3306 CidrIp: <替换为你的本地公网IP,格式如111.222.333.444/32> # 新增:RDS子网组,RDS强制要求绑定至少两个跨可用区的子网 RDSSubnetGroup: Type: AWS::RDS::DBSubnetGroup Properties: DBSubnetGroupDescription: Subnet group for RDS instance SubnetIds: - <替换为你的VPC公有子网ID1> - <替换为你的VPC公有子网ID2> # RDS实例(新增两项配置) ProductDatabase: Type: AWS::RDS::DBInstance Properties: AllocatedStorage: 5 DBInstanceClass: db.t3.micro DBName: myapp Engine: mysql EngineVersion: 8.0.25 MasterUsername: myappuser MasterUserPassword: redacted PubliclyAccessible: true # 新增:关联RDS子网组 DBSubnetGroupName: !Ref RDSSubnetGroup # 新增:关联RDS安全组 VPCSecurityGroups: - !Ref RDSSecurityGroup
配置说明
- 所有带
< >的占位符需要替换为你AWS账号对应区域的实际资源ID,VPC、子网ID可在AWS控制台VPC服务页面查询,本地公网IP可直接搜索「我的IP」获取 - 测试阶段如果临时需要放开所有公网访问,可以把RDSSecurityGroup的第二个入站规则的CidrIp设为
0.0.0.0/0,生产环境务必关闭该配置,避免数据库暴露风险 - 生产环境建议不要硬写数据库密码,可通过AWS Secrets Manager存储,配置时用
!Ref引用对应的密钥资源即可
内容的提问来源于stack exchange,提问作者amacrobert
相关产品推荐
相关产品推荐

