AWS CICD
AWS Developer Tools & CI/CD Pipeline
01แนวคิด CI/CD (Continuous Integration / Delivery / Deployment)
CI/CD คือแนวคิดที่ทำให้การ build, test, และ deploy โค้ดเป็นแบบอัตโนมัติ เพื่อปล่อยซอฟต์แวร์ได้บ่อยและปลอดภัยขึ้น ก่อนจะเข้าบริการแต่ละตัวของ AWS ต้องแยกให้ออกว่า CI, Continuous Delivery, และ Continuous Deployment ต่างกันตรงไหน เพราะข้อสอบชอบถามเชิงนิยาม
| บริการ AWS | หน้าที่หลัก | เทียบกับเครื่องมือทั่วไป |
|---|---|---|
| CodeCommit | Source / Git repository (managed) | GitHub / GitLab |
| CodeBuild | Build & Test โค้ด | Jenkins build / CircleCI |
| CodeDeploy | Deploy ไปยัง EC2/Lambda/ECS/On-prem | Ansible / manual deploy |
| CodePipeline | Orchestrate ทุก stage เข้าด้วยกัน | Jenkins Pipeline |
| CodeArtifact | เก็บ & แชร์ software packages/dependencies | Nexus / Artifactory |
| CodeGuru | ML-powered code review & profiling | SonarQube + APM |
02CodeCommit (Git Repository & Authentication)
CodeCommit เป็น managed Git repository บน AWS — โค้ดเก็บใน private repos, scalable, integrate กับ IAM, และ encrypted (KMS) โดยอัตโนมัติ ไม่มี size limit ของ repo ตามที่ต้องจำเชิงตัวเลข แต่จุดที่ออกสอบจริงคือ การ authenticate และ notifications
วิธี Authentication เข้า CodeCommit
- SSH Keys — ผู้ใช้ configure SSH key ที่ผูกกับ IAM User (จัดการในหน้า IAM)
- HTTPS — ใช้ AWS CLI Credential helper หรือ Git Credentials (HTTPS Git credentials ที่ generate ให้ IAM User)
- ห้าม ใช้ username/password ของ AWS Console ตรงๆ และ ไม่ใช้ access keys ในการ git clone โดยตรง
Authorization & Encryption
- ควบคุมสิทธิ์ด้วย IAM Policies (เช่น จำกัด branch ที่ push ได้ด้วย IAM condition)
- Encryption at rest ด้วย AWS KMS, in transit ด้วย HTTPS/SSH
- Cross-account access ทำผ่าน IAM Roles + STS (AssumeRole) — ไม่ใช่การแชร์ credentials
Notifications & Integrations
CodeCommit ส่ง event ได้ผ่าน SNS / AWS Lambda / EventBridge เช่น เมื่อมีคน push, มี pull request, หรือ comment. เคสที่ใช้ SNS/Lambda มักเป็น: ป้องกัน branch หลัก, แจ้งเตือน deletion, trigger external build.
03CodeBuild & buildspec.yml (จุดออกสอบหนัก)
CodeBuild เป็น fully managed build service — compile source, run tests, สร้าง artifacts. ไม่ต้องจัดการ build server เอง, จ่ายตามเวลาที่ใช้ (per-minute). Source มาจาก CodeCommit/S3/GitHub/Bitbucket. คำสั่ง build ถูกนิยามใน buildspec.yml ที่อยู่ที่ root ของ source code (หรือกำหนด inline ก็ได้)
Phases ใน buildspec.yml (ต้องจำลำดับ)
- install — ติดตั้ง dependencies/packages ที่ build environment ต้องใช้
- pre_build — คำสั่งก่อน build เช่น login เข้า ECR, npm install
- build — คำสั่ง build จริง เช่น mvn package, docker build
- post_build — งานหลัง build เช่น docker push, สร้าง artifact, ส่ง notification
- env — กำหนด environment variables (plaintext / parameter-store / secrets-manager)
- artifacts — ระบุไฟล์ output ที่จะส่งไปเก็บใน S3
- cache — ระบุไฟล์/โฟลเดอร์ที่จะ cache ไป S3 เพื่อ build ครั้งหน้าเร็วขึ้น
version: 0.2
env:
variables:
JAVA_HOME: "/usr/lib/jvm/java-11"
parameter-store:
LOGIN_PASSWORD: /CodeBuild/dockerLoginPassword # จาก SSM Parameter Store
secrets-manager:
DB_PASSWORD: prod/db:password # จาก Secrets Manager
phases:
install:
runtime-versions:
java: corretto11
commands:
- echo Installing dependencies...
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws ecr get-login-password | docker login --username AWS --password-stdin $REPO_URI
build:
commands:
- echo Build started
- mvn package
post_build:
commands:
- echo Build completed, pushing image...
- docker push $REPO_URI:latest
artifacts:
files:
- target/my-app.jar
- appspec.yml
base-directory: .
cache:
paths:
- '/root/.m2/**/*'Environment Variables & Secrets
- variables — ค่า plaintext (ห้ามเก็บ secret ที่นี่)
- parameter-store — ดึงค่าจาก SSM Parameter Store
- secrets-manager — ดึงค่าจาก AWS Secrets Manager (เหมาะกับ password/credential ที่ rotate)
Local Build, VPC & Caching
- Local Build — ทำได้โดยติดตั้ง CodeBuild Agent บนเครื่อง (รันใน Docker) เพื่อ debug buildspec ลึกๆ ก่อน push
- CodeBuild สามารถรันใน VPC เพื่อเข้าถึง resource ส่วนตัว (RDS, ElastiCache, internal service)
- Caching เก็บได้ที่ S3 (เช่น dependencies) หรือ local cache เพื่อลดเวลา build
- Build environment เป็น Docker — ใช้ image ของ AWS หรือ custom image ของเราเองจาก ECR ได้
04CodeDeploy & appspec.yml + Lifecycle Hooks
CodeDeploy ทำหน้าที่ deploy application อัตโนมัติไปยัง EC2, on-premises, AWS Lambda, และ ECS ต้องติดตั้ง CodeDeploy Agent บน EC2/on-prem (ไม่ต้องสำหรับ Lambda/ECS). ไฟล์คุม deploy คือ appspec.yml — ตำแหน่งและเนื้อหาขึ้นกับ compute platform
Deployment Type: In-place vs Blue/Green
| หัวข้อ | In-place | Blue/Green |
|---|---|---|
| วิธีทำ | deploy ทับ instances เดิม | สร้างชุดใหม่ (green) แล้วสลับ traffic |
| รองรับ platform | EC2/On-prem เท่านั้น | EC2 (ผ่าน ASG/ELB), Lambda, ECS |
| Downtime/ความเสี่ยง | มีโอกาส downtime ระหว่าง deploy | ลด downtime, rollback ง่าย (สลับกลับ) |
| ค่าใช้จ่าย | ถูกกว่า (ไม่เพิ่ม instance) | แพงกว่าชั่วคราว (รันสองชุด) |
Deployment Configurations (ความเร็วในการกระจาย traffic)
- AllAtOnce — deploy ทุก instance พร้อมกัน เร็วสุด แต่ downtime สูง เสี่ยงสุด
- HalfAtATime — ครั้งละ 50% ของ instances
- OneAtATime — ครั้งละ 1 instance ช้าสุด แต่ปลอดภัยสุด
- Canary (Lambda/ECS) — ปล่อย traffic เป็น 2 ก้อน เช่น Canary10Percent5Minutes (10% ก่อน รอ 5 นาที แล้วปล่อยที่เหลือ)
- Linear (Lambda/ECS) — ปล่อย traffic เพิ่มเท่าๆ กันทุกช่วงเวลา เช่น Linear10PercentEvery3Minutes
- AllAtOnce สำหรับ Lambda/ECS = สลับทั้งหมดทันที
Lifecycle Hooks สำหรับ EC2/On-prem (ออกสอบบ่อยที่สุด)
ลำดับ hooks สำคัญมาก: ApplicationStop → DownloadBundle → BeforeInstall → Install → AfterInstall → ApplicationStart → ValidateService. หมายเหตุ: DownloadBundle และ Install เป็น step ที่ CodeDeploy agent ทำเอง เราเขียน script ใส่ hooks อื่นได้
- BeforeInstall — งานก่อนติดตั้ง เช่น backup ไฟล์เดิม, decrypt files
- AfterInstall — งานหลังไฟล์ลงแล้ว เช่น config, set permission
- ApplicationStart — สั่งเริ่ม service/แอป
- ValidateService — ตรวจว่า deploy สำเร็จ/health check (hook สุดท้าย)
version: 0.0
os: linux
files:
- source: /
destination: /var/www/html/
hooks:
BeforeInstall:
- location: scripts/backup.sh
timeout: 300
runas: root
AfterInstall:
- location: scripts/configure.sh
timeout: 180
runas: root
ApplicationStart:
- location: scripts/start_server.sh
timeout: 60
runas: root
ValidateService:
- location: scripts/health_check.sh
timeout: 60
runas: rootRollback
- Rollback เกิดได้ทั้ง อัตโนมัติ (เมื่อ deployment fail หรือ CloudWatch Alarm trigger) หรือ manual
- CodeDeploy rollback = deploy revision ที่ดี "ก่อนหน้า" ใหม่อีกครั้ง (re-deploy last known good) ไม่ใช่การ restore snapshot
05CodePipeline (Orchestration)
CodePipeline เป็นเครื่องมือ orchestrate workflow CI/CD แบบ visual — ร้อย stage ต่างๆ เข้าด้วยกัน: Source → Build → Test → Deploy (และ stage อื่นๆ ที่กำหนดเอง) เป็น backbone ที่เชื่อม CodeCommit/CodeBuild/CodeDeploy เข้าด้วยกัน
องค์ประกอบหลัก
- Stages — ขั้นตอนใน pipeline (Source, Build, Deploy ฯลฯ) แต่ละ stage มี action ได้หลายตัว (sequential/parallel)
- Artifacts — output ของแต่ละ stage ถูกเก็บใน Amazon S3 แล้วส่งต่อเป็น input ให้ stage ถัดไป (ผ่าน artifact store ที่เป็น S3 bucket)
- Manual Approval — เพิ่ม action ประเภท approval เพื่อให้คนกดอนุมัติก่อนไป stage ถัดไป (= Continuous Delivery)
- EventBridge — trigger pipeline เมื่อมี event (เช่น push เข้า CodeCommit) เป็นวิธีที่แนะนำแทน polling
06CodeArtifact (Package Management)
CodeArtifact เป็น artifact/package repository แบบ managed สำหรับเก็บและแชร์ software dependencies ทำงานร่วมกับ package manager มาตรฐาน: npm, Maven/Gradle, pip, NuGet, yarn, twine ฯลฯ ช่วยให้ทีมไม่ต้องตั้ง Nexus/Artifactory เอง
- สามารถตั้งเป็น proxy ของ public repository (เช่น npmjs, PyPI, Maven Central) — เมื่อขอ package ที่ไม่มี จะดึงจาก upstream มา cache ไว้
- ควบคุมสิทธิ์ด้วย IAM และ resource policies (domain/repository policy)
- Integrate กับ CodeBuild เพื่อดึง dependency ภายในขั้น build อย่างปลอดภัย
- EventBridge สามารถ trigger เมื่อมี package version ใหม่ถูก publish (เช่น trigger pipeline ให้ build ใหม่)
07CodeGuru & CodeStar
Amazon CodeGuru เป็นบริการ ML สองส่วน: CodeGuru Reviewer (วิเคราะห์โค้ดเชิงสถิติหา bug/ช่องโหว่/แนวทางที่ดี) และ CodeGuru Profiler (วิเคราะห์ runtime performance ของแอปที่กำลังรัน เพื่อหา bottleneck และลดต้นทุน CPU)
| บริการ | ทำงานช่วงไหน | หน้าที่ |
|---|---|---|
| CodeGuru Reviewer | ก่อน deploy (static analysis) | หา bug, security issue, resource leak, แนะนำปรับปรุงโค้ด |
| CodeGuru Profiler | ขณะ runtime (production) | หา performance bottleneck, CPU/heap usage, ลดต้นทุน |
CodeStar
CodeStar เป็น unified UI ที่รวมเครื่องมือ CI/CD ทั้งหมด (CodeCommit, CodeBuild, CodeDeploy, CodePipeline) ในที่เดียว ช่วยตั้ง project + CI/CD pipeline ได้รวดเร็วผ่าน template. หมายเหตุ AWS CodeStar (เดิม) อยู่ในช่วง phase-out แต่ยังพบในขอบเขตข้อสอบ DVA-C02
คำถามทบทวน
ทดสอบความเข้าใจหัวข้อ AWS CICD
24 ข้อ · เลือกคำตอบเพื่อดูเฉลยและคำอธิบาย
1.ทีมพัฒนาต้องการให้ทุก commit ที่ผ่าน automated test ถูก deploy ขึ้น production โดยอัตโนมัติ ไม่มีการกดอนุมัติโดยมนุษย์ แนวทางนี้เรียกว่าอะไร?
2.นักพัฒนาต้องการ clone repository ใน CodeCommit ผ่าน HTTPS อย่างปลอดภัยโดยผูกกับ IAM user วิธีใดเหมาะสมที่สุด?
3.ใน buildspec.yml นักพัฒนาต้องการ login เข้า Amazon ECR ก่อน build Docker image ควรวางคำสั่งนี้ใน phase ใด?
4.บริษัทต้องการเก็บ database password ที่ใช้ตอน build ใน CodeBuild โดยรองรับการ rotate อัตโนมัติ ควรอ้างอิงค่าใน buildspec.yml จากแหล่งใด?
5.การ build ใน CodeBuild ช้ามากเพราะต้อง download Maven dependencies ใหม่ทุกครั้ง ควรทำอย่างไรเพื่อลดเวลา build?
6.build ของ CodeBuild ต้องเชื่อมต่อกับ RDS database ที่อยู่ใน private subnet ของ VPC จะ configure อย่างไร?
7.ใน appspec.yml สำหรับ EC2 นักพัฒนาต้องการรัน script ตรวจ health check หลังจากแอปเริ่มทำงานแล้ว เพื่อยืนยันว่า deploy สำเร็จ ควรใส่ใน lifecycle hook ใด?
8.บริษัทต้องการ deploy แอปบน EC2 โดยลดความเสี่ยง downtime และสามารถ rollback ได้ทันทีโดยสลับ traffic กลับ deployment type ใดเหมาะสม?
9.ทีมต้องการ deploy Lambda function เวอร์ชันใหม่โดยปล่อย traffic 10% ก่อน รอ 5 นาที แล้วค่อยปล่อยที่เหลือทั้งหมด ควรใช้ deployment configuration ใด?
10.Deployment บน EC2 ต้องการความปลอดภัยสูงสุด ยอมให้ deploy ช้าได้ โดย deploy ทีละ instance เพื่อให้ service ยังคงพร้อมใช้งานเสมอ ควรเลือก deployment config ใด?
11.ใน CodePipeline artifacts ที่ส่งต่อระหว่าง stage ถูกจัดเก็บที่ใด?
12.ต้องการให้ CodePipeline เริ่มทำงานทันทีเมื่อมีการ push code เข้า CodeCommit แทนการ poll เป็นระยะ ควรใช้บริการใด?
13.บริษัทใช้ Continuous Delivery และต้องการให้มีคนตรวจสอบก่อน deploy ขึ้น production จะเพิ่มอะไรใน CodePipeline?
14.องค์กรต้องการ host private npm และ pip packages ภายในและตั้งเป็น proxy ของ public registry เพื่อ cache dependencies ควรใช้บริการใด?
15.ทีมต้องการให้มีการวิเคราะห์โค้ดอัตโนมัติด้วย ML เพื่อหา bug, resource leak, และช่องโหว่ด้านความปลอดภัย ก่อน merge ควรใช้บริการใด?
16.แอปที่รันใน production ใช้ CPU สูงและมี cost มาก ทีมต้องการหา bottleneck ของ performance ขณะ runtime ควรใช้บริการใด?
17.ใน appspec.yml ของ deployment บน EC2 นักพัฒนาต้องการ backup ไฟล์เดิมก่อนที่ไฟล์ใหม่จะถูกติดตั้ง ควรใส่ script ใน hook ใด?
18.CodeDeploy ทำ deployment ไปยัง EC2 fleet แล้วล้มเหลว ระบบควรกลับสู่เวอร์ชันที่ทำงานได้ก่อนหน้าโดยอัตโนมัติ กลไก rollback ของ CodeDeploy ทำงานอย่างไร?
19.ก่อน push buildspec.yml ขึ้นจริง นักพัฒนาต้องการ debug และทดสอบ build steps บนเครื่อง local จะทำอย่างไร?
20.deployment บน ECS แบบ Blue/Green ต้องการรัน script ทดสอบกับ task ใหม่ (green) ผ่าน test listener ก่อนสลับ production traffic ควรใช้ hook ใดใน appspec.yml ของ ECS?
21.ทีมต้องการ trigger CodePipeline ให้ build ใหม่อัตโนมัติเมื่อมี package version ใหม่ถูก publish ใน CodeArtifact จะทำอย่างไร?
22.นักพัฒนาต้องการให้แต่ละ IAM user เข้าถึง CodeCommit ผ่าน SSH การ associate SSH public key ทำที่ใด?
23.CodePipeline ทำงานล้มเหลวที่ Deploy stage โดยขึ้น error ว่าไม่มีสิทธิ์เรียก CodeDeploy สาเหตุที่เป็นไปได้มากที่สุดคืออะไร?
24.องค์กรต้องการ unified dashboard ที่รวม CodeCommit, CodeBuild, CodeDeploy, CodePipeline เพื่อเริ่มต้นโปรเจกต์ CI/CD ได้รวดเร็วผ่าน template ควรใช้บริการใด?