Amazon ECS คืออะไร? แนะนำฟังก์ชันของ AWS สำหรับผู้เริ่มต้นใช้งาน

Amazon ECS คืออะไร? แนะนำฟังก์ชันของ AWS สำหรับผู้เริ่มต้นใช้งาน

บทความนี้จะพาทุกท่านมาทำความรู้จักกับ service ที่ชื่อว่า ECS ซึ่งมีไว้สำหรับ deploy application ในรูปของ docker container

บทความนี้ได้รับการแปลมาจากบทความภาษาญี่ปุ่นที่มีชื่อว่า AWS再入門ブログリレー2022 Amazon ECS編 โดยเจ้าของบทความนี้คือคุณ toku-shun ซึ่งเป็นชาวญี่ปุ่น และในบทความนี้จะมีการปรับสำนวนการเขียน รวมถึงมีการเรียบเรียงเนื้อหาใหม่ให้เข้าใจง่ายและมีความเหมาะสมมากยิ่งขึ้น

ในบทความนี้เราจะนำเหล่าสมาชิกที่โดยปกติแล้วเขียนแต่บล็อกเกี่ยวกับเนื้อหาล่าสุดของ AWS แบบละเอียดลงลึก กลับมาเขียนบทความอธิบายเนื้อหาพื้นฐานต่าง ๆ แบบเบสิกกันอีกครั้งครับ

โดยบทความนี้ก็ตามชื่อ สำหรับผู้ที่ตั้งใจจะเรียนเกี่ยวกับ AWS รวมถึงผู้ที่ใช้งาน AWS อยู่แล้ว แต่อยากจะติดตามเนื้อหาหรืออัปเดตใหม่ ๆ ก็อยากจะให้อ่านบทความนี้ไปจนจบเลยครับ

ถ้าอย่างนั้นเราก็มาเริ่มกันเลยครับ โดยหัวข้อในครั้งนี้ คือ「Amazon ECS」

Amazon ECS คืออะไร

ถ้าให้พูดแบบรวม ๆ ECS คือ「Full Managed Container Orchestrator」ครับ

โดยปกติแล้ว container workload จะใช้งานกันในรูปแบบของการนำ host หลาย ๆ ตัวมารวมกันเป็น cluster และบน host เหล่านั้นจะมี container หลาย ๆ ตัวที่ทำงานร่วมกันอยู่ และ ECS ก็เป็น full managed orchestrator service ที่ใช้สำหรับจัดการ container workload เหล่านี้ครับ

เราสามารถตั้งค่าและจัดการสิ่งต่าง ๆ เหล่านี้ได้โดยใช้ ECS ครับ

  • การจัดการ container deployment
  • การกระจายโหลดโดยใช้ Load Balancer
  • การติดตามสถานะของ container และการ recovery แบบอัตโนมัติ
  • การทำ container scaling
  • การจัดการ IAM permission ของ container
  • การรวบรวม CloudWatch Metrics / Logs

การใช้งาน ECS นั้น นอกจากความรู้เกี่ยวกับ Docker แล้ว ก็ยังจำเป็นจะต้องมีความรู้เกี่ยวกับตัว ECS เองอีกด้วย ซึ่งอาจจะเข้าใจยากสำหรับผู้ที่พึ่งเริ่มต้นใช้งาน ECS ดังนั้นในบทความนี้จะทำการอธิบายความรู้เกี่ยวกับ ECS โดยแบ่งอธิบายเป็นส่วน ๆ ประกอบด้วย data plane กับ control plane ครับ

Data plane

หมายถึง สภาพแวดล้อมสำหรับรัน container ซึ่งจะแบ่งออกเป็น 3 แบบหลัก ๆ ตามด้านล่างนี้

01

1. ECS on Fargate

ECS on Fargate คือ「Full Managed Data Plane」ครับ
สามารถรัน container ได้โดยไม่จำเป็นต้องคิดถึงเรื่อง host เลยแม้แต่นิดเดียว คล้าย ๆ กับ AWS Lambda ที่สามารถใช้งานได้โดยไม่จำเป็นต้องคิดถึงเรื่องการจัดการ resource ครับ

มีข้อดีต่าง ๆ เช่น ทุ่นแรงเกี่ยวกับงานจำพวกการอัปเดตแพทช์หรือจัดการ OS ของ infra ต่าง ๆ ลงได้ รวมถึงเรื่องการ scaling host ก็ไม่ต้องคิดให้ปวดหัวด้วยครับ
แต่ข้อเสียก็มีเช่นกัน เช่น เราจะไม่สามารถตั้งค่า OS parameter ต่าง ๆ แบบละเอียดตามต้องการได้ หรือการที่ไม่สามารถ login เข้าไปใน host ที่รัน container ได้ เป็นต้นครับ

ในช่วงแรก ๆ นั้น Fargate จะมีค่าบริการที่ค่อนข้างแพง แต่พักหลังมานี้ค่าบริการค่อย ๆ ถูกลงเรื่อย ๆ จนกลายมาเป็นตัวเลือกอันดับหนึ่งสำหรับ data plane บน ECS ไปแล้วครับ
และเพราะการที่เราไม่ต้องมาเสียเวลาอัปเดตแพทช์ของ host เองนั้น เป็นข้อดีที่ใหญ่หลวงมาก จึงอยากให้ลองพิจารณาการใช้งาน ECS on Fargate ดูครับ

2. ECS on EC2

ECS on EC2 คือ「Data plane ที่รันบน EC2」ครับ
เราสามารถรัน ECS container บน EC2 ได้โดยการรัน Amazon ECS Container Agent ที่ติดตั้งอยู่ใน EC2 ตัวดังกล่าวครับ โดยที่เรายังคงสามารถจัดการ container ที่รันอยู่บน EC2 นั้นผ่าน ECS ได้อยู่ และนอกจากนี้ EC2 ที่สร้างขึ้นโดย ECS จะใช้ AMI ที่ Amazon เตรียมไว้ให้ ซึ่งมี Amazon ECS Container Agent ติดตั้งอยู่เรียบร้อยแล้ว ทำให้ไม่จำเป็นต้องติดตั้งเองต่างหาก

ข้อดีและข้อเสียของ ECS on EC2 ก็จะตรงกันข้ามกับ ECS on Fargate ครับ คือ เราสามารถตั้งค่า parameter หรือเวอร์ชันของ host เองได้ตามใจ หรือ login เข้าไปใน host เพื่อปรับแต่งการตั้งค่าต่าง ๆ เองรวมถึงการตรวจสอบ logs ได้
ในส่วนของข้อเสียก็คือ เราจำเป็นจะต้องจัดการเรื่อง OS, Middleware, การอัปเดตแพทช์ หรือการจัดการ cluster เองครับ

3. ECS Anywhere

ECS Anywhere คือ「Data plane ที่รันบน On-premises」ครับ
เป็นการรัน container บนอุปกรณ์ hardware machine ชองเราเอง ซึ่งอาจจะเป็น data center หรือ office เป็นต้น โดยที่ control plane จะเป็น full managed ซึ่งรันบน AWS ครับ

ข้อดีของ ECS Anywhere คือ เราสามารถจัดการ host ได้ไปจนถึงระดับ hardware แต่สิ่งนี้ก็สามารถกลายมาเป็นข้อเสียได้ ขึ้นอยู่กับมุมมองและความต้องการใช้งานด้วย
ส่วนใหญ่แล้วจะใช้งาน ECS Anywhere เมื่อมีเงื่อนไขเกี่ยวกับความปลอดภัยต่าง ๆ ที่ไม่อนุญาตให้นำ resource ไปรันบน AWS เป็นต้น

Control Plane

Control plane จะประกอบไปด้วย 4 ส่วนหลัก ๆ ดังนี้

02

1. Task Definition

คือ template ของ Task ที่เขียนอยู่ใน JSON format ครับ แต่ก็สามารถสร้างได้ผ่านหน้า console เช่นกัน
เขียนระบุถึงรายละเอียดการตั้งค่าต่าง ๆ ของ task เช่น environment variable / image ที่จะใช้สำหรับสร้าง container / ปริมาณ memory, CPU ของแต่ละ task หรือ container เป็นต้น
Task Definition 1 ไฟล์ สามารถเขียนตั้งค่า container หลาย ๆ อันได้ และ Task Definition 1 อันก็สามารถใช้สร้าง container หลาย ๆ อันได้เช่นกันครับ

2. Task

คือ หน่วยของ application ที่สร้างขึ้นโดยใช้ Task Definition ครับ
เราสามารถรัน application ได้ โดยการใช้ Task Definition สร้าง Task ขึ้นมา

3. Service

คือ Scheduler สำหรับรักษาจำนวน running Task ให้เป็นไปตามจำนวนที่กำหนดเอาไว้ ครับ

อ่านคำนิยามด้านบนแล้วอาจจะไม่ค่อยเข้าใจนัก ผมจะขออธิบายเพิ่มเติมด้านล่างนี้ครับ
โดยปกติเราอาจรัน Task เป็นจำนวนหลาย ๆ Task พร้อมกัน เพื่อให้สามารถรองรับกับผู้ใช้งานจำนวนมากได้ แต่ Task นั้นสามารถหยุดทำงานลงได้หากมีเหตุขัดข้องบางอย่างเกิดขึ้น หน้าที่ของ Service คือการใช้ Task Definition สร้าง Task ใหม่ขึ้นมาแทน Task ที่หยุดทำงานลง เพื่อรักษาจำนวน running Task ให้คงที่ โดยจำนวน running Task นั้นเราสามารถกำหนดเองได้ครับ
นอกจากนี้การใช้งาน Service ยังช่วยกระจายโหลดไปให้แต่ละ Task หรือทำ Task scaling ได้

4. Cluster

คือ กลุ่มของ Task หรือ Service ครับ
หรือถ้าพูดให้ถูกกว่านี้ก็คือ กลุ่มของ resource ที่สร้างขึ้นใน Data Plane

ลองใช้งาน

ในส่วนของการทดลองใช้งาน ECS นี้ บทความต้นฉบับเลือกที่จะทำตาม Hands On อันนี้ แต่พอผมลองคลิกเข้าไปดูก็ปรากฎว่า Hands On นี้บินไปซะแล้วครับ อาจจะเนื่องมาจากบทความต้นฉบับนี้ค่อนข้างเก่า เพราะฉะนั้นผมจะถือโอกาสดัดแปลงแผนภาพที่อยู่ในบทความต้นฉบับให้เรียบง่ายขึ้นครับ

และเนื่องจากบทความนี้เป็นการสาธิตให้เห็นถึงการใช้งาน ECS เฉย ๆ ไม่ใช่บทความสำหรับสอนการใช้งาน เพราะฉะนั้นผมจะอธิบายแค่แบบคร่าว ๆ ไม่ลงรายละเอียดมากนะครับ

ส่วนตัว Hands On ที่บินไป หลังจากลองไปค้นหาเพิ่มเติมดูผมก็ไปเจอเข้ากับหน้า Hands On อันใหม่ของ ECS ครับ ซึ่งสำหรับท่านที่อยากเรียนรู้วิธีใช้งาน ECS แบบละเอียดกว่าในบทความนี้ก็สามารถไปเข้าไปดูได้ที่ลิงก์ด้านล่างนี้

สร้าง Cluster

ก่อนอื่นก็เริ่มจากการสร้าง cluster ก่อนครับ ให้ไปที่หน้า console ของ ECS เลือกเมนู Clusters ทางด้านซ้าย จากนั้นคลิกที่ Create cluster

03

ในส่วนของ Cluster configuration ให้ตั้งชื่อ cluster ตามใจชอบ

04

ส่วน Infrastructure ให้เลือก infrastructure ที่ต้องการ ในครั้งนี้ผมจะทดลองสร้าง service ที่รันทั้งบน Fargate และ EC2 ดังนั้นผมจึงเลือกทั้งคู่เลยครับ

05

ซึ่งสำหรับ infrastructure แบบ EC2 เราจะต้องตั้งค่า Auto Scaling Group (ASG) และ Network setting ด้วย โดยทุกท่านสามารถตั้ง ASG ได้ตามต้องการ ซึ่งในครั้งนี้ผมจะตั้งค่าตามในภาพครับ

06

ส่วน network setting ก็เป็นแค่การเลือก VPC, subnets, และ security group ให้กับ EC2 ใน cluster ของเราครับ ซึ่งสามารถตั้งค่าได้ตามความต้องการ

06-1

Security group ผมเปิด inbound rule port 80 แค่นั้นเลยครับ

06-2

สำหรับท่านใดที่ยังไม่ค่อยคุ้นเคยกับการตั้งค่าในส่วนนี้ สามารถศึกษาเพิ่มเติมเกี่ยวกับ VPC, subnets, security group ได้ที่บทความด้านล่างนี้ครับ

การใช้งาน VPC ในเชิงปฏิบัติกับ EC2 | DevelopersIO

เมื่อตั้งค่าทุกอย่างเสร็จแล้ว ให้เลื่อนลงมาด้านล่างแล้วคลิกที่ Create เพื่อสร้าง cluster

ECS on Fargate

ในส่วนของ Fargate ผมจะลองทำตามแผนภาพด้านล่างนี้

d01

อธิบายแบบคร่าว ๆ ก็คือ เราจะสร้าง service ที่มี task รันอยู่จำนวน 1 task โดยที่ task นี้จะรันบน Fargate ครับ

สร้าง Task definitions

ไปที่หน้า console ของ ECS เลือกเมนู Task definitions ทางด้านซ้าย จากนั้นคลิกที่ Create new task definitionCreate new task definition

08

ที่บริเวณ Task definition configuration ให้ตั้งชื่อ Task definition ตามต้องการ จากนั้นในส่วนของ Launch type ให้เลือก AWS Fargate

09

ต่อมาให้เรากำหนดปริมาณ resource, IAM role ต่าง ๆ ที่จะมอบให้ Task เพื่อนำไปใช้ในการรัน container ใน Task

10

จากนั้นเลื่อนลงไปด้านล่าง ในส่วนของ Container ให้เราตั้งค่า container ที่จะรันใน Task
ทำการตั้งชื่อ container, image, port, และ resource ที่จะมอบให้กับ container ได้ตามใจชอบ รวมถึงการตั้งค่าเพิ่มเติมต่าง ๆ เช่น docker entry point, cmd, label เป็นต้น

ซึ่ง image ที่ผมจะใช้ในครั้งนี้ คือ public.ecr.aws/ecs-sample-image/amazon-ecs-sample:latest ซึ่งเป็นตัว sample image ที่ AWS แจกให้ใช้ฟรี ๆ ครับ ซึ่งหน้าตาของแอพพลิเคชันที่ deploy ด้วย image นี้จะมีหน้าตาประมาณนี้

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ image ดังกล่าวสามารถอ่านได้เพิ่มเติมที่นี่เลยครับ

11

ในกรณีที่อยากรัน container ใน task มากกว่า 1 container สามารถคลิกที่ Add container แล้วตั้งค่า container เพิ่มเติมได้

ด้านล่างก็มีให้ตั้งค่าอะไรต่าง ๆ เพิ่มเติม เช่น Storage, Monitoring ก็ให้ตั้งค่าตามต้องการ เมื่อพอใจแล้วให้เลื่อนมาด้านล่างสุด คลิก Create เพื่อสร้าง Task definition

สร้าง Services

เมื่อมี Cluster แล้ว และมี Task definition แล้ว เราก็พร้อมจะสร้าง Service กันแล้วครับ ให้กลับมาที่หน้า Cluster ที่เราสร้างไว้ (อย่างของผมก็คือ my-cluster) จากนั้นที่แถบเมนูด้านล่าง ให้เลือก Services และคลิกที่ Create

12

ในส่วนของ Environment ผมจะตั้งค่าตามในภาพ โดยเลือก Capacity provider เป็น FARGATE เพื่อให้ Service deploy Task บน Fargate

13

จากนั้นในส่วนของ Deployment configuration ก็ทำการเลือก Task definition ของ Fargate ที่สร้างไว้ตอนแรก ตั้งชื่อ Service แล้วเลือกจำนวน Task ที่ต้องการ

14

ส่วนของ Networking ก็ตามภาพครับ เลือก VPC, Subnet, Security group ให้กับ Task และผมเลือกติด public IP ให้กับ Task เพื่อให้ Task เชื่อมต่อ internet ได้ เอาไว้ใช้เวลา pull Docker image สร้าง container

15

ส่วนต่อมาคือ Load balancing ส่วนนี้จะทำหรือไม่ทำก็ได้ แต่ผมอยากได้ก็เลยเปิดไว้ครับ ผมเลือกเป็นแบบ Application แล้ว listen port 80

16

จากนั้นเลื่อนมาด้านล่างสุดแล้วคลิก Create ได้เลยครับ
ที่เหลือก็นั่งรอ Service สร้างเสร็จ

เมื่อ Service สร้างเสร็จก็จะมีหน้าตาประมาณในภาพด้านล่าง
จะเห็นว่ามี Task รันอยู่ 1 Task

17

คลิกเข้าไปที่ Service ของเรา ไปที่เมนู Configuration and networking จากนั้นบริเวณมุมขวาล่างจะเห็น DNS names อยู่ นั่นคือ URL สำหรับเปิดแอพของเราครับ

18

เปิดเข้าไปดูก็จะเห็นแอพที่เรา deploy ไว้

19

คราวนี้ผมจะลองเพิ่มจำนวน Task ใน Service ให้เป็น 2 Task ครับ ซึ่งโครงสร้างก็จะประมาณรูปด้านล่างนี้

d02

ให้กลับมาที่ Service ของเรา คราวนี้ไปที่เมนู Tasks จะเห็น Task ของเราที่รันอยู่ คลิกที่ Update service

19-1

เปลี่ยน Desired tasks จาก 1 เป็น 2

19-2

เมื่อกลับมาที่เมนู Tasks อีกครั้ง ก็จะเห็นว่ามี Task เพิ่มขึ้นมาเป็น 2 Tasks แล้ว

19-3

ลบ Services

สร้างแล้วก็ต้องลบครับ เริ่มจากการไปที่ Service ที่เราสร้างไว้ (ของผมคือ my-ecs-fargate-service) แล้วคลิกที่ Delete service ตรงมุมบนขวา

19-4

จะพบว่าเราต้องลบจำนวน Task ใน Service ให้เหลือ 0 ก่อน ถึงจะสามารถลบ Service ได้ (จริง ๆ แล้วเราสามารถทำการ Force delete เพื่อลบ Service โดยไม่จำเป็นต้อง scale down ก่อนก็ได้ แต่ในครั้งนี้เราจะลบแบบธรรมดา)

19-5

เพราะฉะนั้นให้เราไปที่ Update service แล้วปรับจำนวน Task ให้เหลือ 0 ก่อน

19-6

จากนั้นพอจำนวน Task เหลือ 0 แล้ว ก็คลิกที่ Delete service อีกครั้ง

19-7

จากนั้นก็ทำตามคำแนะนำที่เขียนไว้แล้วลบ Service ได้เลยครับ

19-8

ECS on EC2

ในส่วนของ EC2 ผมจะลองทำตามแผนภาพด้านล่างนี้

d03

อธิบายแบบคร่าว ๆ ก็คือ เหมือนกับตอน Fargate ทุกอย่างครับ แค่คราวนี้ host จะเปลี่ยนจาก Fargate เป็น EC2

สร้าง Task definitions

ไปที่หน้า console ของ ECS เลือกเมนู Task definitions ทางด้านซ้าย จากนั้นคลิกที่ Create new task definitionCreate new task definition

20

ตั้งชื่อ task definition ตามต้องการเหมือนเดิม แต่คราวนี้ Launch type ให้เลือก Amazon EC2 instances

21

จากนั้นก็กำหนดปริมาณ resource, IAM role ต่าง ๆ ที่จะมอบให้ Task เพื่อนำไปใช้ในการรัน container ใน Task
ถ้าลองย้อนขึ้นไปดู ตอนสร้าง Cluster ผมเลือก EC2 ตัวเล็กเอาไว้ (t2.nano) เพราะฉะนั้นผมจะลดปริมาณ resource ของ Task ลง ไม่งั้นเดี๋ยว EC2 จะรับไม่ไหว

22

ในส่วนของ Container ผมตั้งค่าเหมือนตอน Fargate เลยครับ

23

แค่นี้ก็ถือว่าเสร็จสิ้นการสร้าง Task definition ของ EC2 ครับ

สร้าง Services

ไปที่หน้า Cluster ของเรา จากนั้นที่เมนู Services ให้คลิกที่ Create

24

ในส่วนของ Environment รอบนี้เลือก Capacity provider เป็น EC2 (อันที่ไม่มีคำว่า FARGATE อยู่ในชื่อ)

25

Deployment configuration ก็ทำการเลือก Task definition ของ EC2 ที่สร้างไว้ ตั้งชื่อ Service แล้วเลือกจำนวน Task ที่ต้องการ

26

ส่วนของ Networking ก็เหมือนเดิมครับ แต่ EC2 เราอยู่ใน public subnet อยู่แล้ว ก็เลยไม่มีปัญหาเรื่องเชื่อมต่อ internet

27

Load balancing เหมือนกับตอน Fargate

28

จากนั้นเลื่อนมาด้านล่างสุดแล้วคลิก Create ได้เลยครับ
แล้วก็นั่งรอ Service สร้างเสร็จอีกรอบ

เมื่อ Service สร้างเสร็จก็จะมีหน้าตาประมาณในภาพด้านล่าง
จะเห็นว่ามี Task รันอยู่ 1 Task

29

คลิกเข้าไปที่ Service ของเรา ไปที่เมนู Configuration and networking แล้วหา DNS names เพื่อลองเปิดแอพของเรา

30

เปิดเข้าไปดูก็จะเห็นแอพที่เรา deploy ไว้เหมือนเดิม

31

แต่เนื่องจาก EC2 ตัวค่อนข้างเล็ก จึงไม่น่าจะรัน Task 2 อันพร้อมกันไหว รอบนี้ก็เลยไม่ได้ลอง scale up ดูครับ

ลบ Service

วิธีลบ Service ใน EC2 ก็เหมือนกับ Fargate เลยครับ

เริ่มจากลบ Task ใน Service ออกให้เหลือ 0

32

จากนั้นก็ลบ Service ได้เลย

33

สุดท้ายนี้

สำหรับบทความ ECS นี้ก็ต้องจบลงเพียงเท่านี้ครับ หลังจากนี้ก็น่าจะมีอัปเดตอะไรเพิ่มเข้ามาเรื่อย ๆ ทุก ๆ ท่านก็อย่าลืมอัปเดตข่าวสารกันด้วยนะครับ

อ้างอิง

  1. AWS再入門ブログリレー2022 Amazon ECS編 | DevelopersIO (บทความต้นฉบับ)

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.