You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:29:58