Capstone (2): Pipeline Production Hoàn Chỉnh

K
Kai··4 min read

Hạ tầng đích đã sẵn ở bài 15. Giờ nối phần còn lại: một pipeline đưa code đi trọn đường từ commit tới production trên cụm đó. Đây là lúc mọi mảnh của series khớp vào nhau — CodeCommit, CodeBuild (có test), cổng phê duyệt, và CodeDeploy blue/green với rollback — thành một dây chuyền duy nhất. Ta chạy nó thật với một thay đổi code thật, rồi dọn sạch toàn bộ.

💰 Chi phí

Lần chạy này tạm có tới bốn instance (blue + green) cộng ALB. Mục dọn dẹp ở cuối xoá toàn bộ tài nguyên series — chạy nó ngay sau khi xem kết quả.

Pipeline hoàn chỉnh: bốn stage

Pipeline capstone có bốn stage, mỗi stage là một bài học của series:

{"pipeline": {
  "name": "awscicd-cap-pipeline", "pipelineType": "V2",
  "roleArn": "...awscicd-codepipeline-role",
  "artifactStore": {"type": "S3", "location": "awscicd-artifacts-..."},
  "stages": [
    {"name": "Source",          "actions": [{ "...CodeCommit",  "config": {"RepositoryName":"awscicd-demo-app","BranchName":"main"}, "out":"Src" }]},
    {"name": "BuildAndTest",     "actions": [{ "...CodeBuild",   "config": {"ProjectName":"awscicd-demo-build"}, "in":"Src", "out":"Built" }]},
    {"name": "Approval",         "actions": [{ "...Manual" }]},
    {"name": "DeployBlueGreen",  "actions": [{ "...CodeDeploy",  "config": {"ApplicationName":"awscicd-demo","DeploymentGroupName":"awscicd-cap-dg"}, "in":"Built" }]}
  ]
}}

Source kéo code (bài 3), BuildAndTest build và chạy pytest làm cổng (bài 4–6), Approval chặn chờ người duyệt (bài 13), DeployBlueGreen triển khai blue/green lên ASG sau ALB (bài 11, 15). Một pipeline gói cả series.

Chạy end-to-end với một thay đổi thật

Đổi ứng dụng (heading lên v3) và push — đúng cách lập trình viên làm hằng ngày:

$ sed -i '' 's/v2/v3/' index.html
$ git commit -am "Bump app to v3 for capstone" && git push origin main

Pipeline tự chạy. Theo dõi từng stage:

$ aws codepipeline get-pipeline-state --name awscicd-cap-pipeline \
    --query 'stageStates[].[stageName,latestExecution.status]' --output text
Source:Succeeded        BuildAndTest:InProgress  Approval:None         DeployBlueGreen:None
Source:Succeeded        BuildAndTest:Succeeded   Approval:InProgress   DeployBlueGreen:None

Pipeline dừng ở Approval — build và test đã qua, giờ chờ người duyệt. Duyệt:

$ TOKEN=$(aws codepipeline get-pipeline-state --name awscicd-cap-pipeline \
    --query "stageStates[?stageName=='Approval'].actionStates[0].latestExecution.token | [0]" --output text)
$ aws codepipeline put-approval-result --pipeline-name awscicd-cap-pipeline \
    --stage-name Approval --action-name ManualApproval \
    --result summary="capstone approve",status=Approved --token "$TOKEN"

Blue/green deploy chạy (dựng fleet green, validate, chuyển traffic). Vài phút sau:

$ aws codepipeline get-pipeline-state --name awscicd-cap-pipeline \
    --query 'stageStates[].[stageName,latestExecution.status]' --output text
Source  Succeeded
BuildAndTest    Succeeded
Approval    Succeeded
DeployBlueGreen Succeeded

Cả bốn stage Succeeded. Kiểm chứng phiên bản mới lên production qua ALB:

$ curl http://awscicd-cap-alb-...elb.amazonaws.com/
... awscicd demo app — v3 ...

v3 — phiên bản vừa commit — giờ phục vụ thật, qua một dây chuyền không ai gõ lệnh deploy nào. Vì là blue/green, suốt quá trình ALB luôn trỏ tới một fleet khỏe: người dùng không thấy gián đoạn, và nếu green hỏng validation hay alarm kêu, rollback chỉ là trỏ ALB về blue đang sống.

   git push (v3) → CodeCommit main
        │ trigger
   ┌──────────────────── awscicd-cap-pipeline (V2) ────────────────────┐
   │ Source        BuildAndTest      Approval        DeployBlueGreen     │
   │ CodeCommit ─▶ CodeBuild+pytest ─▶ [người duyệt] ─▶ CodeDeploy B/G   │
   │               (cổng test)                          ↓                │
   └────────────────────────────────────────────────── │ ───────────────┘
                                      green ASG ◀── copy ──┤  shift traffic
                                          │ validate       │  qua ALB
                                          ▼                ▼
                              ALB ─▶ fleet khỏe (v3)   blue giữ lại để rollback

🧹 Dọn dẹp toàn bộ series

Capstone xong, dọn tất cả tài nguyên đã tạo qua 16 bài. Hạ tầng capstone (tốn tiền) trước:

$ aws codepipeline delete-pipeline --name awscicd-cap-pipeline
$ aws autoscaling delete-auto-scaling-group --auto-scaling-group-name awscicd-cap-asg --force-delete
$ aws autoscaling delete-auto-scaling-group --auto-scaling-group-name CodeDeploy_awscicd-cap-dg_d-... --force-delete
$ aws elbv2 delete-load-balancer --load-balancer-arn <cap-alb>
$ aws elbv2 delete-target-group --target-group-arn <cap-tg>
$ aws ec2 delete-launch-template --launch-template-name awscicd-cap-lt
$ aws deploy delete-deployment-group --application-name awscicd-demo --deployment-group-name awscicd-cap-dg

Rồi phần nền (gần như free nhưng nên xoá cho sạch):

$ aws deploy delete-deployment-group --application-name awscicd-demo --deployment-group-name awscicd-demo-dg
$ aws deploy delete-application --application-name awscicd-demo
$ aws codebuild delete-project --name awscicd-demo-build
$ aws codecommit delete-repository --repository-name awscicd-demo-app
$ aws ssm delete-parameter --name /cicddemo/greeting; aws ssm delete-parameter --name /cicddemo/api-key
$ aws secretsmanager delete-secret --secret-id awscicd/demo/db --force-delete-without-recovery
$ aws s3 rm s3://awscicd-artifacts-... --recursive && aws s3api delete-bucket --bucket awscicd-artifacts-...
$ aws ec2 delete-security-group --group-id <sg>
# các IAM role + instance profile: detach policy, remove-role-from-instance-profile, rồi delete

Kiểm lại trên console không còn EC2/ALB/ASG nào sót — đây là phần tốn tiền dễ quên nhất.

Tổng kết series

Bạn đã đi từ "CI/CD là gì" tới một pipeline production hoàn chỉnh trên AWS, tất cả bằng CLI. Những gì gói lại trong capstone: CodeCommit giữ code; CodeBuild build và chạy test làm cổng chặn (kèm secret từ SSM/Secrets Manager được che, test report); CodeArtifact cho package nội bộ; CodeDeploy triển khai lên EC2 với in-place, lifecycle hooks, Auto Scaling Group, và blue/green + rollback zero-downtime; CodePipeline điều phối tất cả qua Source → Build → Approval → Deploy, có cổng phê duyệt và thông báo. Xuyên suốt: mỗi dịch vụ chạy dưới một IAM service role least-privilege, và mọi bài đều test thật rồi dọn sạch.

Đi tiếp từ đâu

Series dừng ở một pipeline vững chắc, còn nhiều hướng đào sâu. Hạ tầng-as-code: dựng chính pipeline và hạ tầng bằng CloudFormation, CDK, hay Terraform (xem series Terraform) thay vì lệnh CLI rời. Mục tiêu deploy khác: CodeDeploy lên ECS (blue/green container) hay Lambda (canary). Quy mô lớn: pipeline cross-account (build ở tài khoản này, deploy sang tài khoản kia), và CodeCatalyst — dịch vụ DevOps hợp nhất mới của AWS gom source/CI/CD/issue vào một nơi. Mỗi hướng xây trên đúng nền 16 bài này đã đặt, và giờ bạn có đủ gốc để tự đọc tài liệu mà đi tiếp.