为了账号安全,请及时绑定邮箱和手机立即绑定

基于GitLab与AWS的端到端DevOps项目:使用GitLab CI/CD自动化Node.js应用的构建与部署至Amazon ECS

标签:
Node.js AWS Git
目录
  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进行版本控制,以及使用AWS的ECS、ECR和CodePipeline服务来进行编排和部署。

在完成本指南之后,您将完全理解 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 Security Hub(安全中心)
  • Amazon EventBridge(事件桥接)
  • Amazon 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. AWS 账户:具有 ECS、ECR 和 CodePipeline 的管理权限。
  2. GitLab 账户:为 Node.js 应用程序创建了一个代码仓库。
  3. 已安装 AWS CLI:用于通过命令行与 AWS 服务交互。
请运行以下命令来安装 AWS CLI v2 包:

curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

完成后,您可以运行 `aws --version` 来检查安装的版本。

切换到全屏模式/退出全屏模式

  1. 安装了 Docker:用于构建容器图像。
       sudo apt: 更新软件包列表
       sudo apt: 安装 Docker
       docker --version: 检查 Docker 版本

进入全屏模式 关闭全屏模式

  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" # 下载 kubectl 工具
       chmod +x kubectl # 赋予 kubectl 文件可执行权限
       sudo mv kubectl /usr/local/bin/ # 将 kubectl 文件移动到 /usr/local/bin/ 目录下

全屏模式 退出全屏模式


步骤2:配置GitLab来进行版本控制

既然你使用了现有的 GitLab 代码库,请按照以下步骤克隆并在你的项目中使用它。

2.1: 复制仓库

  1. 在 GitLab 中打开仓库页面:Nanuchi Node.js App
  2. 点击 Fork,在你的 GitLab 账户中创建一个副本。

2.2: 复制仓库

分叉了之后,克隆到你本地的机器上:

       git clone https://gitlab.com/<你的用户名或账号>/node-app.git
       cd node-app

全屏 退出全屏

  1. 检查仓库是否包含以下内容:
  • Node.js 应用代码

  • server.js

  • package.json

  • Dockerfile 用于创建容器。

  • .gitlab-ci.yml 用于 CI/CD 管道(我们稍后会修改它)。

2.3: 更新推送(可选)

如果你想要对仓库进行修改(例如,更新代码、添加更多文件),推送更新内容:

可以使用以下命令:

git push origin main

注:main 可能根据你的实际情况替换成其他分支名称,如 mastermaster
这样就可以将更改提交到远程仓库了。

    git add .
    git commit -m "更新了CI/CD项目的应用程序"
    git push origin main

点击进入全屏 点击退出全屏


第三步:准备 AWS 资源

这一步保持不变,但现在已经和你部署的 Node.js 应用程序保持一致。

3.1: 创建 Amazon ECR 存储库

创建一个私有仓库来存储你的应用程序所需的Docker镜像:(ECR,亚马逊的Elastic Container Registry)

使用 AWS ECR 创建一个名为 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

以下是该命令的简要说明:此命令用于获取ECR(Amazon Elastic Container Registry)的登录密码,并使用该密码登录到指定的Amazon ECR实例。命令中的<region><account_id>需要替换为实际的区域和账户ID。

全屏模式退出全屏

3.3: 创建一个ECS集群

创建一个ECS集群,来运行应用容器吧。

aws ecs 创建集群命令 --cluster-name node-app-cluster

进入全屏,退出全屏

3.4: IAM角色、VPC和安全组

按照前面提到的步骤来做

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

    • *

第四步:让我们构建并推送Docker镜像吧

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

4.1: 构建Docker镜像

进入仓库的根文件夹,然后构建镜像:

在当前目录下使用Docker构建镜像并命名为node-app: `docker build -t node-app .`

全屏 退出全屏

4.2: 打 Docker 镜像的标签

给您的ECR仓库的图像打个标签:

docker 命令用于标记 node-app:latest 镜像,将其重新指定为 <account_id>.dkr.ecr.<region>.amazonaws.com/node-app:latest。这里,<account_id> 是您的 Docker 账户 ID,<region> 是您选择的 AWS 区域,而 node-app 是应用程序的名称。

全屏 退出全屏

4.3: 将镜像上传到ECR,

将图像推送至您的 Amazon ECR 仓库:

将最新的node-app推送到指定的Docker仓库:

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

全屏 退出全屏

4.4: 验证图片

确认图片已成功上传:

aws ecr list-images --repository-name node-app
# 这个命令用于列出名为 node-app 的存储库中的镜像。

点击全屏进入全屏模式,点击退出全屏以退出全屏模式。


步骤 5:使用 Fargate 在 Amazon ECS 上设置

亚马逊 ECS(Elastic Container Service)是一项允许您运行容器化应用程序的托管服务。我们使用 Fargate,这是一种无需手动管理 EC2 实例的无服务器选项。以下是为我们的项目设置 ECS 的详细指南:

5.1: 创建集群

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

  1. 运行下面的命令来创建一个集群(cluster)
       aws ecs 创建集群命令 --集群的名称 node-app集群

全屏查看,关闭全屏

这条命令创建了一个名为 node-app-cluster 的新集群(cluster)。

  1. 检查集群
aws ecs list-clusters  # 列出所有ECS集群的命令

进入全屏模式,退出全屏

确保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 和区域。
  • 确保它指向有效的 ECS(Elastic Container Service)任务执行角色。
  1. 在 ECS 中注册任务定义:

使用 AWS ECS 注册任务定义并从文件 'task-def.json' 中读取 CLI 输入。

全屏模式 退出全屏

这会将蓝图注册到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>

注:此命令用于在指定的集群中创建服务,并设置相关参数如任务定义、所需实例数、启动类型等。请确保将 <region> 替换为实际的 AWS 区域。

全屏 全屏退出

  • subnet-xxxsg-xxx 替换为您的 VPC 的公共子网的 ID 和安全组的 ID。
  • desired-count 是要运行的任务数。
  1. 验证服务内容:
运行以下命令来查看 node-app-cluster 集群中的 node-app-service 服务的信息: aws ecs describe-services --cluster node-app-cluster --services node-app-service

全屏,退出全屏

确认服务已启动并正常运行。

5.4: 测试应用

找到您的任务的公网IP。

# 在 AWS ECS 中使用此命令列出任务,指定集群为 node-app-cluster
aws ecs list-tasks --cluster node-app-cluster

全屏 退出全屏

使用任务ID来描述该任务并找到其公网IP地址。

aws ecs describe-tasks --cluster node-app-cluster --tasks <任务ID>

切换到全屏 退出全屏

  1. 在浏览器中用公网IP地址访问你的应用即可:
       http://<公网IP>:3000

全屏进入;退出全屏


第六步:创建 GitLab CI/CD 管道

GitLab CI/CD 自动化构建和部署流程,确保应用程序始终处于最新状态。按照以下步骤设置流水线:

6.1: 添加 .gitlab-ci.yml 文件

此文件定义了工作流中的各个阶段、任务和命令。

1、将以下 . gitlab-ci.yml 文件添加到项目根目录中:

stages:
 - 构建
 - 部署

构建:
image: docker:latest
服务:
 - docker:dind
脚本:
 - 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

部署:
image: amazon/aws-cli:latest
脚本:
 - aws ecs update-service --cluster node-app-cluster --service node-app-service --force-new-deployment --region <region>

进入全屏 退出全屏

  1. 关键步骤解释
  • 构建步骤

  • 从您的 Dockerfile 文件构建 Docker 镜像。

  • 使用 Amazon ECR 仓库的 URL 标记该镜像。

  • 将镜像推送到 Amazon ECR 仓库。

  • 部署步骤

  • 更新 ECS 服务以使用 Amazon ECR 中最新的镜像。

6.2: 在 GitLab 中配置变量

进入设置 → CI/CD → 变量,在您的 GitLab 仓库的设置中,并添加以下环境变量:如下

  • AWS_ACCESS_KEY_ID: 您的 AWS 访问密钥。
  • AWS_SECRET_ACCESS_KEY: 您的 AWS 秘密访问密钥。
  • AWS_REGION: AWS 地域:

    • *

第 7 步:使用 AWS CloudWatch 添加监控功能

CloudWatch(CloudWatch)可以为您的应用和基础架构提供监控及记录日志。

7.1: 设置 CloudWatch 日志功能

  1. 新建一个日志组(Log Group):
创建日志组命令: aws logs create-log-group --log-group-name /ecs/node-app # 创建名为 /ecs/node-app 的日志组

切换到全屏 退出全屏

  1. 创建日志流项:

运行以下命令来创建日志流:

aws logs create-log-stream --log-group-name /ecs/node-app --log-stream-name app-logs

全屏模式 退出全屏

  1. 确保在ECS任务定义中集成日志:在任务定义(task-def.json)中,确保logConfiguration部分设置如下,这将有助于日志的整合。
       "日志配置": {
         "日志驱动": "awslogs",
         "选项": {
           "awslogs-group": "/ecs/node-app",
           "awslogs-region": "<region>",
           "awslogs-stream-prefix": "ecs"
         }
       }

全屏显示;退出全屏

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 \
         --比较操作 GreaterThanThreshold \
         --每个评估周期 1 \
         --告警动作 <sns主题ARN>

全屏 退出全屏

  1. 接收通知提醒:创建一个SNS主题来接收通知:
       aws sns create-topic --name ecs-alerts
       aws sns subscribe --topic-arn <sns_topic_arn> --protocol email --notification-endpoint <your_email>

运行以下命令来创建一个名为ecs-alerts的主题,并订阅该主题以便通过电子邮件接收通知。

全屏,退出全屏

现在,你会收到有关高CPU使用率或其它提醒的邮件。


👤 作者:

banner

加入我们的Telegram频道——在Github关注我,可以获取更多DevOps相关内容哦

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消