CI/CD Là Gì và Bộ Developer Tools Của AWS

K
Kai··6 min read·1 views

Deploy một ứng dụng lần đầu thì dễ: SSH vào server, git pull, chạy lại service, xong. Vấn đề bắt đầu ở lần thứ mười, khi bạn phải nhớ đúng thứ tự các bước lúc nửa đêm, khi một bước bị bỏ sót làm hỏng production, hoặc khi người mới vào nhóm không biết "deploy" thực ra gồm những gì. Quy trình nằm trong đầu một người không phải là quy trình. Series này dựng cái thay thế: một pipeline tự động đưa code từ lúc commit tới lúc chạy trên server, bằng bộ công cụ CI/CD của chính AWS, và mọi thứ làm bằng AWS CLI.

Bài đầu không tạo tài nguyên nào. Ta cần hiểu trước CI/CD là gì, AWS có những mảnh ghép nào, và chúng ráp lại ra sao — để các bài sau gõ lệnh mà biết mình đang dựng cái gì.

CI và CD: hai chữ hay bị gộp

Continuous Integration (CI) là thói quen tích hợp code thường xuyên: mỗi lần đẩy code lên, một hệ thống tự động build lại và chạy test, để lỗi lộ ra trong vài phút thay vì lúc gần release. Continuous Delivery (CD) đi tiếp một bước: sau khi build và test xong, phần mềm luôn ở trạng thái sẵn sàng phát hành, và việc đưa nó lên môi trường nào là một thao tác bấm nút (hoặc tự động). Tài liệu AWS mô tả CodePipeline là "dịch vụ continuous delivery để mô hình hóa, trực quan hóa và tự động hóa các bước cần thiết để phát hành phần mềm".

Cách hình dung dễ nhất là một dây chuyền: code mới đi vào một đầu, chạy qua các chặng (source, build, test, staging, production), rồi ra đầu kia ở dạng sẵn sàng chạy production. Mỗi chặng làm một việc, chặng trước xong mới tới chặng sau, và nếu một chặng fail thì dây chuyền dừng — không có code hỏng nào lọt được tới production.

   commit code
       │
       ▼
  ┌─────────┐   ┌─────────┐   ┌─────────┐   ┌─────────────┐
  │ Source  │──▶│  Build  │──▶│  Test   │──▶│   Deploy    │──▶ production
  │ (repo)  │   │ biên dịch│   │ chạy test│   │ lên server │
  └─────────┘   └─────────┘   └─────────┘   └─────────────┘
       fail ở bất kỳ chặng nào  ──▶  dừng dây chuyền, không deploy

Bộ Developer Tools của AWS

AWS không gói CI/CD thành một sản phẩm duy nhất mà thành vài dịch vụ rời, mỗi cái lo một chặng. Ghép chúng lại là việc của bạn — và đó cũng là điểm mạnh: thay được từng mảnh. Năm dịch vụ ta dùng trong series:

CodeCommit lo chặng source. Nó là dịch vụ Git hosting của AWS — một repo Git riêng tư, mã hóa, tích hợp sẵn với IAM để phân quyền. Code của bạn nằm ở đây, và CodePipeline lắng nghe mỗi khi có commit mới để khởi động dây chuyền. (Một lưu ý thật thà: AWS đã ngừng nhận khách hàng mới cho CodeCommit từ 2024, nên tài khoản chưa từng dùng có thể không tạo được repo; ta dùng nó ở đây vì nó là mảnh source gốc của bộ Code* và tích hợp gọn nhất với phần còn lại.)

CodeBuild lo chặng build và test. Tài liệu mô tả nó là "dịch vụ build được quản lý hoàn toàn, biên dịch mã nguồn, chạy test và tạo ra artifact, tự co giãn". Bạn khai các bước build trong một file buildspec.yml, CodeBuild dựng một môi trường tạm, chạy các bước đó, rồi vứt môi trường đi — không có build server nào để bạn nuôi.

CodeDeploy lo chặng deploy. Tài liệu: "dịch vụ tự động hóa việc triển khai ứng dụng lên EC2, máy on-premises, hàm Lambda serverless, hoặc service ECS". Series này nhắm vào EC2: CodeDeploy đẩy phiên bản mới lên các instance, chạy các script vòng đời (dừng app cũ, cài bản mới, khởi động, kiểm tra), và làm được kiểu in-place lẫn blue/green.

CodePipeline là nhạc trưởng. Nó mô hình hóa cả dây chuyền thành các stage, mỗi stage chứa các action, và điều phối: chạy stage này xong, lấy kết quả (artifact) chuyển sang stage kế. Bản thân nó không build hay deploy gì — nó gọi các dịch vụ kia làm.

CodeArtifact là kho lưu package nội bộ (npm, pip, Maven...). Khi build cần thư viện riêng của công ty, hoặc muốn kiểm soát phiên bản dependency, CodeArtifact đứng giữa.

Ráp lại thành một dây chuyền

Năm mảnh trên ghép thành bức tranh ta sẽ dựng dần qua series:

  CodeCommit repo
      │  (có commit mới)
      ▼
   ┌──────────────────── CodePipeline ────────────────────┐
   │  Source         Build              Deploy             │
   │  (kéo code)  ▶  CodeBuild      ▶   CodeDeploy         │
   │              (buildspec.yml)      (appspec.yml)       │
   └──────┬──────────────┬───────────────────┬────────────┘
          │              │                   │
       artifact   CodeArtifact          EC2 / ASG
       lên S3     (package nội bộ)    (qua agent)

CodePipeline cầm nhịp; CodeBuild biến source thành artifact (gói code đã build) cất trên S3; CodeDeploy lấy artifact đó đưa lên các EC2 instance. CodeCommit cấp nguồn, CodeArtifact cấp package khi build cần. Ta sẽ mổ từng mảnh riêng (Part II–IV), rồi ghép chúng bằng CodePipeline (Part V), và khép lại bằng một pipeline hoàn chỉnh ở capstone.

Vì sao dùng bộ Code* thay vì Jenkins hay GitHub Actions

Câu hỏi hợp lý, vì các công cụ khác cũng làm CI/CD tốt. Lý do chọn bộ Developer Tools của AWS khi đích đến là hạ tầng AWS: nó tích hợp sâu với IAM (phân quyền bằng role thay vì lưu khóa), chạy trong VPC của bạn (build/deploy chạm được tài nguyên nội bộ không qua Internet), và được AWS quản lý hoàn toàn (không có runner hay build server nào để vận hành). Đổi lại, nó gắn chặt với AWS hơn. Không có lựa chọn nào "đúng" tuyệt đối; series này tập trung vào trường hợp hạ tầng nằm trên AWS, nơi bộ Code* phát huy nhiều nhất.

Chuẩn bị

Series dựng mọi thứ bằng AWS CLI v2. Kiểm tra đã cài và cấu hình:

$ aws --version
aws-cli/2.34.33 Python/3.14.4 Darwin/25.3.0 exe/arm64

$ aws sts get-caller-identity --output table
-----------------------------------------------------
|                 GetCallerIdentity                 |
+---------+-----------------------------------------+
|  Account|  111122223333                           |
|  Arn    |  arn:aws:iam::111122223333:user/admin   |
|  UserId |  AIDAEXAMPLEID...                        |
+---------+-----------------------------------------+

get-caller-identity xác nhận CLI đang dùng đúng tài khoản và danh tính nào — luôn chạy nó trước khi bắt đầu để không lỡ tay thao tác nhầm tài khoản (mã tài khoản thật ở đây đã thay bằng 111122223333). Series dùng region ap-southeast-1; bạn có thể đặt region mặc định:

$ aws configure get region
ap-southeast-1

Bạn cần quyền IAM đủ để tạo các tài nguyên Code*, S3, EC2, IAM role. Lab bám free-tier khi có thể; những bài có EC2/ALB sẽ tốn vài cent nếu để chạy lâu, nên mỗi bài đều có bước dọn dẹp.

Tổng kết

CI tự động build và test mỗi lần đẩy code; CD giữ phần mềm luôn sẵn sàng phát hành. AWS chia CI/CD thành các dịch vụ rời: CodeCommit giữ code, CodeBuild build và test, CodeDeploy deploy (ta nhắm EC2), CodePipeline điều phối, CodeArtifact cấp package. Bức tranh tổng thể là một dây chuyền CodeCommit → Source → Build → Deploy → EC2 mà ta sẽ dựng dần.

Bài tới đặt nền cho mọi thứ sau này: tạo các IAM service role mà CodeBuild, CodeDeploy và CodePipeline cần để hoạt động, cùng một bucket S3 làm nơi chứa artifact — tất cả bằng AWS CLI. Xong nền đó, bài 3 sẽ dựng repo CodeCommit và đẩy code thật lên.