Capstone (2): Pipeline Production Hoàn Chỉnh
You've reached the end
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.
You've reached the end