Containers — ECS, ECR & EKS
ECS, ECR, Fargate & EKS
01ภาพรวม Docker & Amazon ECS
ก่อนเข้าเรื่อง container บน AWS ต้องเข้าใจว่า Docker คือ platform สำหรับ run application แบบ containers โดย container จะ run บน Docker daemon บน host ใดก็ได้ ทำให้ deploy ได้สม่ำเสมอ (predictable) ไม่ว่าจะ machine ไหน ต่างจาก Virtual Machines (VM) ตรงที่ container share kernel ของ host เดียวกัน จึงเบากว่า เร็วกว่า ใช้ resource น้อยกว่า
Amazon ECS (Elastic Container Service) คือ container orchestration service ของ AWS ที่ช่วย launch Docker containers ให้เรา โดยมี launch types หลัก 2 แบบที่ต้องแยกให้ออกในข้อสอบคือ EC2 Launch Type และ Fargate
02IAM Roles ใน ECS (กับดักข้อสอบ)
เรื่อง IAM Roles ของ ECS เป็นจุดที่ข้อสอบชอบหลอกมาก เพราะมี role หลายตัวที่ใช้คนละจุดประสงค์ ต้องแยกให้ออกชัดเจนระหว่าง role ระดับ EC2 instance และ role ระดับ task
| Role | Launch Type | ใช้ทำอะไร |
|---|---|---|
| EC2 Instance Profile | EC2 only | ECS Agent ใช้ call ECS API, ส่ง log ไป CloudWatch, pull image จาก ECR, อ่าน secret จาก Secrets Manager/SSM |
| ECS Task Role (taskRoleArn) | EC2 & Fargate | ให้สิทธิ์แก่ตัว application/container เอง เช่น call S3, DynamoDB — กำหนดในระดับ task definition แต่ละ task มี role ต่างกันได้ |
| ECS Task Execution Role (executionRoleArn) | EC2 & Fargate (Fargate ต้องมี) | ให้ ECS Agent pull image จาก ECR และ push log ไป CloudWatch รวมถึงดึง secrets ตอน start container |
03Task Definitions & Container Definitions
Task Definition คือ JSON metadata ที่บอก ECS ว่าจะ run container อย่างไร — เปรียบเหมือน blueprint โดยใน task definition จะมี container definitions (run ได้สูงสุด 10 containers ต่อ 1 task definition) กำหนดสิ่งต่าง ๆ เช่น image name, port binding, memory/CPU, environment variables, IAM roles, logging config, data volumes
Port Binding: EC2 vs Fargate
- EC2 Launch Type ใช้ได้ทั้ง static และ Dynamic Host Port Mapping ถ้าตั้ง host port = 0 (หรือไม่กำหนด) ECS จะสุ่ม host port ให้ ทำให้ run หลาย container ของ image เดียวกันบน instance เดียวได้ ALB จะ route ผ่าน dynamic port ได้
- Fargate แต่ละ task ได้ ENI (Elastic Network Interface) และ private IP ของตัวเอง จึงใช้ awsvpc network mode, container port ตรงกับที่ ALB ชี้ไป ไม่มีเรื่อง host port
{
"family": "my-web-app",
"taskRoleArn": "arn:aws:iam::123456789012:role/ecsTaskRole",
"executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
"requiresCompatibilities": ["FARGATE"],
"networkMode": "awsvpc",
"cpu": "256",
"memory": "512",
"containerDefinitions": [
{
"name": "web",
"image": "123456789012.dkr.ecr.us-east-1.amazonaws.com/web:latest",
"portMappings": [{ "containerPort": 8080, "protocol": "tcp" }],
"environment": [{ "name": "ENV", "value": "prod" }],
"secrets": [
{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:secretsmanager:us-east-1:123456789012:secret:db-pass"
}
]
}
]
}04Load Balancer Integration
ECS Service มักวางหลัง Load Balancer เพื่อกระจาย traffic และทำ health check การเลือก LB ขึ้นกับ protocol และ feature ที่ต้องการ
| Load Balancer | เหมาะกับ | หมายเหตุ |
|---|---|---|
| Application Load Balancer (ALB) | HTTP/HTTPS, web app, microservices | แนะนำเกือบทุกกรณี, support dynamic port mapping, path/host-based routing |
| Network Load Balancer (NLB) | high throughput / high performance, TCP/UDP, หรือ pair กับ AWS PrivateLink | เมื่อต้องการ static IP / ultra-low latency |
| Classic Load Balancer (CLB) | legacy เท่านั้น | ไม่แนะนำ, ไม่ support advanced features และ Fargate |
05Data Volumes & EFS
ตามปกติ container ใน ECS เป็น stateless เมื่อ task ถูก stop ข้อมูลก็หายไป ถ้าต้องการ persistent / shared storage ระหว่าง tasks (หรือข้าม AZ) ให้ mount Amazon EFS (Elastic File System)
- Amazon EFS ใช้ได้กับทั้ง EC2 Launch Type และ Fargate — เป็น network file system ที่ share ได้หลาย task หลาย AZ พร้อมกัน
- EFS เป็น serverless, pay-per-use เหมาะกับ persistent multi-AZ shared storage เช่น data ที่ต้อง share ระหว่าง container
- Fargate + EFS = fully serverless stack (ไม่มี server ให้ดูแล + มี persistent storage)
- ใช้ bind mounts (ephemeral) สำหรับ share ข้อมูลระหว่าง containers ใน task เดียวกัน (sidecar pattern)
06ECS Service Auto Scaling
ECS Service Auto Scaling หมายถึงการเพิ่ม/ลดจำนวน ECS Tasks อัตโนมัติ โดยใช้ AWS Application Auto Scaling (คนละตัวกับ EC2 Auto Scaling) สังเกตคำว่า service auto scaling = scale tasks
Metrics ที่ใช้ scale ได้
- ECS Service Average CPU Utilization
- ECS Service Average Memory Utilization — scale ตาม RAM
- ALB Request Count Per Target — metric จาก ALB
07Environment Variables & Secrets
container ใน ECS รับ config ผ่าน environment variables ได้หลายแบบ: hardcoded (เช่น URL), จาก SSM Parameter Store, และจาก Secrets Manager สำหรับ sensitive data
- Environment variables (plain) — กำหนดตรง ๆ ใน task definition ผ่าน field
environmentสำหรับค่าที่ไม่เป็นความลับ - SSM Parameter Store — ใช้ field
secretsดึง parameter (รวม SecureString) มาเป็น env var ตอน start container เหมาะกับ API keys, config, password ทั่วไป - Secrets Manager — ใช้ field
secretsเช่นกัน เหมาะกับ DB credentials ที่ต้องการ automatic rotation - ECS ดึง secret ตอน container start โดยใช้ Task Execution Role ที่ต้องมีสิทธิ์อ่าน parameter/secret และ decrypt KMS
"secrets": [
{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:ssm:us-east-1:123456789012:parameter/prod/db-password"
},
{
"name": "API_KEY",
"valueFrom": "arn:aws:secretsmanager:us-east-1:123456789012:secret:prod/api-key"
}
]secrets และต้องให้สิทธิ์ที่ Task Execution Role08Amazon ECR — Container Registry
Amazon ECR (Elastic Container Registry) คือที่เก็บ Docker images บน AWS โดย image จริง ๆ ถูกเก็บไว้ใน Amazon S3 เบื้องหลัง รองรับทั้ง Private และ Public registry (Public คือ ECR Public Gallery)
- Authentication ใช้ผ่าน IAM — ต้องมีสิทธิ์ IAM ก่อนจึงจะ push/pull ได้ (ปัญหาเรื่อง pull image fail บ่อยมาจาก IAM permission ไม่พอ)
- Image Scanning — scan หา vulnerabilities ใน image ได้ มี Basic scanning (CVE จาก open source) และ Enhanced scanning (powered by Amazon Inspector สแกนลึกทั้ง OS และ language packages, scan on push หรือ continuous)
- support lifecycle policies ลบ image เก่าอัตโนมัติ และ image versioning / immutable tags
# 1) Login เข้า ECR ด้วย IAM credentials
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS \
--password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
# 2) Tag และ push image
docker tag my-app:latest \
123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latestecr:GetDownloadUrlForLayer, ecr:BatchGetImage, ecr:GetAuthorizationToken) — ไม่ใช่ปัญหาที่ Task Role ของ application09Amazon EKS Overview
Amazon EKS (Elastic Kubernetes Service) คือ managed Kubernetes บน AWS ใช้เมื่อองค์กรมีมาตรฐาน Kubernetes อยู่แล้ว หรืออยากได้ portability ข้าม cloud (Kubernetes เป็น cloud-agnostic) ต่างจาก ECS ตรงที่ ECS เป็น proprietary ของ AWS
EKS Node Types
- Data Volumes บน EKS ต้องระบุ StorageClass ผ่าน CSI driver รองรับ EBS, EFS (ใช้กับ Fargate ได้), FSx for Lustre, FSx for NetApp ONTAP
- EKS เหมาะกับ workload ที่ต้องการ Kubernetes ecosystem (Helm, operators) หรือ migrate K8s เดิมจาก on-premises
| มิติ | ECS | EKS |
|---|---|---|
| ประเภท | AWS proprietary orchestrator | Managed Kubernetes (open standard) |
| ความซับซ้อน | ง่ายกว่า, integrate AWS แน่น | ซับซ้อนกว่า, ต้องรู้ Kubernetes |
| Portability | ผูกกับ AWS | Cloud-agnostic / multi-cloud |
| Serverless option | Fargate | Fargate (ผ่าน Fargate profiles) |
10AWS Copilot & App Runner
นอกจาก ECS/EKS โดยตรง AWS ยังมีเครื่องมือช่วยให้ deploy container ง่ายขึ้นที่อาจโผล่ในข้อสอบเป็นตัวเลือก
11สรุปก่อนสอบ (Cheat Sheet)
- Fargate = serverless container, ไม่ต้อง manage EC2 — โจทย์ "no infrastructure management" เลือกตัวนี้
- Task Role = สิทธิ์ของ application (เช่น access S3/DynamoDB); Task Execution Role = ECS pull image + push logs + ดึง secrets
- Dynamic Host Port Mapping + ALB = run หลาย container เดียวกันบน EC2 instance เดียว (CLB ทำไม่ได้)
- Persistent shared storage หลาย task/หลาย AZ = EFS (ใช้กับ Fargate ได้, S3 mount ไม่ได้)
- ECS Service Auto Scaling = scale tasks ผ่าน Application Auto Scaling (Target Tracking / Step / Scheduled); scale EC2 capacity ใช้ Capacity Providers
- Secrets injection ผ่าน field
secretsจาก SSM Parameter Store หรือ Secrets Manager (rotation = Secrets Manager) - ECR เก็บ image ใน S3, auth ผ่าน IAM, scan vulnerabilities ด้วย Basic หรือ Enhanced (Amazon Inspector)
- EKS = managed Kubernetes (cloud-agnostic); App Runner = deploy web app ง่ายสุดไม่ต้องรู้ infra; Copilot = CLI ช่วย deploy บน ECS
คำถามทบทวน
ทดสอบความเข้าใจหัวข้อ Containers — ECS, ECR & EKS
22 ข้อ · เลือกคำตอบเพื่อดูเฉลยและคำอธิบาย
1.ทีม dev ต้องการ run containerized microservices บน ECS โดยไม่ต้อง provision หรือ patch EC2 instances ใด ๆ เลย ควรเลือก launch type ใด
2.Container ใน ECS task ตัวหนึ่งต้องเขียนข้อมูลลง Amazon S3 ควรกำหนดสิทธิ์ที่ใด
3.ต้องการ run หลาย instance ของ container เดียวกัน (image เดียวกัน) บน EC2 instance เดียวกันใน ECS โดยให้ ALB กระจาย traffic ได้ ต้องทำอย่างไร
4.Application บน ECS Fargate ต้องการ persistent shared storage ที่หลาย tasks ในหลาย AZ เข้าถึงพร้อมกันได้ ควรใช้บริการใด
5.ใน task definition ของ Fargate ต้องการดึง DB password จาก AWS Secrets Manager มาเป็น environment variable ของ container role ใดต้องมีสิทธิ์อ่าน secret นี้
6.ต้องการให้ ECS Service เพิ่ม/ลดจำนวน tasks อัตโนมัติเพื่อรักษา CPU utilization ไว้ที่ประมาณ 60% ควรใช้ scaling policy แบบใด
7.บน ECS EC2 launch type จำนวน tasks ถูก scale ด้วย Service Auto Scaling แล้ว แต่ task ใหม่ขึ้นไม่ได้เพราะ EC2 capacity ไม่พอ วิธีจัดการ EC2 capacity ให้ scale อัตโนมัติที่แนะนำคืออะไร
8.ECS task บน Fargate pull image จาก Amazon ECR ไม่สำเร็จ โดยขึ้น error เกี่ยวกับ authorization สาเหตุที่เป็นไปได้มากที่สุดคือ
9.บริษัทมี Kubernetes workload อยู่บน on-premises อยู่แล้วและต้องการ migrate ขึ้น AWS โดยคงมาตรฐาน Kubernetes และ portability ข้าม cloud ควรเลือกบริการใด
10.ทีมต้องการ deploy web API แบบ containerized ขึ้น production ให้เร็วที่สุดโดยไม่มีความรู้เรื่อง container orchestration หรือ infrastructure และต้องการ auto scaling + load balancing + TLS อัตโนมัติ ควรใช้บริการใด
11.ข้อใดอธิบาย AWS Copilot ได้ถูกต้องที่สุด
12.องค์กรต้องการ scan Docker images ใน ECR หา vulnerabilities ทั้งระดับ OS packages และ programming language dependencies แบบ continuous ควรเปิดใช้คุณสมบัติใด
13.ต้องการให้ DB credentials ที่ inject เข้า ECS container มีการ rotate อัตโนมัติเป็นระยะ ควรเก็บ credentials ไว้ที่ใด
14.ใน task definition จำนวน container definitions สูงสุดต่อ 1 task definition คือเท่าใด
15.Application ต้องการ ALB ที่ทำ path-based routing และ host-based routing สำหรับ ECS Fargate microservices ควรเลือก Load Balancer ใด และเพราะอะไร
16.ใน Fargate แต่ละ task ได้รับสิ่งใดในด้าน networking
17.บน EC2 launch type สิ่งใดที่ EC2 instance ต้อง run เพื่อ register เข้ากับ ECS Cluster
18.ต้องการ scale จำนวน ECS tasks ล่วงหน้าตามรูปแบบ traffic ที่รู้แน่ชัด เช่น เพิ่ม task ทุกวันเวลา 8:00 ก่อนชั่วโมงเร่งด่วน ควรใช้ scaling policy ใด
19.ข้อใดอธิบายความแตกต่างระหว่าง ECS Task Role และ ECS Task Execution Role ได้ถูกต้อง
20.บน Amazon EKS หากต้องการ run pods แบบ serverless โดยไม่ต้อง manage worker nodes ควรใช้สิ่งใด
21.การ authenticate เพื่อ push/pull image จาก Amazon ECR private registry ใช้กลไกใด
22.ต้องการ share ไฟล์ชั่วคราวระหว่าง 2 containers ใน task เดียวกัน (sidecar pattern) บน ECS ควรใช้วิธีใด