- 介绍
- 项目概览
- 技术栈
- 架构图
- 步骤 1:准备工作
- 步骤 2:配置 GitLab 作为版本控制系统
- 步骤 3:准备和配置 AWS 资源
- 步骤 4:构建和推送 Docker 镜像至仓库
- 步骤 5:使用 Fargate 配置 Amazon ECS
- 步骤 6:构建 GitLab CI/CD 管道
- 步骤 7:配置 AWS CloudWatch 监控
- 结论
……此处省略内容……
简介在这个项目中,我们将构建和部署一个Node.js应用程序到Amazon ECS,使用自动化管道。该项目展示了如何使用GitLab进行版本控制,以及使用AWS的ECS、ECR和CodePipeline服务来进行编排和部署。
在完成本指南之后,您将完全理解 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 Security Hub(安全中心)
- Amazon EventBridge(事件桥接)
- Amazon SNS(简单通知服务)
- AWS CloudWatch(云观察)
-
其他工具包括:
- GitLab :源代码管理和CI/CD流水线。
- Docker :应用容器化。
-
Node.js :示例Web应用程序框架。
- 敏捷的棕色狐狸跳过了懒惰的狗。*
该项目的高层次架构如下所示:
- 开发者将代码提交到 GitLab。
- GitLab CI/CD 管道构建然后将 Docker 镜像推送到 Amazon ECR。
- 镜像部署到 Amazon ECS(Fargate)。
- 使用 AWS CloudWatch 监控和记录日志。
- 通过 Amazon SNS 发送通知。
……
第一步:先决条件确保在开始之前已经准备好以下事项:
- AWS 账户:具有 ECS、ECR 和 CodePipeline 的管理权限。
- GitLab 账户:为 Node.js 应用程序创建了一个代码仓库。
- 已安装 AWS CLI:用于通过命令行与 AWS 服务交互。
请运行以下命令来安装 AWS CLI v2 包:
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
完成后,您可以运行 `aws --version` 来检查安装的版本。
切换到全屏模式/退出全屏模式
- 安装了 Docker:用于构建容器图像。
sudo apt: 更新软件包列表
sudo apt: 安装 Docker
docker --version: 检查 Docker 版本
进入全屏模式 关闭全屏模式
- 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: 复制仓库
- 在 GitLab 中打开仓库页面:Nanuchi Node.js App。
- 点击 Fork,在你的 GitLab 账户中创建一个副本。
2.2: 复制仓库
分叉了之后,克隆到你本地的机器上:
git clone https://gitlab.com/<你的用户名或账号>/node-app.git
cd node-app
全屏 退出全屏
- 检查仓库是否包含以下内容:
-
Node.js 应用代码:
-
server.js
-
package.json
-
Dockerfile 用于创建容器。
.gitlab-ci.yml
用于 CI/CD 管道(我们稍后会修改它)。
2.3: 更新推送(可选)
如果你想要对仓库进行修改(例如,更新代码、添加更多文件),推送更新内容:
可以使用以下命令:
git push origin main
注:main
可能根据你的实际情况替换成其他分支名称,如 master
或 master
。
这样就可以将更改提交到远程仓库了。
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: 创建集群
集群就是运行你的任务和服务所需的资源的逻辑分组。
- 运行下面的命令来创建一个集群(cluster):
aws ecs 创建集群命令 --集群的名称 node-app集群
全屏查看,关闭全屏
这条命令创建了一个名为 node-app-cluster
的新集群(cluster)。
- 检查集群:
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)任务执行角色。
- 在 ECS 中注册任务定义:
使用 AWS ECS 注册任务定义并从文件 'task-def.json' 中读取 CLI 输入。
全屏模式 退出全屏
这会将蓝图注册到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>
注:此命令用于在指定的集群中创建服务,并设置相关参数如任务定义、所需实例数、启动类型等。请确保将 <region>
替换为实际的 AWS 区域。
全屏 全屏退出
- 将
subnet-xxx
和sg-xxx
替换为您的 VPC 的公共子网的 ID 和安全组的 ID。 desired-count
是要运行的任务数。
- 验证服务内容:
运行以下命令来查看 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>
切换到全屏 退出全屏
- 在浏览器中用公网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>
进入全屏 退出全屏
- 关键步骤解释:
-
构建步骤:
-
从您的
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 日志功能
- 新建一个日志组(Log Group):
创建日志组命令: aws logs create-log-group --log-group-name /ecs/node-app # 创建名为 /ecs/node-app 的日志组
切换到全屏 退出全屏
- 创建日志流项:
运行以下命令来创建日志流:
aws logs create-log-stream --log-group-name /ecs/node-app --log-stream-name app-logs
全屏模式 退出全屏
- 确保在ECS任务定义中集成日志:在任务定义(
task-def.json
)中,确保logConfiguration
部分设置如下,这将有助于日志的整合。
"日志配置": {
"日志驱动": "awslogs",
"选项": {
"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 \
--比较操作 GreaterThanThreshold \
--每个评估周期 1 \
--告警动作 <sns主题ARN>
全屏 退出全屏
- 接收通知提醒:创建一个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使用率或其它提醒的邮件。
👤 作者:
加入我们的Telegram频道——在Github关注我,可以获取更多DevOps相关内容哦