在AWS ECS Fargate部署NestJS+MongoDB应用的连接问题求助
NestJS+MongoDB部署AWS ECS Fargate问题排查与解决
问题现象
- 本地通过Docker Compose运行dev和prod构建版本均正常
- 已将应用和Mongo镜像推送至AWS ECR,创建包含两个容器的ECS任务,安全组已开放对应端口
- 任务运行后:
- 可通过公网IP连接MongoDB
- 无法连接应用服务
- 应用容器日志报
hostname not found错误,无法连接MongoDB
相关配置文件
Dockerfile
################### # BUILD FOR LOCAL DEVELOPMENT ################### FROM node:18-alpine As development WORKDIR /usr/src/app COPY --chown=node:node package*.json ./ RUN npm ci COPY --chown=node:node . . USER node ################### # BUILD FOR PRODUCTION ################### FROM node:18-alpine As build WORKDIR /usr/src/app COPY --chown=node:node package*.json ./ COPY --chown=node:node --from=development /usr/src/app/node_modules ./node_modules COPY --chown=node:node . . RUN npm run build ENV NODE_ENV production RUN npm ci --only=production && npm cache clean --force USER node ################### # PRODUCTION ################### FROM node:18-alpine As production WORKDIR /usr/src/app COPY --chown=node:node --from=build /usr/src/app/node_modules ./node_modules COPY --chown=node:node --from=build /usr/src/app/dist ./dist CMD ["node", "dist/main.js"]
Docker Compose配置
version: '3.8' services: dev: container_name: animals_api_dev image: animals-api-dev:1.0.0 build: context: . target: development dockerfile: ./Dockerfile command: npm run start:debug ports: - ${SERVER_PORT}:${SERVER_PORT} environment: - MONGO_HOST=${MONGO_HOST} - MONGO_PORT=${MONGO_PORT} - MONGO_USERNAME=${MONGO_USERNAME} - MONGO_PASSWORD=${MONGO_PASSWORD} networks: - animals-api-network depends_on: - mongo-database - mongo-express - redis volumes: - .:/usr/src/app restart: unless-stopped prod: container_name: animals_api_prod image: animals-api-prod:1.00 build: context: . target: production dockerfile: ./Dockerfile command: npm run start:prod environment: - MONGO_HOST=${MONGO_HOST} - MONGO_PORT=${MONGO_PORT} - MONGO_USERNAME=${MONGO_USERNAME} - MONGO_PASSWORD=${MONGO_PASSWORD} ports: - ${SERVER_PORT}:${SERVER_PORT} networks: - animals-api-network depends_on: - mongo-database - redis volumes: - ./:/usr/src/app restart: unless-stopped mongo-database: container_name: animals-mongo-db image: mongo:latest restart: always ports: - 27018:${MONGO_PORT} environment: - MONGO_INITDB_ROOT_USERNAME=${MONGO_USERNAME} - MONGO_INITDB_ROOT_PASSWORD=${MONGO_PASSWORD} volumes: - mongo-data:/data/db networks: - animals-api-network mongo-express: container_name: animals-mongo-express image: mongo-express:latest ports: - ${MONGO_EXPRESS_PORT}:${MONGO_EXPRESS_PORT} environment: - ME_CONFIG_MONGODB_ADMINUSERNAME=${MONGO_USERNAME} - ME_CONFIG_MONGODB_ADMINPASSWORD=${MONGO_PASSWORD} - ME_CONFIG_MONGODB_SERVER=animals-mongo-db depends_on: - mongo-database networks: - animals-api-network restart: unless-stopped redis: image: redis:latest container_name: redis-cache ports: - ${REDIS_PORT}:${REDIS_PORT} volumes: - redis:/data networks: - animals-api-network networks: animals-api-network: driver: bridge volumes: mongo-data: redis:
排查与解决步骤
1. 解决应用连接Mongo的hostname not found问题
本地Docker Compose中,容器通过自定义网络的DNS解析容器名(animals-mongo-db)通信,但AWS ECS Fargate同一任务内的容器共享同一个网络命名空间,没有Docker容器名DNS解析服务:
- 修改应用容器的环境变量
MONGO_HOST为localhost - 确认Mongo容器在任务定义中暴露的端口与应用配置的
MONGO_PORT一致(同一网络命名空间内无需端口映射,直接通过端口访问)
2. 解决无法访问应用服务的问题
- 检查ECS任务定义:确认应用容器的端口映射配置,将容器端口(即
SERVER_PORT)添加到任务的“端口映射”中,绑定到Fargate ENI的对应端口 - 验证安全组规则:确保安全组不仅开放Mongo的端口,同时开放应用服务的
SERVER_PORT,允许外部访问(如0.0.0.0/0或指定IP段) - 查看应用容器日志:确认应用是否正常启动,是否存在端口监听失败的错误(如端口被占用、
SERVER_PORT配置错误)
3. 额外注意事项
- 任务内容器启动顺序:Fargate不支持
depends_on的启动依赖,建议在应用代码中添加Mongo连接重试逻辑,避免Mongo未就绪时应用启动失败 - 生产环境优化:建议将MongoDB部署为独立ECS服务或使用AWS DocumentDB,而非与应用容器放在同一任务中,提升可用性和扩展性
内容的提问来源于stack exchange,提问作者megabolo
相关产品推荐
相关产品推荐

