代码之家  ›  专栏  ›  技术社区  ›  Wai Yan Hein

AWS ECS服务无法与运行在3000端口上的Node js Express应用程序容器一起完成任务

  •  1
  • Wai Yan Hein  · 技术社区  · 1 年前

    我正在尝试在AWS弹性容器服务上部署一个简单的Node Express应用程序。我的应用程序非常简单,只有一个名为app.js的js文件,代码如下。

    const express = require('express');
    const app = express();
    const port = 3000;
    
    app.get('/', (req, res) => res.send('Hello World!'));
    
    app.get('/health', (req, res) => res.send('OK'));
    
    app.listen(port, () => console.log(`Example app listening on port ${port}!`));
    

    在做任何事情之前,我创建了两个安全组,一个用于我的ECS任务,另一个用于应用程序负载均衡器,因为我将使用负载均衡器来执行我的ECS工作。

    这是我的安全组对ECS任务的入站规则配置, ecs-task-sg :

    enter image description here

    这是我的负载平衡器的安全组的入站规则配置,名为, ecs-alb-sg :

    enter image description here

    然后我构建了我的应用程序docker镜像,并将其推送到ECR存储库。这是我的Dockerfile:

    FROM node:16-alpine
    
    # Create app directory
    WORKDIR /usr/src/app
    
    # Install app dependencies
    # A wildcard is used to ensure both package.json AND package-lock.json are copied
    # where available (npm@5+)
    COPY package*.json ./
    
    RUN npm install
    # If you are building your code for production
    # RUN npm ci --omit=dev
    
    # Bundle app source
    COPY . .
    
    EXPOSE 3000
    CMD [ "node", "app.js" ]
    

    我运行以下命令在本地构建了映像:

    • docker build -f Dockerfile -t noderestapi . 然后我在本地运行该应用程序,检查是否一切正常
    • docker run -d -p 3000:3000 --name noderestapi noderestapi 一切都很好,我可以看到应用程序正在localhost:3000上运行。

    然后我创建了一个ECR存储库来存储我的图像。我还通过我的机器向ECR进行了身份验证。存储库是私有的,并且启用了标记不变性。

    然后,我通过运行以下命令标记了图像:

    • docker tag noderestapi:latest 1234556677.dkr.ecr.eu-west-2.amazonaws.com/noderestapi:v1

    然后我将图像推送到ECR存储库:

    • docker push 1234556677.dkr.ecr.eu-west-2.amazonaws.com/noderestapi:v1

    一切如预期。我可以在ECR存储库中看到该图像。

    然后我开始配置弹性容器服务来启动我的应用程序。

    首先,我按照以下步骤创建了ECS任务定义:

    enter image description here

    环境:

    enter image description here

    我使用上面屏幕截图中提到的设置创建了任务定义。

    之后,我为Fargate创建了一个ECS集群(在默认的VPC内)。我只是输入了集群的名称, noderestapi-cluster

    然后,我按照下面提到的步骤为集群创建了服务。

    我单击了“创建”按钮:

    enter image description here

    然后我选择了Fargate作为启动类型:

    enter image description here

    然后在部署配置部分下,我选择了我创建的任务定义:

    enter image description here

    在网络部分,我选择了我为任务创建的安全组, ecs任务sg

    然后在负载均衡器下,我选择创建一个新的应用程序负载均衡器:

    enter image description here

    enter image description here

    然后我创建了服务。几分钟后,服务完全创建完成。

    创建服务后,我转到负载平衡器以更正我的负载平衡器的安全组。它被分配了ECS任务的安全组。因此,我分配了我之前为负载均衡器创建的正确的一个, ecs-alb-sg 。然后我打开了负载均衡器的DNS,得到了503错误。然后我查看了我的云服务器集群,发现服务很难启动任务。

    enter image description here

    enter image description here

    我的配置有什么问题,我该如何修复?

    同样在CloudWatch中,我收到了这个错误。

    exec /usr/local/bin/docker-entrypoint.sh: exec format error
    
    0 回复  |  直到 1 年前
        1
  •  0
  •   Mark B    1 年前

    您在负载平衡器设置中选择的容器是 noderestapi 80:80 。这看起来不对。应该是port 3000 在上面,而不是端口 80

    此外,您显示的创建容器的屏幕截图具有名称 nodeapi noderestapi

    看起来您创建了另一个配置为使用端口的容器或任务定义 80 而不是 3000 。但是,如果不同时更改docker图像中的设置,这将永远不会起作用。

    我建议将任务定义端口编辑为 3000 ,并编辑目标组以将通信端口和健康检查端口更改为 3000 ,以匹配容器实际侦听的端口。只有负载平衡器侦听器应该使用端口 80 其他一切(任务定义、目标组等)都应该反映容器正在侦听的实际端口。