我正在尝试在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
:
这是我的负载平衡器的安全组的入站规则配置,名为,
ecs-alb-sg
:
然后我构建了我的应用程序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
# 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任务定义:
环境:
我使用上面屏幕截图中提到的设置创建了任务定义。
之后,我为Fargate创建了一个ECS集群(在默认的VPC内)。我只是输入了集群的名称,
noderestapi-cluster
。
然后,我按照下面提到的步骤为集群创建了服务。
我单击了“创建”按钮:
然后我选择了Fargate作为启动类型:
然后在部署配置部分下,我选择了我创建的任务定义:
在网络部分,我选择了我为任务创建的安全组,
ecs任务sg
。
然后在负载均衡器下,我选择创建一个新的应用程序负载均衡器:
然后我创建了服务。几分钟后,服务完全创建完成。
创建服务后,我转到负载平衡器以更正我的负载平衡器的安全组。它被分配了ECS任务的安全组。因此,我分配了我之前为负载均衡器创建的正确的一个,
ecs-alb-sg
。然后我打开了负载均衡器的DNS,得到了503错误。然后我查看了我的云服务器集群,发现服务很难启动任务。
我的配置有什么问题,我该如何修复?
同样在CloudWatch中,我收到了这个错误。
exec /usr/local/bin/docker-entrypoint.sh: exec format error