# Syllabus học Packer

# TUẦN 0 - Nền tảng tư duy

### Ngày 1: Triết lý Immutable Infrastructure & vị trí của Packer

*   **Mục tiêu:** Hiểu vì sao Packer tồn tại, không chỉ cách chạy nó.
    
*   **Nội dung:**
    
    *   Lý thuyết: Immutable vs mutable infra, config drift, so sánh Packer build với Docker build layer; pipeline chuẩn `Source → Packer → Golden Image → Terraform → Production`.
        
    *   Thực hành: Cài Packer, `packer version`, `packer plugins install github.com/hashicorp/amazon`.
        
*   **Mini-Project:** Vẽ sơ đồ pipeline image factory dự kiến cho hệ thống của bạn (base → hardened → app image).
    

# TUẦN 1 - Sử dụng thành thạo HCL2 & Core usage

### Ngày 2: Cấu trúc HCL2 Template

*   **Mục tiêu:** Nắm 5 block chính và thứ tự thực thi thật.
    
*   **Nội dung:**
    
    *   Lý thuyết: `packer{}`, `variable{}`, `local{}`, `data{}`, `source{}`, `build{}`.
        
    *   Thực hành: Viết template tối giản build `amazon-ebs` từ Ubuntu AMI, chạy `packer init` + `packer validate`.
        
*   **Mini-Project:** Template build 1 AMI Nginx cơ bản.
    

### Ngày 3: Variables, Locals, Data Sources

*   **Mục tiêu:** Tham số hóa toàn bộ template.
    
*   **Nội dung:**
    
    *   Lý thuyết: `variable` validation/sensitive, `local` computed values, `data "amazon-ami"` để tự động lấy AMI mới nhất.
        
    *   Thực hành: Tách file `variables.pkr.hcl` + `*.pkrvars.hcl`, chạy `-var-file`.
        
*   **Mini-Project:** Refactor template Ngày 2 để region/instance\_type/tags đều là biến, dùng `data` source lấy AMI base tự động thay vì hardcode AMI ID.
    

### Ngày 4: Builders cơ bản

*   **Mục tiêu:** Thành thạo `amazon-ebs`, `docker`.
    
*   **Nội dung:**
    
    *   Lý thuyết: Communicator (SSH), lifecycle build cơ bản (launch → connect → provision → snapshot → cleanup).
        
    *   Thực hành: Build cùng 1 app image cho cả AMI và Docker image từ 1 template dùng nhiều `source`.
        
*   **Mini-Project:** Không, gộp vào Ngày 8.
    

### Ngày 5: Builders nâng cao - Multi-cloud

*   **Mục tiêu:** Biết builder cho các cloud khác.
    
*   **Nội dung:**
    
    *   Lý thuyết: `amazon-chroot` (build không cần launch instance mới) vs `amazon-ebs`; `azure-arm`; `googlecompute`; `vsphere-iso` cho on-prem.
        
    *   Thực hành: Build thử `amazon-chroot` trên 1 EC2 instance, so sánh thời gian build với `amazon-ebs`.
        

### Ngày 6: Provisioners

*   **Mục tiêu:** Thành thạo cấu hình OS bên trong image.
    
*   **Nội dung:**
    
    *   Lý thuyết: `shell`, `shell-local`, `file`, `ansible`; `only`/`except`; `on_failure` (`cleanup`, `abort`).
        
    *   Thực hành: Viết provisioner cài Nginx + copy config file + chạy Ansible playbook.
        

### Ngày 7: Post-processors & Manifest

*   **Mục tiêu:** Xuất metadata phục vụ pipeline downstream.
    
*   **Nội dung:**
    
    *   Lý thuyết: `manifest`, `compress`, `checksum`, `docker-push`; chain post-processor.
        
    *   Thực hành: Xuất `manifest.json` chứa AMI ID, đọc bằng `jq` trong script CI.
        

### Ngày 8: Multi-builder & Parallel build

*   **Mục tiêu:** Build song song nhiều target từ 1 source logic.
    
*   **Nội dung:**
    
    *   Lý thuyết: `build{}` block với nhiều `sources`, biến `-only`.
        
    *   Thực hành: Build đồng thời AMI (us-east-1, ap-southeast-1) + Docker image.
        
*   **Mini-Project:** Template "1 nguồn, nhiều đích" build image Nginx+app cho AWS 2 region + Docker, output manifest hợp nhất.
    

### Ngày 9: Communicator (SSH/WinRM internals)

*   **Mục tiêu:** Hiểu kênh giao tiếp Packer ↔ instance tạm.
    
*   **Nội dung:**
    
    *   Lý thuyết: SSH handshake, key pair tạm Packer tự sinh, timeout tuning (`ssh_timeout`), bootstrap script.
        
    *   Thực hành: Chạy `packer build -debug` để thấy từng bước dừng, quan sát key pair/SG tạm trên AWS Console.
        

### Ngày 10: Ôn tập & Mini-Project tổng hợp Tuần 1

*   **Mini-Project:** Pipeline hoàn chỉnh: build AMI Nginx + app từ biến hóa đầy đủ, provision qua Ansible, xuất manifest, build song song 2 region.
    

# TUẦN 2 - Internals (Plugin architecture, Go source)

### Ngày 11: Kiến trúc Plugin-based & go-plugin

*   **Mục tiêu:** Hiểu vì sao Packer 1.7+ tách plugin.
    
*   **Nội dung:**
    
    *   Lý thuyết: `go-plugin` (RPC/gRPC) - cơ chế chung với Terraform/Vault/Nomad; lý do tách: independent release, giảm core size.
        
    *   Thực hành: `packer plugins installed`, xem binary plugin nằm ở đâu (`~/.config/packer/plugins/`).
        

### Ngày 12: Packer Core object & Build lifecycle

*   **Mục tiêu:** Hiểu luồng nội bộ khi chạy `packer build`.
    
*   **Nội dung:**
    
    *   Lý thuyết: `core.Build()`, mỗi build 1 goroutine, context cancellation khi Ctrl-C → graceful cleanup.
        
    *   Thực hành: Ctrl-C giữa chừng 1 build AMI, quan sát AWS tự cleanup instance/SG tạm.
        

### Ngày 13: HCL2 parsing pipeline

*   **Mục tiêu:** Hiểu từ file `.pkr.hcl` đến Go struct.
    
*   **Nội dung:**
    
    *   Lý thuyết: `hashicorp/hcl/v2` → AST → `hcldec` decode → `cty` type system (chung nền tảng với Terraform).
        
    *   Thực hành: Đọc source `packer-plugin-sdk/hcl2helper`.
        

### Ngày 14: Plugin SDK - interface Builder/Provisioner/PostProcessor

*   **Mục tiêu:** Nắm interface bắt buộc mọi plugin phải implement.
    
*   **Nội dung:**
    
    *   Lý thuyết: `Prepare()`, `Run()`, `Cancel()`.
        
    *   Thực hành: Đọc source `packer-plugin-amazon` để thấy implement thật.
        

### Ngày 15: Tự viết custom Provisioner plugin

*   **Mục tiêu:** Thực chiến internals.
    
*   **Nội dung:**
    
    *   Thực hành: Viết plugin Go đơn giản (in system info), compile, cài local, gọi trong template.
        
*   **Mini-Project:** Provisioner plugin custom "print build metadata" hoạt động end-to-end.
    

### Ngày 16: Tự viết custom Post-processor plugin

*   **Mục tiêu:** Mở rộng thêm 1 loại plugin khác.
    
*   **Nội dung:**
    
    *   Thực hành: Viết post-processor ghi thêm metadata (build time, git commit) vào file JSON riêng.
        

### Ngày 17: Debug RPC & Plugin handshake

*   **Mục tiêu:** Biết debug khi plugin lỗi.
    
*   **Nội dung:**
    
    *   Lý thuyết: `PACKER_LOG=1`, `PACKER_LOG_PATH`; lỗi "plugin handshake failed" thường do version mismatch.
        
    *   Thực hành: Cố tình gây lỗi handshake (sai version plugin), đọc log để chẩn đoán.
        

### Ngày 18: Source Code Reading Roadmap

*   **Mục tiêu:** Có lộ trình đọc code hiệu quả thay vì đọc lan man.
    
*   **Nội dung:** Đọc theo thứ tự: `packer-plugin-sdk` → `packer` core → `packer-plugin-amazon` → `packer-plugin-docker` → `packer-plugin-ansible`.
    
*   **Mini-Project:** Viết note tóm tắt kiến trúc mỗi repo (1 trang/repo).
    

# TUẦN 3 - AWS/Cloud Internals & Windows Image Engineering

### Ngày 19: AMI Internals

*   **Mục tiêu:** Hiểu quan hệ AMI ↔ EBS Snapshot ↔ Volume.
    
*   **Nội dung:**
    
    *   Lý thuyết: `AMI → Snapshot → EBS Volume → EC2`; Block Device Mapping.
        
    *   Thực hành: Trace 1 AMI trong Console, xem snapshot backing nó, tính chi phí lưu trữ.
        

### Ngày 20: Launch Template & Block Device Mapping nâng cao

*   **Mục tiêu:** Kết nối image với hạ tầng launch.
    
*   **Nội dung:**
    
    *   Lý thuyết: Launch Template version, ENA/NVMe, volume encryption khi build.
        
    *   Thực hành: Config `launch_block_device_mappings` trong Packer template, verify volume type sau build.
        

### Ngày 21: amazon-ebs vs amazon-chroot - internals sâu

*   **Mục tiêu:** Hiểu tradeoff kỹ thuật thật sự, không chỉ "cái nào nhanh hơn".
    
*   **Nội dung:**
    
    *   Lý thuyết: chroot mount volume trực tiếp vào instance đang chạy Packer (không launch instance mới) → nhanh nhưng phải chạy trên EC2, cùng architecture.
        
    *   Thực hành: Benchmark thời gian build 2 phương pháp trên cùng 1 EC2.
        

### Ngày 22: Windows Image Engineering - WinRM

*   **Mục tiêu:** Mở rộng khỏi Linux-centric.
    
*   **Nội dung:**
    
    *   Lý thuyết: `communicator = "winrm"`, WinRM port/auth khác SSH hoàn toàn.
        
    *   Thực hành: Build thử 1 Windows AMI cơ bản, provisioner PowerShell cài IIS.
        

### Ngày 23: Windows - Sysprep, EC2Launch/EC2Config, Chocolatey

*   **Mục tiêu:** Build Windows image production-ready.
    
*   **Nội dung:**
    
    *   Lý thuyết: Vì sao cần Sysprep trước khi tạo AMI (reset SID); EC2Launch v2 vs EC2Config cũ; Chocolatey để cài package như apt/yum.
        
    *   Thực hành: Template Windows Server hoàn chỉnh: cài app qua Chocolatey → Sysprep → tạo AMI.
        
*   **Mini-Project:** Windows base image chuẩn hóa cho công ty (updates + agent monitoring + hardening cơ bản).
    

### Ngày 24: So sánh internals Azure/GCP

*   **Mục tiêu:** Không bị khóa tư duy vào AWS.
    
*   **Nội dung:**
    
    *   Lý thuyết: Azure managed image/Shared Image Gallery vs GCP image family; khác biệt về snapshot/versioning.
        
    *   Thực hành: Build 1 image tối giản trên Azure hoặc GCP, so sánh manifest output với AWS.
        

# TUẦN 4 - Image Factory Architecture & Security

### Ngày 25: Image Factory Architecture - Image Lineage

*   **Mục tiêu:** Thiết kế hệ thống phân lớp image, không build 1 image "phẳng" cho mọi thứ.
    
*   **Nội dung:**
    
    *   Lý thuyết: `Base Image → Hardened Image → Runtime Image → Application Image`; image inheritance, image promotion.
        
    *   Thực hành: Thiết kế sơ đồ 4 lớp cho hệ thống thật (vd: Amazon Linux → CIS Hardened → Company Base → Product Image).
        

### Ngày 26: Xây dựng Base Image & Hardened Image

*   **Mục tiêu:** Build lớp nền tái sử dụng được.
    
*   **Nội dung:**
    
    *   Thực hành: Template build "Base Image" (chỉ OS + agent chuẩn), publish AMI ID, sau đó template "Hardened Image" build **from** Base Image AMI đó (kế thừa).
        
*   **Mini-Project:** Chain 2 template: Base → Hardened, xác nhận Hardened image build đúng trên nền Base vừa tạo (dùng `data` source lấy AMI mới nhất của Base).
    

### Ngày 27: Security Hardening

*   **Mục tiêu:** Đưa compliance vào image thay vì làm thủ công sau deploy.
    
*   **Nội dung:**
    
    *   Lý thuyết: CIS Benchmark, STIG, SSH hardening, `auditd`, FIPS mode.
        
    *   Thực hành: Provisioner chạy `Lynis` hoặc `OpenSCAP` scan, in kết quả compliance score.
        

### Ngày 28: Image Scanning & Secrets Management

*   **Mục tiêu:** Không bake secret vào image, phát hiện lỗ hổng trước khi publish.
    
*   **Nội dung:**
    
    *   Lý thuyết: Vì sao secret phải lấy runtime (instance metadata/Vault/Secrets Manager) chứ không hardcode; nguyên lý image scanning.
        
    *   Thực hành: Tích hợp `Trivy` scan image sau build, fail pipeline nếu có CVE critical.
        

### Ngày 29: Testing Image trước khi Promote

*   **Mục tiêu:** Có bước "kiểm định" trước khi image được coi là production-ready.
    
*   **Nội dung:**
    
    *   Lý thuyết: Pattern `Build → Test → Promote → Deploy`.
        
    *   Thực hành: Viết test bằng `Goss` hoặc `InSpec` kiểm tra service running, port mở, package version.
        
*   **Mini-Project:** Pipeline build → scan (Trivy) → test (Goss) → chỉ tag "validated" nếu tất cả pass.
    

### Ngày 30: AMI Lifecycle Management & Retention

*   **Mục tiêu:** Giải quyết bài toán "đau đầu hơn cả build" - quota và chi phí.
    
*   **Nội dung:**
    
    *   Lý thuyết: Tag lifecycle (`latest`, `latest-validated`, `production`, `rollback`), retention policy 30/90/180 ngày, AMI/snapshot quota, storage cost.
        
    *   Thực hành: Viết script (hoặc dùng AWS Data Lifecycle Manager) tự động deregister AMI cũ + xóa snapshot orphan.
        

# TUẦN 5 - CI/CD, Terraform/HCP, Kubernetes

### Ngày 31: CI/CD hóa Packer build

*   **Mục tiêu:** Build tự động, không chạy tay.
    
*   **Nội dung:**
    
    *   Lý thuyết: Pipeline stages `packer init → validate → build`; build matrix nhiều region.
        
    *   Thực hành: Viết GitHub Actions workflow build + upload manifest artifact.
        

### Ngày 32: HCP Packer Registry & Channel Management

*   **Mục tiêu:** Quản lý version/governance tập trung.
    
*   **Nội dung:**
    
    *   Lý thuyết: `hcp_packer_registry` block, channel `dev/staging/prod` trỏ tới image version khác nhau.
        
    *   Thực hành: Đăng ký build lên HCP Packer, tạo channel, promote thủ công.
        

### Ngày 33: Terraform + Packer Integration sâu

*   **Mục tiêu:** Nối liền pipeline image → hạ tầng.
    
*   **Nội dung:**
    
    *   Lý thuyết: `data "hcp_packer_image"` vs `data "aws_ami"`; workflow `Packer → HCP Registry → Terraform → ASG/EKS NodeGroup`.
        
    *   Thực hành: Terraform apply dùng `data "hcp_packer_image"` lấy "latest validated" image cho Launch Template.
        
*   **Mini-Project:** Full loop: build image mới → validate → promote channel "production" → Terraform tự pick lên mà không sửa code Terraform.
    

### Ngày 34: Kubernetes Node Images

*   **Mục tiêu:** Ứng dụng Packer cho Platform Engineering hiện đại.
    
*   **Nội dung:**
    
    *   Lý thuyết: Custom EKS node image (Amazon Linux + SSM Agent + Datadog + Falco + security config), dùng cho Managed Node Group / Karpenter / self-managed node.
        
    *   Thực hành: Build 1 custom node AMI, dùng làm `amiSelector` cho Karpenter hoặc launch template của node group.
        

### Ngày 35: Debugging & Troubleshooting nâng cao

*   **Mục tiêu:** Xử lý sự cố thực chiến - nơi tốn thời gian nhất trong production.
    
*   **Nội dung:**
    
    *   Lý thuyết: Phân loại lỗi thường gặp: SSH timeout, provisioner failed, plugin handshake failed, AMI creation failed, snapshot timeout, API rate limit.
        
    *   Thực hành: Cố tình gây từng loại lỗi (vd: sai SG rule chặn SSH), luyện đọc `PACKER_LOG` để chẩn đoán nhanh.
        

# TUẦN 6 - Ecosystem & Capstone

### Ngày 36: Packer Ecosystem

*   **Mục tiêu:** Hiểu vị trí Packer trong toàn hệ sinh thái HashiCorp.
    
*   **Nội dung:** Lý thuyết: quan hệ Packer ↔ Terraform ↔ Vault (secrets runtime) ↔ Nomad (chạy image) ↔ Boundary (access) ↔ Waypoint (legacy, ít dùng).
    

### Ngày 37: Tối ưu hiệu năng & chi phí tổng hợp

*   **Mục tiêu:** Build nhanh, rẻ, gọn.
    
*   **Nội dung:** Thực hành: parallel provisioning, base layer caching pattern (build kế thừa thay vì build lại từ đầu), giảm kích thước image (cleanup cache, sparsify QEMU).
    

### Ngày 38: Capstone Project - Image Factory hoàn chỉnh

*   **Mục tiêu:** Tổng hợp toàn bộ 38 ngày thành 1 hệ thống thật.
    
*   **Yêu cầu capstone:**
    
    1.  Kiến trúc 4 lớp image (Base → Hardened → Runtime → App) với lineage rõ ràng.
        
    2.  CI/CD tự động build + Trivy scan + Goss test + promote qua HCP Packer channel.
        
    3.  Terraform tiêu thụ image qua `data "hcp_packer_image"` để deploy ASG hoặc EKS node group.
        
    4.  Retention policy tự động cleanup AMI/snapshot cũ.
        
    5.  Custom plugin (provisioner hoặc post-processor) tự viết được dùng trong pipeline này.
        
    6.  1 image Windows và 1 image Linux, cả hai đều pass CIS hardening scan.
