ECS Fargate部署的Mongo Express公网8081端口无法访问求助
我基于ECS Fargate搭建了一套包含Java(Spring Boot)后端和Mongo Express的简单应用栈。MongoDB部署在独立主机上,Fargate栈可正常访问该数据库,启动日志显示Java后端与Mongo Express均成功连接数据库。我已在安全组(SG)中配置了入站规则,开放了Java应用的8080端口和Mongo Express的8081端口。
但目前仅能通过http://<public_ip>:8080访问Java应用,尝试连接Mongo Express的8081端口时出现连接挂起的情况。
我是否需要配置反向代理(如Nginx)来路由Mongo Express的网络请求?据我所知,只要应用实现了路由机制(如Express服务器),无需Nginx即可直接访问对应端口(此处为8081)。我对Mongo Express和Node.js了解不多,但从文档得知它依赖Node.js运行。
请问为何无法通过http://<public_ip>:8081访问Mongo Express?希望能得到排查线索。
任务定义
{ "family": "service-connect-backend-task", "executionRoleArn": "*************************", "taskRoleArn": "************************", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "java", "image": "********************************", "cpu": 256, "memory": 512, "portMappings": [ { "name": "java-8080", "containerPort": 8080, "protocol": "tcp", "appProtocol": "http" } ], "essential": true, "environment": [ { "name": "DB_HOST", "value": "****************" }, { "name": "SPRING_ACTIVE_PROFILE", "value": "develop" } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "/ecs/service-connect-java-backend", "awslogs-region": "********", "awslogs-stream-prefix": "java" } }, "healthCheck": { "command": [ "CMD-SHELL", "echo HealthOk" ], "interval": 5, "timeout": 2, "retries": 3, "startPeriod": 10 } }, { "name": "mongo-express", "image": "mongo-express", "cpu": 256, "memory": 512, "portMappings": [ { "name": "mongoexpress-8081", "containerPort": 8081, "protocol": "tcp", "appProtocol": "http" } ], "essential": true, "environment": [ { "name": "ME_CONFIG_BASICAUTH_PASSWORD", "value": "****************" }, { "name": "ME_CONFIG_MONGODB_AUTH_USERNAME", "value": " ****************" }, { "name": "ME_CONFIG_MONGODB_SERVER", "value": "****************" }, { "name": "ME_CONFIG_BASICAUTH_USERNAME", "value": "****************" }, { "name": "ME_CONFIG_MONGODB_AUTH_PASSWORD", "value": "****************" }, { "name": "ME_CONFIG_MONGODB_AUTH_DATABASE", "value": "admin" } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "/ecs/service-connect-mongo-express", "awslogs-region": "******", "awslogs-stream-prefix": "mongo-express" } } } ], "cpu": "512", "memory": "1024" }
服务定义
{ "cluster": "ce-develop-cluster", "deploymentConfiguration": { "maximumPercent": 200, "minimumHealthyPercent": 100 }, "deploymentController": { "type": "ECS" }, "desiredCount": 1, "enableECSManagedTags": true, "enableExecuteCommand": true, "launchType": "FARGATE", "networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "****************" ], "subnets": [ "****************" ] } }, "platformVersion": "LATEST", "propagateTags": "SERVICE", "serviceName": "service-connect-backend-service", "serviceConnectConfiguration": { "enabled": true, "services": [ { "portName": "java-8080", "clientAliases": [ { "dnsName": "backend", "port": 80 } ] }, { "portName": "mongoexpress-8081", "clientAliases": [ { "dnsName": "mongo-express", "port": 81 } ] } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "/ecs/service-connect-backend-proxy", "awslogs-region": "********", "awslogs-stream-prefix": "service-connect-backend-proxy" } } }, "taskDefinition": "service-connect-backend-task" }
补充说明
- 使用ECS Service Connect是为了未来在栈中添加更多应用(如React客户端),使其能通过Service Connect命名空间与后端通信,但不确定这是否会影响从公网直接访问容器。
- 已禁用Service Connect并更新服务,但问题仍未解决。
以下是针对该问题的具体排查方向:
验证Mongo Express容器的端口监听情况
用ECS Exec进入Mongo Express容器,执行netstat -tulpn或ss -tulpn命令,确认容器内8081端口是否被Node.js进程监听。如果端口未监听,说明Mongo Express启动异常,检查容器日志中是否有启动报错(比如环境变量配置错误、依赖缺失)。检查任务网络端口映射是否生效
在ECS控制台查看任务详情,确认Mongo Express的端口映射是否已正确关联到任务的弹性网络接口(ENI)。Fargate使用awsvpc模式时,容器端口会直接绑定到任务的ENI上,需确保映射的端口在ENI上可见。重新确认安全组和网络ACL规则
安全组入站规则需确认:- 允许0.0.0.0/0或你的公网IP段访问8081端口(TCP协议)
- 安全组已正确关联到Fargate任务的ENI
同时检查子网对应的网络ACL,确保入站规则允许8081端口流量,出站规则允许容器的响应流量(比如临时端口范围)。
检查Mongo Express的绑定地址配置
默认情况下Mongo Express绑定localhost,这会导致仅容器内部可访问,无法通过ENI访问。需设置环境变量ME_CONFIG_SERVER_ADDR=0.0.0.0,让服务绑定到所有网卡地址。从你的任务定义看,未配置该变量,这很可能是问题所在。测试任务内部访问Mongo Express
通过ECS Exec进入Java容器,执行curl http://localhost:8081,如果能正常返回响应,说明容器内服务正常,但公网流量无法到达;如果也无法访问,说明容器内服务本身未正常启动或监听端口错误。确认公网IP是否正确
确保你访问的是Fargate任务的公网IP,而不是集群或服务的其他IP。在ECS控制台任务详情中可以查看任务的公网IP地址。
内容的提问来源于stack exchange,提问作者wr93_

