Triển khai tự động với GitHub Actions cho Amazon ECS Express Mode

Tác giả: Olawale Olaleye và Guillaume Delacour
Ngày phát hành: 10 MAR 2026
Chuyên mục: Advanced (300), Amazon Elastic Container Service, Technical How-to

Các tổ chức áp dụng ứng dụng container hóa để đạt được nhiều lợi ích, bao gồm chu kỳ phát triển nhanh hơn và phân phối tính năng nhanh chóng hơn. Amazon Elastic Container Service (Amazon ECS) Express Mode hợp lý hóa quy trình này bằng cách tự động quản lý cơ sở hạ tầng—mạng, cân bằng tải và cấp phát dung lượng diễn ra mà không cần cấu hình thủ công. Tuy nhiên, việc xây dựng các image container, đẩy chúng lên các registry và cập nhật các service khi mã nguồn thay đổi vẫn đòi hỏi sự phối hợp thủ công hoặc các script tùy chỉnh.

Gần đây, AWS đã công bố Amazon ECS “Deploy Express Service” Action for GitHub Actions, một GitHub Actions mới tự động hóa việc triển khai cho các service Amazon ECS Express Mode. Action GitHub “Deploy Express Service” tích hợp trực tiếp vào các workflow GitHub của bạn, và khi kết hợp với GitHub Actions để xây dựng và đẩy image container, có thể được sử dụng để tạo một pipeline triển khai liên tục liền mạch. Action GitHub “Deploy Express Services” xác thực với các vai trò AWS Identity and Access Management (IAM) bằng xác thực OpenID Connect (OIDC), vì vậy bạn không cần lưu trữ thông tin xác thực AWS trong repository của mình.

Trong bài viết này, chúng tôi sẽ hướng dẫn bạn xây dựng một pipeline triển khai tự động bằng GitHub Actions. Bạn sẽ tạo một workflow kích hoạt khi có thay đổi mã nguồn, xây dựng Docker image, đẩy chúng lên Amazon ECR và triển khai lên Amazon ECS Express Mode bằng cách sử dụng các vai trò IAM để xác thực an toàn. Cuối cùng, bạn sẽ có một workflow tích hợp liên tục và phân phối liên tục (CI/CD) tự động triển khai ứng dụng của bạn khi bạn đẩy mã nguồn.

Tổng quan kiến trúc

Sơ đồ sau đây cho thấy cách GitHub Actions tích hợp với Amazon ECS Express Mode để tạo một pipeline triển khai tự động:


Hình 1 – Sơ đồ kiến trúc CI/CD hiển thị workflow GitHub Actions

Khi bạn commit mã nguồn vào repository của mình trên trang web GitHub, GitHub Actions tự động xây dựng image container của bạn và đẩy nó lên Amazon ECR. Workflow sau đó cập nhật service Amazon ECS Express Mode của bạn với image mới. Một Application Load Balancer (ALB) định tuyến lưu lượng truy cập người dùng đến ứng dụng container hóa của bạn đang chạy trên Amazon ECS.

Kiến trúc này sử dụng OpenID Connect (OIDC) để xác thực GitHub Actions với AWS một cách an toàn. Vì OIDC tạo ra các thông tin xác thực tự động hết hạn sau mỗi lần chạy workflow, bạn không cần lưu trữ thông tin xác thực AWS có thời gian tồn tại dài trong repository của mình để giảm rủi ro bảo mật.

Điều kiện tiên quyết

Trước khi bắt đầu, hãy đảm bảo rằng bạn có:

Thời gian ước tính: 20–30 phút
Chi phí ước tính: Chi phí thay đổi tùy theo mức sử dụng. Bạn sẽ phải trả phí cho các tác vụ Amazon ECS, lưu trữ Amazon ECR và truyền dữ liệu. Việc sử dụng GitHub Actions không tính phí đối với các repository công cộng. Hãy nhớ dọn dẹp tài nguyên sau khi thử nghiệm.

Hướng dẫn

Fork và clone repository mã nguồn trên GitHub: sample-amazon-ecs-express-github-actions.git bằng lệnh sau:

git clone https://github.com/YOUR_USERNAME/sample-amazon-ecs-express-github-actions.git
cd sample-amazon-ecs-express-github-actions

Lưu ý: Nếu bạn đã fork repository này, các workflow GitHub Actions bị tắt theo mặc định. Để bật chúng, điều hướng đến tab Actions trong repository đã fork của bạn và chọn I understand my workflows, go ahead and enable them.

Cấu trúc repository trông như sau:

your-app/
├── Dockerfile
└── .github/
└── workflows/
└── deploy.yml

Dockerfile ví dụ trong repository này kéo image cơ sở của ứng dụng UI AWS Containers Retail Sample từ Amazon ECR Public Gallery. Ứng dụng chạy trên cổng container 8080 và cung cấp một giao diện web chức năng mà bạn có thể sử dụng để xác minh rằng pipeline triển khai của bạn hoạt động chính xác.

Thiết lập xác thực IAM cho GitHub Actions

GitHub Actions yêu cầu quyền để tương tác với tài khoản AWS của bạn. Bạn có thể sử dụng OpenID Connect (OIDC) để thiết lập mối quan hệ tin cậy giữa GitHub và AWS. Cách tiếp cận này cải thiện tư thế bảo mật của bạn vì nó tự động tạo ra các thông tin xác thực có thời gian tồn tại ngắn.

  1. Tạo một OIDC provider

Bắt đầu bằng cách đăng ký OIDC identity provider của GitHub với tài khoản AWS của bạn bằng lệnh sau:

aws iam create-open-id-connect-provider --url https://token.actions.githubusercontent.com --client-id-list sts.amazonaws.com

Lệnh này đăng ký OIDC provider của GitHub với tài khoản AWS của bạn. AWS giờ đây sẽ chấp nhận các token từ GitHub Actions và cho phép giả định vai trò.

  1. Tạo IAM trust policy

Tạo một trust policy chỉ định chính xác những repository GitHub nào có thể giả định vai trò IAM của bạn. Thay thế YOUR_ACCOUNT_ID, YOUR_GITHUB_USERNAMEYOUR_REPO_NAME bằng các giá trị thực tế của bạn:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::YOUR_ACCOUNT_ID:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:YOUR_GITHUB_USERNAME/YOUR_REPO_NAME:*"
}
}
}
]
}

Lưu tệp này dưới dạng trust-policy.json. Điều kiện StringLike giới hạn việc giả định vai trò cho repository cụ thể của bạn, ngăn các repository GitHub khác sử dụng vai trò này.

  1. Tạo IAM role

Tạo một vai trò IAM với trust policy bằng lệnh sau:

aws iam create-role \
--role-name github-actions-ecs-role \
--assume-role-policy-document file://trust-policy.json

GitHub Actions sẽ giả định vai trò này trong quá trình thực thi workflow của bạn.

  1. Tạo permission policy

GitHub Actions cần các quyền cụ thể để xây dựng và triển khai ứng dụng của bạn. Theo nguyên tắc đặc quyền tối thiểu, hãy định nghĩa hai policy riêng biệt chỉ cấp các quyền tối thiểu cần thiết.

Policy đầu tiên cấp quyền cho các hoạt động Amazon ECS Express Mode. Thay thế YOUR_ACCOUNT_ID bằng giá trị thực tế của bạn và lưu tệp sau dưới dạng ecs-express-policy.json:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:CreateCluster",
"ecs:RegisterTaskDefinition",
"ecs:CreateExpressGatewayService",
"ecs:UpdateExpressGatewayService",
"ecs:DescribeExpressGatewayService",
"ecs:DescribeClusters",
"ecs:DescribeServices",
"ecs:ListServiceDeployments",
"ecs:UpdateService",
"ecs:DescribeServiceDeployments"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"arn:aws:iam::YOUR_ACCOUNT_ID:role/ecsTaskExecutionRole",
"arn:aws:iam::YOUR_ACCOUNT_ID:role/ecsInfrastructureRoleForExpressServices"
],
"Condition": {
"StringEquals": {
"iam:PassedToService": "ecs.amazonaws.com"
}
}
}
]
}

Policy thứ hai cấp quyền cho các hoạt động Amazon ECR. Thay thế region, account-idmy-repo bằng AWS Region, Account ID và tên repository của bạn. Lưu tệp sau dưới dạng ecr-policy.json:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPushPull",
"Effect": "Allow",
"Action": [
"ecr:BatchGetImage",
"ecr:BatchCheckLayerAvailability",
"ecr:CompleteLayerUpload",
"ecr:GetDownloadUrlForLayer",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"
],
"Resource":"arn:aws:ecr:::repository/"
},
{
"Sid": "AllowLogin",
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken"
],
"Resource": "*"
}
]
}

Các policy này cấp các quyền tối thiểu cần thiết để đẩy image lên Amazon ECR và triển khai lên Amazon ECS Express Mode.

  1. Gắn policy vào role

Gắn cả hai policy vào vai trò IAM của bạn bằng lệnh sau:

# Create and attach ECS Express policy
aws iam create-policy \
--policy-name GitHubActionsECSExpressPolicy \
--policy-document file://ecs-express-policy.json
aws iam attach-role-policy \
--role-name github-actions-ecs-role \
--policy-arn arn:aws:iam::${YOUR_ACCOUNT_ID}:policy/GitHubActionsECSExpressPolicy
# Create and attach ECR policy
aws iam create-policy \
--policy-name GitHubActionsECRPolicy \
--policy-document file://ecr-policy.json
aws iam attach-role-policy \
--role-name github-actions-ecs-role \
--policy-arn arn:aws:iam::${YOUR_ACCOUNT_ID}:policy/GitHubActionsECRPolicy

Tạo vai trò IAM cho Amazon ECS Express Mode

Amazon ECS Express Mode yêu cầu hai vai trò IAM bổ sung để hoạt động: một execution role cho phép Amazon ECS kéo image container và ghi log (ecsTaskExecutionRole), và một infrastructure role quản lý các tài nguyên AWS cơ bản (ecsInfrastructureRoleForExpressServices). Nếu bạn chưa tạo các vai trò này, hãy làm theo hướng dẫn trong tài liệu Amazon ECS để tạo vai trò IAM.

Cấu hình biến repository GitHub

Workflow GitHub Actions của bạn tham chiếu chi tiết tài khoản AWS và tên tài nguyên của bạn thông qua các biến repository. Các giá trị này không nhạy cảm, vì vậy bạn có thể lưu trữ chúng dưới dạng biến thay vì secret, giúp dễ dàng tham chiếu hơn trong tệp workflow của bạn. Điều hướng đến repository GitHub của bạn trên trang web GitHub.

  1. Đi tới Settings, chọn Secrets and variables, chọn Actions, chọn tab Variables.
  2. Thêm từng biến sau bằng cách chọn New repository variable:
Tên biếnGiá trị ví dụMô tả
AWS_REGIONus-east-1AWS Region nơi tài nguyên của bạn được triển khai
AWS_ACCOUNT_ID123456789012ID tài khoản AWS 12 chữ số của bạn
ECR_REPOSITORYmy-appTên repository Amazon ECR của bạn
ECS_SERVICEmy-app-serviceTên cho service Amazon ECS của bạn
ECS_CLUSTERdefaultTên cho cluster Amazon ECS của bạn

Lưu ý: Để chỉ định một tên cluster Amazon ECS hiện có khác với default, bạn phải tạo cluster trước.

Với các biến này đã được cấu hình, bạn có thể cập nhật cấu hình triển khai của mình mà không cần sửa đổi mã workflow.

Workflow GitHub Actions

Tệp workflow định nghĩa pipeline triển khai tự động của bạn, chỉ định những gì xảy ra khi bạn đẩy mã nguồn lên repository của mình. Workflow này kích hoạt trên mỗi lần đẩy lên nhánh chính của bạn và trên các pull request, đảm bảo các thay đổi của bạn được tự động xây dựng và triển khai.

Trong repository của bạn, định vị thư mục .github/workflows để xem lại tệp deploy.yml ví dụ. Sau đây giải thích cách các thành phần chính hoạt động cùng nhau trong workflow này:

Khối permissions cấp quyền ghi id-token, và workflow phải yêu cầu token OIDC để xác thực AWS. Nếu không có quyền này, bước xác thực sẽ thất bại.

jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
# OIDC authentication requires write permission for id-token
permissions:
id-token: write
contents: read

Bước Configure AWS credentials sử dụng OIDC để xác thực với AWS bằng cách giả định vai trò IAM mà bạn đã tạo trước đó. AWS tạo ra các thông tin xác thực tạm thời tự động hết hạn sau khi workflow hoàn thành, thường trong vòng một giờ.

    # Authenticate with AWS using OIDC
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v5
      with:
        aws-region: ${{ env.AWS_REGION }}
        role-to-assume: arn:aws:iam::${{ env.AWS_ACCOUNT_ID }}:role/github-actions-ecs-role
        role-session-name: GitHubActionsECSDeployment

Bước Build, tag, and push gắn thẻ image container bằng cách sử dụng 7 ký tự đầu tiên của commit hash. Việc gắn thẻ dựa trên SHA này cung cấp khả năng theo dõi phiên bản và truy xuất nguồn gốc chính xác, tuân theo các phương pháp hay nhất của AWS để quản lý image container. Mỗi lần triển khai tham chiếu một phiên bản image cụ thể, bất biến, giúp khắc phục sự cố và cho phép rollback đáng tin cậy nếu cần.

    - name: Build, tag, and push image to Amazon ECR
      id: build-image
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
      # nosemgrep: third-party-action-not-pinned-to-commit-sha
      uses: docker/build-push-action@v6
      with:
        context: .
        push: true
        # Tag with commit SHA for version tracking
        tags: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}

Bước Deploy sử dụng action AWS chính thức để triển khai service Amazon ECS Express Mode của bạn với image container mới. Bước này xử lý sự phức tạp của việc cập nhật định nghĩa tác vụ và triển khai service. Action sẽ kiểm tra xem cluster được chỉ định có tồn tại hay không (hoặc tạo nó nếu default được chỉ định và không tồn tại), tạo service (hoặc cập nhật nó, nếu service đã tồn tại) và chờ service và triển khai đạt trạng thái ổn định. Bước này cung cấp toàn bộ stack ứng dụng của bạn bao gồm một service Amazon ECS với các tác vụ được khởi chạy trên AWS Fargate, một Application Load Balancer với các target group và health check, các chính sách tự động mở rộng dựa trên mức sử dụng CPU, các security group và cấu hình mạng, và một tên miền tùy chỉnh với URL do AWS cung cấp (nó trông giống như xxxxx.ecs.region.on.aws).

    - name: Deploy to ECS Express Mode
      uses: aws-actions/amazon-ecs-deploy-express-service@v1
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
      with:
        # Required inputs
        service-name: ${{ env.ECS_SERVICE }}
        image: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}
        execution-role-arn: arn:aws:iam::${{ env.AWS_ACCOUNT_ID }}:role/ecsTaskExecutionRole
        infrastructure-role-arn: arn:aws:iam::${{ env.AWS_ACCOUNT_ID }}:role/ecsInfrastructureRoleForExpressServices

        # Container configuration
        container-port: 8080

        # Resource configuration
        task-role-arn: arn:aws:iam::${{ env.AWS_ACCOUNT_ID }}:role/ecsTaskExecutionRole
        cluster: ${{ env.ECS_CLUSTER }}

Mẹo: Bước triển khai này sử dụng cấu hình tối thiểu. Bạn có thể tùy chỉnh triển khai của mình với các tùy chọn bổ sung như biến môi trường, cài đặt health check, chính sách mở rộng và cấu hình VPC tùy chỉnh. Xem Ví dụ hoàn chỉnh với tất cả các tùy chọn để biết tất cả các tùy chọn có sẵn.

Kiểm tra pipeline triển khai của bạn

Xác minh rằng pipeline triển khai tự động của bạn hoạt động chính xác bằng cách thực hiện một thay đổi nhỏ đối với mã ứng dụng của bạn. Commit các thay đổi của bạn và đẩy lên nhánh chính:

git add .
git commit -m "Test automated deployment"
git push origin main

Theo dõi quá trình thực thi workflow bằng cách điều hướng đến tab Actions trong repository GitHub của bạn. Bạn sẽ thấy workflow của mình đang chạy với nhật ký thời gian thực cho từng bước.

Sau khi workflow hoàn thành thành công, hãy xác minh việc triển khai trong Amazon ECS console. Service của bạn sẽ hiển thị một triển khai mới với thông báo “Deployment has completed” như trong hình sau.


Quá trình thực thi workflow GitHub Actions hiển thị tiến độ triển khai

Truy cập ứng dụng của bạn bằng URL mặc định được cung cấp trong Amazon ECS console. Bạn có thể thấy ứng dụng đã cập nhật của mình đang chạy với các thay đổi mà bạn vừa triển khai.


Amazon ECS console hiển thị triển khai thành công

Các phương pháp bảo mật tốt nhất

Việc triển khai này tuân theo các phương pháp bảo mật tốt nhất của AWS để bảo vệ pipeline triển khai và các ứng dụng đang chạy của bạn.

Xác thực OIDC tạo ra các thông tin xác thực tạm thời tự động hết hạn, giảm thiểu rủi ro lộ thông tin xác thực.

Các policy IAM đặc quyền tối thiểu chỉ cấp các quyền cần thiết cho workflow triển khai. Chúng tôi khuyên bạn nên xem xét và thắt chặt các policy này dựa trên các yêu cầu cụ thể của bạn. Ví dụ, bạn có thể hạn chế trường Resource cho các repository Amazon ECR hoặc cluster Amazon ECS cụ thể thay vì sử dụng ký tự đại diện.

Bạn có thể sử dụng GitHub environments để thêm các quy tắc bảo vệ như yêu cầu người đánh giá cho các triển khai production. Workflow sử dụng môi trường production, mà bạn có thể cấu hình để yêu cầu phê duyệt thủ công trước khi triển khai lên production.

Dọn dẹp

Để tránh phát sinh chi phí trong tương lai, hãy xóa các tài nguyên mà bạn đã tạo trong hướng dẫn này.

Xóa service Amazon ECS Express Mode:

aws ecs delete-express-gateway-service --service-arn <service-arn>

(Tùy chọn) Xóa cluster Amazon ECS:

aws ecs delete-cluster --cluster $ECS_CLUSTER

Lưu ý: Chỉ xóa cluster nếu workflow GitHub Actions đã tạo nó cho bạn. Nếu bạn đang sử dụng một cluster đã tồn tại với các service khác, hãy bỏ qua bước này để tránh làm gián đoạn các service đó.

Xóa image container khỏi Amazon ECR:

aws ecr batch-delete-image \
--repository-name $ECR_REPOSITORY \
--image-ids "$(aws ecr list-images --repository-name $ECR_REPOSITORY --query 'imageIds[*]' --output json)"
aws ecr delete-repository --repository-name $ECR_REPOSITORY

Xóa tài nguyên IAM:

aws iam detach-role-policy \
--role-name github-actions-ecs-role \
--policy-arn arn:aws:iam::${YOUR_ACCOUNT_ID}:policy/GitHubActionsECSExpressPolicy
aws iam detach-role-policy \
--role-name github-actions-ecs-role \
--policy-arn arn:aws:iam::${YOUR_ACCOUNT_ID}:policy/GitHubActionsECRPolicy
aws iam delete-policy \
--policy-arn arn:aws:iam::${YOUR_ACCOUNT_ID}:policy/GitHubActionsECSExpressPolicy
aws iam delete-policy \
--policy-arn arn:aws:iam::${YOUR_ACCOUNT_ID}:policy/GitHubActionsECRPolicy
aws iam delete-role --role-name github-actions-ecs-role
aws iam delete-open-id-connect-provider \
--open-id-connect-provider-arn arn:aws:iam::${YOUR_ACCOUNT_ID}:oidc-provider/token.actions.githubusercontent.com

Kết luận

Trong bài viết này, chúng tôi đã hướng dẫn bạn triển khai tự động cho Amazon ECS Express Mode bằng GitHub Actions. Bạn đã xây dựng một pipeline CI/CD tự động xây dựng và triển khai các ứng dụng container hóa của mình. Pipeline sử dụng OIDC để xác thực an toàn với các thông tin xác thực tạm thời để tự động kích hoạt triển khai khi bạn commit mã nguồn, để theo dõi phiên bản thông qua gắn thẻ image dựa trên commit, và cho khả năng rollback bằng lịch sử triển khai Amazon ECS. Bạn có thể mở rộng nền tảng này bằng cách thêm các bài kiểm tra tự động trước khi triển khai, triển khai các workflow phê duyệt cho các bản phát hành production, hoặc tích hợp các công cụ quét bảo mật để phát hiện các lỗ hổng trước khi chúng đến production.

Để tìm hiểu thêm, hãy xem tài liệu Amazon ECS Express Mode, GitHub Actions for AWS, Amazon ECS Deploy Express Service GitHub Action, và Các phương pháp hay nhất cho các service Amazon ECS Express Mode.

Bạn quan tâm đến trải nghiệm thực hành về ECS? Đăng ký tham gia một workshop thực hành có hướng dẫn


Về tác giả


Olawale Olaleye là Kiến trúc sư Giải pháp Chuyên gia Cấp cao về GenAI/ML tại AWS, có trụ sở tại Ireland, và là một Kubestronaut được chứng nhận. Với kinh nghiệm sâu rộng trong việc kiến trúc các workload container hóa quy mô doanh nghiệp, anh chuyên giúp các tổ chức hiện đại hóa cơ sở hạ tầng của họ trên các container, hoạt động AI/ML và bảo mật đám mây. Kết nối với anh ấy trên LinkedIn.


Guillaume Delacour là Kiến trúc sư Giải pháp Chuyên gia Cấp cao tại AWS, có trụ sở tại Pháp, nơi anh làm việc với các khách hàng kỹ thuật số bản địa trong 3 năm. Sở thích của anh bao gồm hiện đại hóa ứng dụng, công nghệ AWS Container và trải nghiệm nhà phát triển. Bạn có thể kết nối với anh ấy trên LinkedIn.

Leave a comment