🚀 多应用 CI/CD 在 AWS 上(生产级)
I’m happy to translate the article for you, but I need the actual text of the article. Could you please paste the content you’d like translated (excluding the source link you’ve already provided)? Once I have the text, I’ll translate it into Simplified Chinese while preserving the formatting, markdown, and any code blocks or URLs.
Project Goal
- 开发者将代码推送到 GitHub。
- GitHub Actions 自动:
- 测试代码
- 构建 Docker 镜像
- 将镜像推送到 AWS ECR
- 部署到 AWS ECS(Fargate)或 EC2 + Docker
- 最终用户通过 HTTPS(ALB + ACM)访问应用
- 通过 CloudWatch 进行日志和监控
- 支持滚动 / 蓝绿部署
高级架构
flowchart TD
Developer -->|push| GitHubRepo[GitHub Repo (App1, App2, App3)]
GitHubRepo --> GitHubActions[GitHub Actions (CI/CD)]
GitHubActions -->|Test| Test
GitHubActions -->|Docker Build| Build
GitHubActions -->|Push to ECR| ECR[AWS ECR (Images)]
ECR --> ECS[AWS ECS (Fargate)]
ECS --> ALB[Application Load Balancer]
ALB --> EndUsers[End Users (HTTPS)]
仓库结构
multi-app-devops/
├── app1/
│ ├── Dockerfile
│ └── src/
├── app2/
│ ├── Dockerfile
│ └── src/
├── app3/
│ ├── Dockerfile
│ └── src/
└── .github/
└── workflows/
└── deploy.yml
每个应用程序都是独立的,但通过相同的流水线逻辑进行部署。
第一步:AWS 账户与 IAM
将以下托管策略附加到 CI/CD IAM 用户/角色:
AmazonEC2FullAccessAmazonECS_FullAccessAmazonEC2ContainerRegistryFullAccessCloudWatchFullAccessIAMReadOnlyAccess
为编程访问创建一个 访问密钥。
Step 2: Networking (VPC)
- 创建一个包含两个公共子网的 VPC。
- 附加 Internet Gateway 并配置路由表。
- 安全组:
- ALB – 入站端口
80和443 - ECS tasks – 入站端口
3000、5000、80(根据各应用的需求)
- ALB – 入站端口
第3步:创建 ECR 仓库
为每个应用程序创建一个仓库:
app1-ecrapp2-ecrapp3-ecr
记录以下信息以备后用:
- AWS 账户 ID
- 区域
- 仓库 URI(例如
123456789012.dkr.ecr.us-east-1.amazonaws.com/app1)
第4步:容器化应用程序
示例 Dockerfile(对每个应用使用相同的模式):
# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Step 5: ECS Cluster (Fargate)
- 创建一个 ECS 集群。
- 为每个应用定义 Task Definition:
- 容器镜像 → ECR URI
- 端口映射 → 应用的暴露端口
- CPU 与内存设置
- 为每个任务定义创建 Service:
- 启动类型:FARGATE
- 将服务附加到 ALB 目标组
- 期望数量:
2(高可用)
第6步:应用负载均衡器
配置基于路径的路由:
| 路径 | 目标服务 |
|---|---|
/app1 | app1-service |
/app2 | app2-service |
/app3 | app3-service |
第7步:GitHub Secrets
将以下密钥添加到仓库:
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_ACCOUNT_IDECR_REPO_APP1(完整 URI)ECR_REPO_APP2(完整 URI)ECR_REPO_APP3(完整 URI)
第8步:GitHub Actions CI/CD 流水线
.github/workflows/deploy.yml
name: CI-CD Pipeline
on:
push:
branches: [ "main" ]
env:
AWS_REGION: us-east-1
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
run: |
aws ecr get-login-password --region $AWS_REGION \
| docker login --username AWS --password-stdin \
${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.$AWS_REGION.amazonaws.com
- name: Build & Push App1
run: |
docker build -t app1 ./app1
docker tag app1:latest ${{ secrets.ECR_REPO_APP1 }}:latest
docker push ${{ secrets.ECR_REPO_APP1 }}:latest
- name: Deploy App1 to ECS
run: |
aws ecs update-service \
--cluster devops-cluster \
--service app1-service \
--force-new-deployment
# Repeat the build, push, and deploy steps for app2 and app3
第9步:监控与日志
- CloudWatch Logs – 捕获容器的 stdout/stderr。
- Metrics – 每个任务的 CPU、内存和网络利用率。
- Health checks – 在 ALB 目标组上配置的健康检查。
第10步:安全性与最佳实践
- 使用最小权限的 IAM 策略。
- 在 ECR 中启用镜像扫描。
- 使用 ACM 证书在 ALB 上强制使用 HTTPS。
- 定期轮换 IAM 访问密钥。
步骤 11:测试流程
- 开发者修改代码并推送到
main。 - GitHub Actions 工作流被触发。
- Docker 镜像被重新构建并推送到 ECR。
- ECS 服务拉取新镜像并执行滚动部署。
- 最终用户在不中断的情况下收到更新后的应用程序。