使用AWS CDK搭建的应用服务器无法公网访问,疑因安全组配置问题
问题排查与解决方案
核心问题分析
- 你将RDS的安全组直接绑定给了Fargate服务,这是关键错误。RDS安全组仅开放了5432端口供自身访问,完全未允许负载均衡访问Fargate任务的3000端口,导致互联网请求到达负载均衡后,无法转发到容器。
- 负载均衡配置的指向RDS安全组3000端口的出站规则毫无意义,Fargate任务需要接收来自负载均衡的入站请求,而非负载均衡主动向RDS安全组发起出站请求。
数据库安全组配置(无需改动)
你的RDS安全组配置是正确的,规则允许Multi-AZ部署下的RDS实例互相访问5432端口,默认出站规则允许所有流量,足够Fargate任务连接数据库:
const securityGroup = new ec2.SecurityGroup(this, 'RdsSecurityGroup', { vpc, securityGroupName: SECURITY_GROUP_NAME, }); securityGroup.addIngressRule(securityGroup, ec2.Port.tcp(5432));
Fargate服务安全组正确配置
需要为Fargate服务单独创建安全组,不要复用RDS的安全组:
1. 创建Fargate专用安全组
在集群栈代码中添加:
// 创建Fargate服务专属安全组 const fargateSecurityGroup = new ec2.SecurityGroup(this, 'FargateServiceSecurityGroup', { vpc, description: '允许负载均衡访问Fargate任务的3000端口', });
2. 允许负载均衡访问Fargate的3000端口
ApplicationLoadBalancedFargateService会自动创建负载均衡的安全组,我们需要让Fargate安全组允许来自该安全组的3000端口入站流量:
// 允许负载均衡安全组访问Fargate任务的3000端口 fargateSecurityGroup.addIngressRule( ec2.Peer.securityGroupId(service.loadBalancer.securityGroupId), ec2.Port.tcp(3000), 'Allow ALB to reach Fargate task on port 3000' );
3. 更新Fargate服务配置并允许访问RDS
将Fargate服务的安全组替换为新创建的专用安全组,同时给RDS安全组添加规则,允许Fargate任务访问5432端口:
const service = new ecs_patterns.ApplicationLoadBalancedFargateService(this, 'FargateService', { cluster: cluster, cpu: 1, desiredCount: 1, domainName: DOMAIN_NAME, domainZone: hostedZone, enableExecuteCommand: true, memoryLimitMiB: 1024, protocol: ApplicationProtocol.HTTPS, publicLoadBalancer: true, redirectHTTP: true, securityGroups: [fargateSecurityGroup], // 替换为Fargate专用安全组 taskDefinition: taskDefinition, }); // 允许Fargate任务访问RDS的5432端口 rdsSsecurityGroup.addIngressRule( fargateSecurityGroup, ec2.Port.tcp(5432), 'Allow Fargate tasks to connect to RDS' );
负载均衡规则修正
删除负载均衡上指向RDS安全组3000端口的出站规则,负载均衡默认的出站规则已允许所有流量,足够转发请求到Fargate任务。
验证步骤
- 部署修改后的CDK栈:
cdk deploy - 等待部署完成后,访问你的域名,确认Rails应用可正常访问
- 再次执行
aws execute-command进入容器,验证数据库连接依然正常
内容的提问来源于stack exchange,提问作者patrick
相关产品推荐
相关产品推荐

