端到端 AWS DevOps 项目:使用 GitLab CI/CD 自动构建 Node.js 应用程序并将其部署到 Amazon ECS

2025-05-26

端到端 AWS DevOps 项目:使用 GitLab CI/CD 自动构建 Node.js 应用程序并将其部署到 Amazon ECS

目录

  1. 介绍
  2. 项目概述
  3. 技术堆栈
  4. 架构图
  5. 步骤 1:先决条件
  6. 步骤 2:配置 GitLab 作为版本控制
  7. 步骤 3:准备 AWS 资源
  8. 步骤 4:构建并推送 Docker 镜像
  9. 步骤 5:使用 Fargate 设置 Amazon ECS
  10. 步骤 6:创建 GitLab CI/CD 管道
  11. 步骤 7:使用 AWS CloudWatch 添加监控
  12. 结论

介绍

在此项目中,我们将创建一个自动化管道,用于构建 Node.js 应用程序并将其部署到 Amazon ECS。该项目展示了如何使用 GitLab 进行版本控制、使用 Docker 进行容器化,以及使用 ECS、ECR 和 CodePipeline 等 AWS 服务进行编排和部署。

在本指南结束时,您将全面了解 AWS 中的 CI/CD 工作流程,这对于现代 DevOps 实践至关重要。


项目概述

客观的

我们将自动执行以下任务:

  1. 构建 Node.js 应用程序。
  2. 使用 Docker 将应用程序容器化。
  3. 将 Docker 镜像推送到 Amazon ECR。
  4. 使用 Fargate 将容器部署到 Amazon ECS。
  5. 使用 GitLab CI/CD 进行持续集成和部署。
  6. 使用 AWS CloudWatch 和 SNS 添加监控和通知。

技术堆栈

  • AWS 服务:

    • Amazon ECS(弹性容器服务)
    • Amazon ECR(弹性容器注册表)
    • AWS CodePipeline
    • AWS 安全中心
    • 亚马逊 EventBridge
    • 亚马逊SNS
    • AWS CloudWatch
  • 其他工具:

    • GitLab:源代码管理和 CI/CD 管道。
    • Docker:应用程序容器化。
    • Node.js:示例 Web 应用程序框架。

架构图

该项目的高层架构如下:

  1. 开发人员将代码推送到 GitLab。
  2. GitLab CI/CD 管道构建并将 Docker 镜像推送到 Amazon ECR。
  3. 该图像已部署到 Amazon ECS(Fargate)。
  4. 使用 AWS CloudWatch 完成监控和日志记录。
  5. 通知使用 Amazon SNS 发送。

步骤 1:先决条件

开始之前请确保已进行以下设置:

  1. AWS 账户:具有 ECS、ECR 和 CodePipeline 的管理员访问权限。
  2. GitLab 帐户:使用为 Node.js 应用程序创建的存储库。
  3. 已安装 AWS CLI:用于从命令行与 AWS 服务交互。
   curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
   sudo installer -pkg AWSCLIV2.pkg -target /
   aws --version
Enter fullscreen mode Exit fullscreen mode
  1. Docker 安装:用于构建容器镜像。
   sudo apt update
   sudo apt install docker.io
   docker --version
Enter fullscreen mode Exit fullscreen mode
  1. 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/
Enter fullscreen mode Exit fullscreen mode

步骤 2:配置 GitLab 作为版本控制

由于您正在使用现有的 GitLab 存储库,请按照以下步骤克隆并在项目中使用它:

2.1:分叉存储库

  1. 在 GitLab 中打开存储库:Nanuchi Node.js App
  2. 单击Fork即可在您的 GitLab 帐户下创建副本。

2.2:克隆存储库

  1. 分叉后,将其克隆到本地机器:
   git clone https://gitlab.com/<your-username>/node-app.git
   cd node-app
Enter fullscreen mode Exit fullscreen mode
  1. 验证存储库是否包含以下内容:
    • 应用程序代码(Node.js)
      • server.js
      • package.json
    • 用于容器化的Dockerfile
    • .gitlab-ci.yml用于 CI/CD 管道(我们稍后会修改它)。

2.3:推送更新(可选)

如果您想对存储库进行更改(例如,更新代码,添加更多文件),请将更新推回:

git add .
git commit -m "Updated application for CI/CD project"
git push origin main
Enter fullscreen mode Exit fullscreen mode

步骤 3:准备 AWS 资源

此步骤基本保持不变,但现在它与您正在部署的 Node.js 应用程序保持一致。

3.1:创建 Amazon ECR 存储库

创建一个私有 ECR 存储库来存储应用程序的 Docker 镜像:

aws ecr create-repository --repository-name node-app
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

3.3:创建 ECS 集群

创建用于运行应用程序容器的 ECS 集群:

aws ecs create-cluster --cluster-name node-app-cluster
Enter fullscreen mode Exit fullscreen mode

3.4:IAM 角色、VPC 和安全组

按照前面概述的步骤进行操作:

  • 创建IAM 任务执行角色
  • 设置VPC子网安全组
  • 3000在安全组中打开端口以用于应用程序流量。

步骤 4:构建并推送 Docker 镜像

使用克隆的 GitLab 应用程序,构建并推送 Docker 镜像。

4.1:构建Docker镜像

导航到存储库的根目录并构建图像:

docker build -t node-app .
Enter fullscreen mode Exit fullscreen mode

4.2:标记 Docker 镜像

为您的 ECR 存储库标记图像:

docker tag node-app:latest <account_id>.dkr.ecr.<region>.amazonaws.com/node-app:latest
Enter fullscreen mode Exit fullscreen mode

4.3:将图像推送到 ECR

将图像推送到您的 Amazon ECR 存储库:

docker push <account_id>.dkr.ecr.<region>.amazonaws.com/node-app:latest
Enter fullscreen mode Exit fullscreen mode

4.4:验证图像

确认镜像已经推送成功:

aws ecr list-images --repository-name node-app
Enter fullscreen mode Exit fullscreen mode

步骤 5:使用 Fargate 设置 Amazon ECS

Amazon ECS(弹性容器服务)是一项托管服务,可用于运行容器。我们使用Fargate,这是一种无服务器方案,无需手动管理 EC2 实例。以下是为我们的项目设置 ECS 的详细步骤:

5.1:创建集群

集群是运行任务或服务所需的资源的逻辑分组。

  1. 运行以下命令创建集群
   aws ecs create-cluster --cluster-name node-app-cluster
Enter fullscreen mode Exit fullscreen mode

此命令创建一个名为 的新集群node-app-cluster

  1. 验证集群
   aws ecs list-clusters
Enter fullscreen mode Exit fullscreen mode

确保node-app-cluster被列为集群之一。

5.2:定义任务定义

任务定义指定运行应用程序所需的容器设置(例如内存、CPU、端口)。您可以将其视为容器化应用程序的蓝图。

  1. 创建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"
   }
Enter fullscreen mode Exit fullscreen mode
  • <account_id>和替换<region>为您的 AWS 账户 ID 和区域。
  • 确保executionRoleArn指向有效的 ECS 任务执行角色。
  1. 向 ECS 注册任务定义:
   aws ecs register-task-definition --cli-input-json file://task-def.json
Enter fullscreen mode Exit fullscreen mode

这会将蓝图注册到 ECS。

5.3:创建服务来管理任务

ECS 服务确保所需数量的任务正在运行并为任务实现负载平衡。

  1. 创建服务:
   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>
Enter fullscreen mode Exit fullscreen mode
  • subnet-xxx和替换sg-xxx为您的 VPC 的公共子网和安全组的 ID。
  • desired-count是要运行的任务数。
  1. 验证服务
   aws ecs describe-services --cluster node-app-cluster --services node-app-service
Enter fullscreen mode Exit fullscreen mode

确保服务处于活动状态并正在运行。

5.4:测试应用程序

  1. 找到你的任务的公共IP:
   aws ecs list-tasks --cluster node-app-cluster
Enter fullscreen mode Exit fullscreen mode

使用任务ID描述任务,并找到公网IP地址:

   aws ecs describe-tasks --cluster node-app-cluster --tasks <task_id>
Enter fullscreen mode Exit fullscreen mode
  1. 使用公共 IP 在浏览器中访问您的应用程序:
   http://<public_ip>:3000
Enter fullscreen mode Exit fullscreen mode

步骤 6:创建 GitLab CI/CD 管道

GitLab CI/CD 自动化了构建和部署过程,确保应用程序始终保持最新状态。请按照以下步骤设置管道:

6.1:添加.gitlab-ci.yml

该文件定义管道的阶段、作业和命令。

  1. 将以下.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>
Enter fullscreen mode Exit fullscreen mode
  1. 关键步骤说明
    • 构建阶段
      • 从您的构建 Docker 映像Dockerfile
      • 使用 ECR 存储库 URL 标记图像。
      • 将图像推送到 Amazon ECR。
    • 部署阶段
      • 更新 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 日志

  1. 创建日志组
   aws logs create-log-group --log-group-name /ecs/node-app
Enter fullscreen mode Exit fullscreen mode
  1. 创建日志流
   aws logs create-log-stream --log-group-name /ecs/node-app --log-stream-name app-logs
Enter fullscreen mode Exit fullscreen mode
  1. 将日志与 ECS 任务定义集成:在任务定义 ( task-def.json) 中,确保该logConfiguration部分如下所示:
   "logConfiguration": {
     "logDriver": "awslogs",
     "options": {
       "awslogs-group": "/ecs/node-app",
       "awslogs-region": "<region>",
       "awslogs-stream-prefix": "ecs"
     }
   }
Enter fullscreen mode Exit fullscreen mode

7.2:设置监控警报

您可以在 CloudWatch 中设置警报来监控 CPU 使用率、内存和应用程序错误等指标。

  1. 创建警报
   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>
Enter fullscreen mode Exit fullscreen mode
  1. 接收通知:创建 SNS 主题以发送通知:
   aws sns create-topic --name ecs-alerts
   aws sns subscribe --topic-arn <sns_topic_arn> --protocol email --notification-endpoint <your_email>
Enter fullscreen mode Exit fullscreen mode

现在,您将收到有关 CPU 使用率过高或其他警报的电子邮件通知。


👤 作者

横幅

加入我们的电报社区||在 GitHub 上关注我以获取更多 DevOps 内容!

文章来源:https://dev.to/prodevopsguytech/end-to-end-aws-devops-project-automating-build-and-deployment-of-a-nodejs-application-to-amazon-h7p
PREV
端到端 AWS DevOps 项目:用于 ECS Fargate 和 ECR 及 RDS 的 CI/CD 管道
NEXT
端到端 AWS DevOps 项目:在 Amazon EKS 上自动构建和部署 Java 应用程序