🚀 多应用 CI/CD 在 AWS 上(生产级)

发布: (2026年1月1日 GMT+8 14:36)
5 min read
原文: Dev.to

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 用户/角色:

  • AmazonEC2FullAccess
  • AmazonECS_FullAccess
  • AmazonEC2ContainerRegistryFullAccess
  • CloudWatchFullAccess
  • IAMReadOnlyAccess

为编程访问创建一个 访问密钥

Step 2: Networking (VPC)

  1. 创建一个包含两个公共子网的 VPC。
  2. 附加 Internet Gateway 并配置路由表。
  3. 安全组:
    • ALB – 入站端口 80443
    • ECS tasks – 入站端口 3000500080(根据各应用的需求)

第3步:创建 ECR 仓库

为每个应用程序创建一个仓库:

  • app1-ecr
  • app2-ecr
  • app3-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)

  1. 创建一个 ECS 集群。
  2. 为每个应用定义 Task Definition
    • 容器镜像 → ECR URI
    • 端口映射 → 应用的暴露端口
    • CPU 与内存设置
  3. 为每个任务定义创建 Service
    • 启动类型:FARGATE
    • 将服务附加到 ALB 目标组
    • 期望数量:2(高可用)

第6步:应用负载均衡器

配置基于路径的路由:

路径目标服务
/app1app1-service
/app2app2-service
/app3app3-service

第7步:GitHub Secrets

将以下密钥添加到仓库:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_ACCOUNT_ID
  • ECR_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:测试流程

  1. 开发者修改代码并推送到 main
  2. GitHub Actions 工作流被触发。
  3. Docker 镜像被重新构建并推送到 ECR。
  4. ECS 服务拉取新镜像并执行滚动部署。
  5. 最终用户在不中断的情况下收到更新后的应用程序。
Back to Blog

相关文章

阅读更多 »