端到端 AWS DevOps 项目:使用 GitLab CI/CD 自动构建 Node.js 应用程序并将其部署到 Amazon ECS
目录
- 介绍
- 项目概述
- 技术堆栈
- 架构图
- 步骤 1:先决条件
- 步骤 2:配置 GitLab 作为版本控制
- 步骤 3:准备 AWS 资源
- 步骤 4:构建并推送 Docker 镜像
- 步骤 5:使用 Fargate 设置 Amazon ECS
- 步骤 6:创建 GitLab CI/CD 管道
- 步骤 7:使用 AWS CloudWatch 添加监控
- 结论
介绍
在此项目中,我们将创建一个自动化管道,用于构建 Node.js 应用程序并将其部署到 Amazon ECS。该项目展示了如何使用 GitLab 进行版本控制、使用 Docker 进行容器化,以及使用 ECS、ECR 和 CodePipeline 等 AWS 服务进行编排和部署。
在本指南结束时,您将全面了解 AWS 中的 CI/CD 工作流程,这对于现代 DevOps 实践至关重要。
项目概述
客观的
我们将自动执行以下任务:
- 构建 Node.js 应用程序。
- 使用 Docker 将应用程序容器化。
- 将 Docker 镜像推送到 Amazon ECR。
- 使用 Fargate 将容器部署到 Amazon ECS。
- 使用 GitLab CI/CD 进行持续集成和部署。
- 使用 AWS CloudWatch 和 SNS 添加监控和通知。
技术堆栈
-
AWS 服务:
- Amazon ECS(弹性容器服务)
- Amazon ECR(弹性容器注册表)
- AWS CodePipeline
- AWS 安全中心
- 亚马逊 EventBridge
- 亚马逊SNS
- AWS CloudWatch
-
其他工具:
- GitLab:源代码管理和 CI/CD 管道。
- Docker:应用程序容器化。
- Node.js:示例 Web 应用程序框架。
架构图
该项目的高层架构如下:
- 开发人员将代码推送到 GitLab。
- GitLab CI/CD 管道构建并将 Docker 镜像推送到 Amazon ECR。
- 该图像已部署到 Amazon ECS(Fargate)。
- 使用 AWS CloudWatch 完成监控和日志记录。
- 通知使用 Amazon SNS 发送。
步骤 1:先决条件
开始之前请确保已进行以下设置:
- AWS 账户:具有 ECS、ECR 和 CodePipeline 的管理员访问权限。
- GitLab 帐户:使用为 Node.js 应用程序创建的存储库。
- 已安装 AWS CLI:用于从命令行与 AWS 服务交互。
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
aws --version
- Docker 安装:用于构建容器镜像。
sudo apt update
sudo apt install docker.io
docker --version
- kubectl 已安装:与 Amazon ECS 集群交互。
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
步骤 2:配置 GitLab 作为版本控制
由于您正在使用现有的 GitLab 存储库,请按照以下步骤克隆并在项目中使用它:
2.1:分叉存储库
- 在 GitLab 中打开存储库:Nanuchi Node.js App。
- 单击Fork即可在您的 GitLab 帐户下创建副本。
2.2:克隆存储库
- 分叉后,将其克隆到本地机器:
git clone https://gitlab.com/<your-username>/node-app.git
cd node-app
- 验证存储库是否包含以下内容:
- 应用程序代码(Node.js):
server.js
package.json
- 用于容器化的Dockerfile。
.gitlab-ci.yml
用于 CI/CD 管道(我们稍后会修改它)。
- 应用程序代码(Node.js):
2.3:推送更新(可选)
如果您想对存储库进行更改(例如,更新代码,添加更多文件),请将更新推回:
git add .
git commit -m "Updated application for CI/CD project"
git push origin main
步骤 3:准备 AWS 资源
此步骤基本保持不变,但现在它与您正在部署的 Node.js 应用程序保持一致。
3.1:创建 Amazon ECR 存储库
创建一个私有 ECR 存储库来存储应用程序的 Docker 镜像:
aws ecr create-repository --repository-name node-app
3.2:使用 ECR 对 Docker 进行身份验证
使用 ECR 注册表验证您的本地 Docker 客户端:
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account_id>.dkr.ecr.<region>.amazonaws.com
3.3:创建 ECS 集群
创建用于运行应用程序容器的 ECS 集群:
aws ecs create-cluster --cluster-name node-app-cluster
3.4:IAM 角色、VPC 和安全组
按照前面概述的步骤进行操作:
- 创建IAM 任务执行角色。
- 设置VPC、子网和安全组。
3000
在安全组中打开端口以用于应用程序流量。
步骤 4:构建并推送 Docker 镜像
使用克隆的 GitLab 应用程序,构建并推送 Docker 镜像。
4.1:构建Docker镜像
导航到存储库的根目录并构建图像:
docker build -t node-app .
4.2:标记 Docker 镜像
为您的 ECR 存储库标记图像:
docker tag node-app:latest <account_id>.dkr.ecr.<region>.amazonaws.com/node-app:latest
4.3:将图像推送到 ECR
将图像推送到您的 Amazon ECR 存储库:
docker push <account_id>.dkr.ecr.<region>.amazonaws.com/node-app:latest
4.4:验证图像
确认镜像已经推送成功:
aws ecr list-images --repository-name node-app
步骤 5:使用 Fargate 设置 Amazon ECS
Amazon ECS(弹性容器服务)是一项托管服务,可用于运行容器。我们使用Fargate,这是一种无服务器方案,无需手动管理 EC2 实例。以下是为我们的项目设置 ECS 的详细步骤:
5.1:创建集群
集群是运行任务或服务所需的资源的逻辑分组。
- 运行以下命令创建集群:
aws ecs create-cluster --cluster-name node-app-cluster
此命令创建一个名为 的新集群node-app-cluster
。
- 验证集群:
aws ecs list-clusters
确保node-app-cluster
被列为集群之一。
5.2:定义任务定义
任务定义指定运行应用程序所需的容器设置(例如内存、CPU、端口)。您可以将其视为容器化应用程序的蓝图。
- 创建
task-def.json
文件:
{
"family": "node-app-task",
"executionRoleArn": "arn:aws:iam::account_id:role/ecsTaskExecutionRole",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "node-app-container",
"image": "<account_id>.dkr.ecr.<region>.amazonaws.com/node-app:latest",
"memory": 512,
"cpu": 256,
"essential": true,
"portMappings": [
{
"containerPort": 3000,
"hostPort": 3000,
"protocol": "tcp"
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/node-app",
"awslogs-region": "<region>",
"awslogs-stream-prefix": "ecs"
}
}
}
],
"requiresCompatibilities": ["FARGATE"],
"cpu": "256",
"memory": "512"
}
- 将
<account_id>
和替换<region>
为您的 AWS 账户 ID 和区域。 - 确保
executionRoleArn
指向有效的 ECS 任务执行角色。
- 向 ECS 注册任务定义:
aws ecs register-task-definition --cli-input-json file://task-def.json
这会将蓝图注册到 ECS。
5.3:创建服务来管理任务
ECS 服务确保所需数量的任务正在运行并为任务实现负载平衡。
- 创建服务:
aws ecs create-service \
--cluster node-app-cluster \
--service-name node-app-service \
--task-definition node-app-task \
--desired-count 1 \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[subnet-xxx],securityGroups=[sg-xxx],assignPublicIp=ENABLED}" \
--region <region>
- 将
subnet-xxx
和替换sg-xxx
为您的 VPC 的公共子网和安全组的 ID。 desired-count
是要运行的任务数。
- 验证服务:
aws ecs describe-services --cluster node-app-cluster --services node-app-service
确保服务处于活动状态并正在运行。
5.4:测试应用程序
- 找到你的任务的公共IP:
aws ecs list-tasks --cluster node-app-cluster
使用任务ID描述任务,并找到公网IP地址:
aws ecs describe-tasks --cluster node-app-cluster --tasks <task_id>
- 使用公共 IP 在浏览器中访问您的应用程序:
http://<public_ip>:3000
步骤 6:创建 GitLab CI/CD 管道
GitLab CI/CD 自动化了构建和部署过程,确保应用程序始终保持最新状态。请按照以下步骤设置管道:
6.1:添加.gitlab-ci.yml
该文件定义管道的阶段、作业和命令。
- 将以下
.gitlab-ci.yml
文件添加到项目的根目录:
stages:
- build
- deploy
build:
image: docker:latest
services:
- docker:dind
script:
- docker build -t node-app .
- docker tag node-app <account_id>.dkr.ecr.<region>.amazonaws.com/node-app:latest
- aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account_id>.dkr.ecr.<region>.amazonaws.com
- docker push <account_id>.dkr.ecr.<region>.amazonaws.com/node-app:latest
deploy:
image: amazon/aws-cli:latest
script:
- aws ecs update-service --cluster node-app-cluster --service node-app-service --force-new-deployment --region <region>
- 关键步骤说明:
- 构建阶段:
- 从您的构建 Docker 映像
Dockerfile
。 - 使用 ECR 存储库 URL 标记图像。
- 将图像推送到 Amazon ECR。
- 从您的构建 Docker 映像
- 部署阶段:
- 更新 ECS 服务以使用 Amazon ECR 中的最新图像。
- 构建阶段:
6.2:在 GitLab 中配置变量
转到GitLab 存储库中的设置 → CI/CD → 变量并添加以下环境变量:
AWS_ACCESS_KEY_ID
:您的 AWS 访问密钥。AWS_SECRET_ACCESS_KEY
:您的 AWS 密钥。AWS_REGION
:您的 AWS 区域。
步骤 7:使用 AWS CloudWatch 添加监控
CloudWatch 支持对您的应用程序和基础设施进行监控和日志记录。
7.1:设置 CloudWatch 日志
- 创建日志组:
aws logs create-log-group --log-group-name /ecs/node-app
- 创建日志流:
aws logs create-log-stream --log-group-name /ecs/node-app --log-stream-name app-logs
- 将日志与 ECS 任务定义集成:在任务定义 (
task-def.json
) 中,确保该logConfiguration
部分如下所示:
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/node-app",
"awslogs-region": "<region>",
"awslogs-stream-prefix": "ecs"
}
}
7.2:设置监控警报
您可以在 CloudWatch 中设置警报来监控 CPU 使用率、内存和应用程序错误等指标。
- 创建警报:
aws cloudwatch put-metric-alarm \
--alarm-name HighCPUUsage \
--metric-name CPUUtilization \
--namespace AWS/ECS \
--statistic Average \
--period 300 \
--threshold 80 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--alarm-actions <sns_topic_arn>
- 接收通知:创建 SNS 主题以发送通知:
aws sns create-topic --name ecs-alerts
aws sns subscribe --topic-arn <sns_topic_arn> --protocol email --notification-endpoint <your_email>
现在,您将收到有关 CPU 使用率过高或其他警报的电子邮件通知。
👤 作者

加入我们的电报社区||在 GitHub 上关注我以获取更多 DevOps 内容!
文章来源:https://dev.to/prodevopsguytech/end-to-end-aws-devops-project-automating-build-and-deployment-of-a-nodejs-application-to-amazon-h7p