AWS DVA-C02
Esc
↑↓เลื่อน↵เปิดescปิด28 ผลลัพธ์
13

Containers — ECS, ECR & EKS

ECS, ECR, Fargate & EKS

Compute 11 นาที 22 คำถาม

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

EC2 Launch Type
เราต้อง provision และ manage EC2 instances เอง (infrastructure ของเราเอง) แต่ละ EC2 instance ต้อง run ECS Agent เพื่อ register เข้ากับ ECS Cluster จากนั้น AWS จะ start/stop containers ให้ เหมาะกับงานที่ต้องการ control ระดับ instance
Fargate Launch Type
เป็นแบบ serverless ไม่ต้อง provision หรือ manage EC2 instances เลย แค่กำหนด task definition (CPU/RAM) แล้ว AWS จะ run container ให้ตาม spec การ scale ก็แค่เพิ่มจำนวน tasks ไม่ต้องเพิ่ม instance
Tips สำหรับการสอบ
เมื่อโจทย์เน้นคำว่า no infrastructure to manage / serverless / simplest สำหรับ container ให้เลือก Fargate เกือบทุกครั้ง ส่วน EC2 launch type จะเลือกเมื่อโจทย์ต้องการ control instance, ใช้ GPU แบบเฉพาะ, หรือ optimize cost ด้วย Reserved/Spot instances

02IAM Roles ใน ECS (กับดักข้อสอบ)

เรื่อง IAM Roles ของ ECS เป็นจุดที่ข้อสอบชอบหลอกมาก เพราะมี role หลายตัวที่ใช้คนละจุดประสงค์ ต้องแยกให้ออกชัดเจนระหว่าง role ระดับ EC2 instance และ role ระดับ task

RoleLaunch Typeใช้ทำอะไร
EC2 Instance ProfileEC2 onlyECS 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
กับดักข้อสอบที่พบบ่อย
อย่าสับสน! Task Role ให้สิทธิ์แก่ application code ที่ run อยู่ใน container (เช่น write S3) ส่วน Task Execution Role ให้สิทธิ์แก่ ECS infrastructure ในการ pull image และ push log โจทย์มักถามว่า container ตัวหนึ่งต้อง access DynamoDB ต้องแก้อะไร -> คำตอบคือกำหนด ECS Task Role ใน task definition ไม่ใช่ EC2 instance role
หมายเหตุ
บน EC2 launch type ถ้าหลาย task แชร์ instance เดียวกัน การใช้ Task Role ทำให้แต่ละ task มีสิทธิ์เฉพาะตัว (least privilege) ดีกว่าให้สิทธิ์ที่ EC2 instance role เพราะ role ที่ instance จะถูก share ให้ทุก task

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
json
{
  "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"
        }
      ]
    }
  ]
}
Tips สำหรับการสอบ
โจทย์ที่ถามว่าจะ run multiple instances ของ container เดียวกันบน EC2 instance เดียว ได้อย่างไร -> คำตอบคือ Dynamic Host Port Mapping ร่วมกับ Application Load Balancer (ALB support dynamic port ส่วน Classic Load Balancer ไม่ support)

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
กับดักข้อสอบ
Classic Load Balancer (CLB) ไม่ support Fargate และไม่ support dynamic host port mapping ถ้าโจทย์ใช้ Fargate หรือ microservices ที่ต้องการ routing ขั้นสูง ให้ตัด CLB ทิ้งทันทีและเลือก ALB

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)
กับดักข้อสอบ
Amazon S3 ไม่สามารถ mount เป็น file system ให้ ECS tasks ได้ (ในบริบทข้อสอบ DVA) ถ้าโจทย์ถามถึง persistent shared file storage ที่ mount เข้า container หลายตัว/หลาย AZ -> คำตอบคือ EFS ไม่ใช่ S3 หรือ EBS (EBS ผูกกับ AZ เดียวและ attach ได้จำกัด)

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
Target Tracking Scaling
scale โดยตั้ง target value ของ CloudWatch metric (เช่น keep CPU ที่ 60%) ระบบจะปรับจำนวน task เองให้ถึง target — ง่ายและนิยมที่สุด
Step Scaling
scale ตาม CloudWatch Alarm เป็นขั้น ๆ (steps) เช่น CPU > 70% เพิ่ม 2 task, > 90% เพิ่ม 4 task ให้ control ละเอียดกว่า
Scheduled Scaling
scale ตาม เวลา/ตารางที่กำหนดล่วงหน้า เหมาะเมื่อรู้ pattern การใช้งานแน่นอน เช่น traffic พุ่งทุกวันเวลา 9 โมง
กับดักข้อสอบ (EC2 launch type)
การ scale tasks (ECS Service Auto Scaling) ไม่ได้ scale EC2 instances อัตโนมัติให้ด้วย! บน EC2 launch type ต้อง scale capacity ของ instance แยกต่างหาก โดยใช้ ECS Cluster Capacity Providers (แนะนำ, จัดการ scaling ของ ASG ให้อัตโนมัติ) หรือ Auto Scaling Group scaling ปกติ ส่วน Fargate ไม่มีปัญหานี้เพราะ serverless

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
json
"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"
  }
]
Tips สำหรับการสอบ
ต้องการ rotation อัตโนมัติ ของ DB credentials -> Secrets Manager เก็บ config/secret ทั่วไปแบบประหยัด (ฟรีระดับ standard parameter) -> SSM Parameter Store ทั้งคู่ inject เข้า container ผ่าน field secrets และต้องให้สิทธิ์ที่ Task Execution Role

08Amazon 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
bash
# 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:latest
กับดักข้อสอบ
ถ้า ECS task pull image จาก ECR ไม่ได้ สาเหตุที่พบบ่อยคือ Task Execution Role (บน Fargate) หรือ EC2 Instance Role (บน EC2) ขาดสิทธิ์ ECR (ecr:GetDownloadUrlForLayer, ecr:BatchGetImage, ecr:GetAuthorizationToken) — ไม่ใช่ปัญหาที่ Task Role ของ application

09Amazon EKS Overview

Amazon EKS (Elastic Kubernetes Service) คือ managed Kubernetes บน AWS ใช้เมื่อองค์กรมีมาตรฐาน Kubernetes อยู่แล้ว หรืออยากได้ portability ข้าม cloud (Kubernetes เป็น cloud-agnostic) ต่างจาก ECS ตรงที่ ECS เป็น proprietary ของ AWS

EKS Node Types

Managed Node Groups
EKS สร้างและจัดการ EC2 instances (worker nodes) ให้ผ่าน Auto Scaling Group support ทั้ง On-Demand และ Spot Instances
Self-Managed Nodes
เราสร้าง EC2 nodes เองแล้ว register เข้า EKS cluster ควบคุมได้มากกว่า แต่ดูแลเองมากกว่า
AWS Fargate
run pods แบบ serverless ไม่ต้อง manage node ใด ๆ บน EKS เหมือนกัน
  • 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
มิติECSEKS
ประเภทAWS proprietary orchestratorManaged Kubernetes (open standard)
ความซับซ้อนง่ายกว่า, integrate AWS แน่นซับซ้อนกว่า, ต้องรู้ Kubernetes
Portabilityผูกกับ AWSCloud-agnostic / multi-cloud
Serverless optionFargateFargate (ผ่าน Fargate profiles)

10AWS Copilot & App Runner

นอกจาก ECS/EKS โดยตรง AWS ยังมีเครื่องมือช่วยให้ deploy container ง่ายขึ้นที่อาจโผล่ในข้อสอบเป็นตัวเลือก

AWS Copilot
CLI tool ที่ช่วย build, release, operate production-ready containerized applications บน ECS, Fargate และ App Runner ช่วยสร้าง infrastructure (ALB, ECR, ECS) ให้อัตโนมัติจาก config ง่าย ๆ โฟกัสที่ application ไม่ต้องเขียน infra เยอะ
AWS App Runner
fully managed service สำหรับ deploy web application และ API แบบ containerized ที่ scale ได้ โดย ไม่ต้องมีความรู้ infrastructure หรือ container orchestration เลย แค่ให้ source code หรือ container image แล้ว App Runner จัดการ build, deploy, load balancing, auto scaling, TLS ให้หมด
Tips สำหรับการสอบ
โจทย์เน้น deploy web app/API ให้เร็วที่สุด โดยไม่ต้องมีความรู้เรื่อง container/infrastructure และ scale อัตโนมัติ -> เลือก AWS App Runner ส่วน Copilot คือ CLI ที่ช่วยทีม dev สร้าง/จัดการ ECS apps ให้สะดวกขึ้น

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
หมายเหตุ
จำลำดับการ decode โจทย์: (1) ดูว่าต้อง manage infra ไหม -> Fargate vs EC2 (2) ปัญหาสิทธิ์ -> แยก Task Role / Execution Role / Instance Role (3) storage -> EFS (4) scaling -> tasks vs capacity (5) เครื่องมือ deploy -> App Runner/Copilot

คำถามทบทวน

ทดสอบความเข้าใจหัวข้อ Containers — ECS, ECR & EKS

22 ข้อ · เลือกคำตอบเพื่อดูเฉลยและคำอธิบาย

ทำแล้ว 0/22คะแนน 0
  1. 1.ทีม dev ต้องการ run containerized microservices บน ECS โดยไม่ต้อง provision หรือ patch EC2 instances ใด ๆ เลย ควรเลือก launch type ใด

  2. 2.Container ใน ECS task ตัวหนึ่งต้องเขียนข้อมูลลง Amazon S3 ควรกำหนดสิทธิ์ที่ใด

  3. 3.ต้องการ run หลาย instance ของ container เดียวกัน (image เดียวกัน) บน EC2 instance เดียวกันใน ECS โดยให้ ALB กระจาย traffic ได้ ต้องทำอย่างไร

  4. 4.Application บน ECS Fargate ต้องการ persistent shared storage ที่หลาย tasks ในหลาย AZ เข้าถึงพร้อมกันได้ ควรใช้บริการใด

  5. 5.ใน task definition ของ Fargate ต้องการดึง DB password จาก AWS Secrets Manager มาเป็น environment variable ของ container role ใดต้องมีสิทธิ์อ่าน secret นี้

  6. 6.ต้องการให้ ECS Service เพิ่ม/ลดจำนวน tasks อัตโนมัติเพื่อรักษา CPU utilization ไว้ที่ประมาณ 60% ควรใช้ scaling policy แบบใด

  7. 7.บน ECS EC2 launch type จำนวน tasks ถูก scale ด้วย Service Auto Scaling แล้ว แต่ task ใหม่ขึ้นไม่ได้เพราะ EC2 capacity ไม่พอ วิธีจัดการ EC2 capacity ให้ scale อัตโนมัติที่แนะนำคืออะไร

  8. 8.ECS task บน Fargate pull image จาก Amazon ECR ไม่สำเร็จ โดยขึ้น error เกี่ยวกับ authorization สาเหตุที่เป็นไปได้มากที่สุดคือ

  9. 9.บริษัทมี Kubernetes workload อยู่บน on-premises อยู่แล้วและต้องการ migrate ขึ้น AWS โดยคงมาตรฐาน Kubernetes และ portability ข้าม cloud ควรเลือกบริการใด

  10. 10.ทีมต้องการ deploy web API แบบ containerized ขึ้น production ให้เร็วที่สุดโดยไม่มีความรู้เรื่อง container orchestration หรือ infrastructure และต้องการ auto scaling + load balancing + TLS อัตโนมัติ ควรใช้บริการใด

  11. 11.ข้อใดอธิบาย AWS Copilot ได้ถูกต้องที่สุด

  12. 12.องค์กรต้องการ scan Docker images ใน ECR หา vulnerabilities ทั้งระดับ OS packages และ programming language dependencies แบบ continuous ควรเปิดใช้คุณสมบัติใด

  13. 13.ต้องการให้ DB credentials ที่ inject เข้า ECS container มีการ rotate อัตโนมัติเป็นระยะ ควรเก็บ credentials ไว้ที่ใด

  14. 14.ใน task definition จำนวน container definitions สูงสุดต่อ 1 task definition คือเท่าใด

  15. 15.Application ต้องการ ALB ที่ทำ path-based routing และ host-based routing สำหรับ ECS Fargate microservices ควรเลือก Load Balancer ใด และเพราะอะไร

  16. 16.ใน Fargate แต่ละ task ได้รับสิ่งใดในด้าน networking

  17. 17.บน EC2 launch type สิ่งใดที่ EC2 instance ต้อง run เพื่อ register เข้ากับ ECS Cluster

  18. 18.ต้องการ scale จำนวน ECS tasks ล่วงหน้าตามรูปแบบ traffic ที่รู้แน่ชัด เช่น เพิ่ม task ทุกวันเวลา 8:00 ก่อนชั่วโมงเร่งด่วน ควรใช้ scaling policy ใด

  19. 19.ข้อใดอธิบายความแตกต่างระหว่าง ECS Task Role และ ECS Task Execution Role ได้ถูกต้อง

  20. 20.บน Amazon EKS หากต้องการ run pods แบบ serverless โดยไม่ต้อง manage worker nodes ควรใช้สิ่งใด

  21. 21.การ authenticate เพื่อ push/pull image จาก Amazon ECR private registry ใช้กลไกใด

  22. 22.ต้องการ share ไฟล์ชั่วคราวระหว่าง 2 containers ใน task เดียวกัน (sidecar pattern) บน ECS ควรใช้วิธีใด