الجزء 20 من سلسلة تعلّم AWS من الصفر

الحاويات: ECS وFargate وEKS

وش هي الحاوية وكيف تختلف عن الجهاز الافتراضي، وتخزين الصور في ECR، وتشغيلها بـ ECS على Fargate، والفرق بين دوري IAM، ومتى تختار EKS، مع تجربة عملية تشوف فيها Service يعوض مهمة وقفت.

في هذا المقال
  1. وش هي الحاوية؟
  2. Amazon ECR: بيت صورك
  3. Amazon ECS: طريقة AWS لتشغيل الحاويات
  4. Amazon EKS: Kubernetes
  5. عملي: Service يعوض مهمة وقفت
  6. الخلاصة
  7. اختبر نفسك

في الجزء التاسع عشر فصلنا الخدمات عن بعض. بس كل خدمة لسا تحتاج مكان تشتغل فيه، وعلى سيرفر EC2 هذا يعني صورة نظام، وتحديثات، ومكتبات، والجملة المشهورة: "عندي يشتغل".

الحاويات (Containers) تحل هذا: تغلف التطبيق مع كل اللي يحتاجه في حزمة وحدة، ويشتغل بنفس الطريقة على جهازك وفي الإنتاج.

وش هي الحاوية؟

الحاوية عملية معزولة لها ملفاتها ومكتباتها، وتتشارك نظام تشغيل المضيف بدل ما تحمل نظامها.

الأجهزة الافتراضية تطبيق تطبيق نظام كامل نظام كامل Hypervisor العتاد الحاويات تطبيق تطبيق تطبيق محرك الحاويات نظام واحد مشترك العتاد
كل جهاز افتراضي يحمل نظام تشغيل كامل. الحاويات تتشارك نظام المضيف، فهي أخف وتشتغل في ثواني.
الجهاز الافتراضي الحاوية
يحتوي نظام تشغيل كامل والتطبيق التطبيق ومكتباته
الحجم جيجابايتات غالباً ميجابايتات
التشغيل دقايق ثواني
العزل أقوى بنظام مستقل أخف بنواة مشتركة

الصورة والحاوية والمستودع

ثلاث كلمات بتتكرر عليك:

  • الصورة (Image): حزمة للقراءة فقط فيها التطبيق ومكتباته، مثل الوصفة.
  • الحاوية (Container): نسخة شغالة من الصورة. والصورة الوحدة تشتغل كألف حاوية.
  • المستودع (Registry): مكان تخزين الصور، مثل Docker Hub أو Amazon ECR.

أشهر أداة لبناء الصور هي Docker. تكتب محتوى الصورة في ملف Dockerfile:

dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/

ثم تبنيها، وتجربها على جهازك، وترفعها للمستودع:

Bash
docker build -t shop .
docker run -p 8080:80 shop
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/shop

Amazon ECR: بيت صورك

ECR (Elastic Container Registry) مستودع الصور في AWS، وتخزينه على S3 من وراء الكواليس:

  • مستودعات خاصة: الوصول لها عبر IAM، فالسيرفر أو المهمة تحتاج صلاحية عشان تسحب.
  • مستودعات عامة: أي أحد يسحب منها، عبر معرض ECR Public.
  • إضافات: فحص الصور من الثغرات، وإصدارات بالوسوم، وقواعد دورة حياة تحذف الصور القديمة.

Amazon ECS: طريقة AWS لتشغيل الحاويات

ECS (Elastic Container Service) ياخذ صورك ويشغلها، ويبقيها شغالة، ويحطها خلف موزع حمل. هو خدمة AWS الخاصة، وأبسط من Kubernetes، والخدمة نفسها ما عليها رسوم إضافية. تدفع على السعة اللي تشتغل عليها.

أربع مصطلحات تغطي الخدمة كلها:

المصطلح معناه يشبه
Cluster مجموعة منطقية تشتغل فيها المهام أسطول سيرفراتك
Task Definition وصفة: الصورة والمعالج والذاكرة والمنافذ والأدوار قالب التشغيل
Task حاوية شغالة أو أكثر من هذي الوصفة السيرفر
Service يبقي عدد محدد من المهام شغال، ويعوض اللي تفشل مجموعة Auto Scaling
ALB موزع الحمل مجموعة ECS Service يبقي 3 مهام شغالة منطقة التوفر A مهمة 1 مهمة 2 منطقة التوفر B مهمة 3 جديدة لما يزيد الحمل
الـ Service يحافظ على عدد المهام اللي طلبته في مناطق التوفر، وموزع الحمل يوجه الزوار للمهام السليمة.

مين يشغّل الحاويات؟

الحاويات تحتاج سعة حوسبة، وعندك ثلاث خيارات:

الخيار مين يدير السيرفرات يناسب
Fargate AWS بالكامل، وما تشوف أي سيرفر أغلب التطبيقات، وابدأ به
Managed Instances AWS تديرها، وأنت تختار أنواع السيرفرات تحتاج GPU أو سيرفرات معينة بدون إدارتها
EC2 أنت، عبر مجموعة Auto Scaling تحكم كامل، أو تقليل تكلفة حمل ثابت

مع Fargate تحدد المعالج والذاكرة للمهمة، وتدفع عليها طول ما هي شغالة. وFargate Spot يخفض السعر كثير للمهام اللي تتحمل الانقطاع، بنفس فكرة سيرفرات Spot.

دورين في IAM، والخلط بينهم كلاسيكي

كل مهمة على Fargate ممكن يكون لها دورين، وكل واحد له شغل مختلف:

الدور مين يستخدمه مثال
Task Execution Role ECS نفسه، عشان يجهز المهمة سحب الصورة من ECR وإرسال السجلات لـ CloudWatch
Task Role كودك داخل الحاوية القراءة من S3 أو الكتابة في DynamoDB

لو فشلت المهمة عند التشغيل بخطأ في السحب، شوف Execution Role. ولو جاء كودك AccessDenied وهو شغال، شوف Task Role. وخل لكل خدمة دورها، مو دور واحد مشترك.

الشبكة وتوزيع الحمل

على Fargate كل مهمة تاخذ واجهة شبكة خاصة فيها وIP خاص، فلها Security Group مثل السيرفر. وحط موزع حمل ALB قدام الـ Service، وهو يسجل المهام الجديدة تلقائياً ويشيل الفاشلة. وهذا يناسب أغلب تطبيقات الويب، وتختار NLB للسعة العالية جداً أو عناوين IP الثابتة.

التخزين

قرص الحاوية يروح معها. ولمشاركة الملفات بين المهام، اربط EFS، ويشتغل على Fargate وEC2. وأي شي مهم، خزنه خارج الحاوية في S3 أو قاعدة بيانات.

التوسع

Service Auto Scaling يغيّر عدد المهام حسب متوسط المعالج أو الذاكرة، أو الطلبات لكل مهمة من موزع الحمل، أو جدول زمني. والسياسات هي نفسها اللي شفناها في الجزء السابع.

وعلى Fargate هذا كل اللي تحتاجه. أما مع EC2 فيه طبقة ثانية، لأنك تحتاج سيرفرات تنزل عليها المهام الجديدة. Capacity Provider يربط الـ Service بمجموعة Auto Scaling ويزيد السيرفرات لما تحتاجها المهام.

مو بس خدمات ويب

المهام مو لازم تبقى شغالة دايماً. ثلاث أنماط معروفة:

النمط كيف يشتغل
رد فعل على حدث ينزل ملف في S3، وEventBridge يشغّل مهمة Fargate تعالجه، وتوقف لما تخلص
شغل مجدول EventBridge Scheduler يشغّل مهمة كل ليلة لشغل دفعات
عمّال طابور Service يسحب من SQS، ويتوسع حسب عدد الرسائل المنتظرة

ECS Express Mode: الطريق المختصر

تبي تطبيق ويب من صورة بدون ما تجهز كل قطعة؟ ECS Express Mode ياخذ صورة ودورين، وينشئ Service على Fargate وموزع حمل وفحوصات صحة وتوسع ورابط. وكلها تبقى في حسابك، فتقدر تعدلها بعدين.

Amazon EKS: Kubernetes

Kubernetes نظام مفتوح المصدر لتشغيل الحاويات، منتشر في كل السحابات ومراكز البيانات. EKS (Elastic Kubernetes Service) يشغّل لك طبقة التحكم فيه عبر عدة مناطق توفر، بـ 0.10 دولار في الساعة لكل Cluster للإصدارات اللي تحت الدعم العادي، فوق تكلفة السعة. والإصدار اللي تجاوز هذي الفترة يكلف 0.60 دولار في الساعة.

المصطلحات تختلف عن ECS: المهمة اسمها Pod، والسيرفر اسمه Node.

خيار الـ Nodes كيف يشتغل
EKS Auto Mode AWS تجهز الـ Nodes وتحدثها وتوسعها، وهو اللي توصي فيه AWS مستقبلاً
Managed Node Groups AWS تنشئ السيرفرات وتحدثها، وأنت تختارها
Self-managed Nodes أنت تتكفل بكل شي، للمتطلبات الخاصة
Fargate كل Pod يشتغل معزول بدون Nodes، وهو متاح، بس Auto Mode مفضل عليه

وللتخزين، يستخدم EKS تعريفات CSI لربط EBS أو EFS أو FSx.

ECS أو EKS؟

ECS EKS
التعقيد مفاهيم أقل وتعلم سريع نظام كبير وفيه الكثير تتعلمه
النقل AWS فقط نفس الأدوات تشتغل في أي مكان
المنظومة تكامل قريب مع AWS منظومة مفتوحة ضخمة
تكلفة الخدمة نفسها مجانية بالساعة لكل Cluster
اختره لو تبدأ من جديد وشغلك على AWS فريقك يعرف Kubernetes أو تشتغل على أكثر من سحابة

لو ما فيه شي يدفعك لـ Kubernetes، ابدأ بـ ECS على Fargate.

حاويات على سيرفراتك

تحتاج نفس الأدوات خارج AWS، مثل مركز بياناتك؟

الخيار وش يسوي
ECS Anywhere يسجل سيرفراتك أو أجهزتك الافتراضية في مجموعة ECS
EKS Hybrid Nodes يضيف سيرفراتك كعقد في مجموعة EKS
EKS Anywhere يشغّل مجموعات Kubernetes على بنيتك، للبيئات المعزولة
EKS Distro مكونات Kubernetes اللي يقوم عليها EKS، تشغلها وتدعمها بنفسك

عملي: Service يعوض مهمة وقفت

بنشغل صورة Nginx عامة على Fargate، بدون بناء شي. من CloudShell، أنشئ الـ Cluster واكتب الوصفة. والصورة من مستودع عام بدون سجلات ما تحتاج Execution Role:

Bash
aws ecs create-cluster --cluster-name series-cluster \
  --query cluster.status

cat > task.json <<'EOF'
{
  "family": "web",
  "requiresCompatibilities": ["FARGATE"],
  "networkMode": "awsvpc",
  "cpu": "256",
  "memory": "512",
  "containerDefinitions": [{
    "name": "web",
    "image": "public.ecr.aws/nginx/nginx:latest",
    "portMappings": [{"containerPort": 80}],
    "essential": true
  }]
}
EOF

aws ecs register-task-definition --cli-input-json file://task.json \
  --query taskDefinition.family

جهز الشبكة: الـ VPC الافتراضي، وSubnet، وSecurity Group يسمح بالمنفذ 80 من CloudShell حقك فقط:

Bash
VPC=$(aws ec2 describe-vpcs --filters Name=isDefault,Values=true \
  --query "Vpcs[0].VpcId" --output text)
SUBNET=$(aws ec2 describe-subnets --filters Name=vpc-id,Values=$VPC \
  --query "Subnets[0].SubnetId" --output text)

SG=$(aws ec2 create-security-group --group-name series-web \
  --description "Series web task" --vpc-id $VPC \
  --query GroupId --output text)
aws ec2 authorize-security-group-ingress --group-id $SG \
  --protocol tcp --port 80 \
  --cidr $(curl -s https://checkip.amazonaws.com)/32

NET="awsvpcConfiguration={subnets=[$SUBNET],securityGroups=[$SG],assignPublicIp=ENABLED}"

شغّل مهمة وحدة. لو هذا أول استخدام لك لـ ECS وجاك خطأ عن الدور المرتبط بالخدمة، انتظر شوي وأعد الأمر:

Bash
TASK=$(aws ecs run-task --cluster series-cluster --task-definition web \
  --launch-type FARGATE --network-configuration "$NET" \
  --query "tasks[0].taskArn" --output text)

aws ecs wait tasks-running --cluster series-cluster --tasks $TASK

خذ عنوانها وجربها:

Bash
ENI=$(aws ecs describe-tasks --cluster series-cluster --tasks $TASK \
  --query "tasks[0].attachments[0].details[?name=='networkInterfaceId'].value" \
  --output text)
IP=$(aws ec2 describe-network-interfaces --network-interface-ids $ENI \
  --query "NetworkInterfaces[0].Association.PublicIp" --output text)

curl -s http://$IP | grep -i "<title>"

بتشوف <title>Welcome to nginx!</title>. أول حاوية لك شغالة، بدون أي سيرفر تشوفه. الحين أوقفها، وبتبقى واقفة لأن ما فيه أحد يهتم فيها:

Bash
aws ecs stop-task --cluster series-cluster --task $TASK \
  --query task.lastStatus

أنشئ Service يبقي مهمة وحدة شغالة:

Bash
aws ecs create-service --cluster series-cluster --service-name web \
  --task-definition web --desired-count 1 --launch-type FARGATE \
  --network-configuration "$NET" --query service.status

aws ecs wait services-stable --cluster series-cluster --services web

FIRST=$(aws ecs list-tasks --cluster series-cluster --service-name web \
  --query "taskArns[0]" --output text)
echo $FIRST

aws ecs stop-task --cluster series-cluster --task $FIRST \
  --query task.lastStatus

انتظر دقيقة، ثم اعرض المهام:

Bash
aws ecs list-tasks --cluster series-cluster --service-name web \
  --query taskArns

الرقم تغير. الـ Service لاحظ إن المهمة راحت وشغل غيرها بدون ما تحرك إصبع.

Bash
aws ecs delete-service --cluster series-cluster --service web --force \
  --query service.status
aws ecs wait services-inactive --cluster series-cluster --services web
aws ecs delete-cluster --cluster series-cluster --query cluster.status
aws ecs deregister-task-definition --task-definition web:1 \
  --query taskDefinition.status
aws ec2 delete-security-group --group-id $SG

الخلاصة

  • الحاوية تغلف التطبيق ومكتباته وتتشارك نظام المضيف، فهي خفيفة وسريعة.
  • ECR يخزن الصور، وECS يشغلها عبر Task Definition وTask وService.
  • Fargate يريحك من إدارة السيرفرات، وهو أفضل بداية.
  • Execution Role لـ ECS، وTask Role لكودك.
  • EKS لمن يحتاج Kubernetes، وECS Express Mode الطريق المختصر لتطبيق ويب.

اختبر نفسك

قبل ما تكمل، جرّب هذي الأسئلة عشان تتأكد إنك فهمت الجزء. كل سؤال موقف عملي، وبعد ما تجاوب يطلع لك الشرح.

السؤال 1 من 6

مهمة على Fargate تبدأ عادي وتخدم الزيارات، بس لما يكتب كودها في DynamoDB يطلع له AccessDenied. وين يضيف الفريق الصلاحية؟

اعرض الجواب

الجواب الصحيح: D

الـ Task Role لكودك داخل الحاوية. وبداية المهمة العادية تبين إن Execution Role شغال زي ما ينبغي.

  • A: هذا يستخدمه ECS عشان يجهز المهمة، مثل سحب الصورة وإرسال السجلات.
  • B: الـ Security Group يتحكم في زيارات الشبكة، وهذا الخطأ عن الصلاحيات.
  • C: Fargate ما فيه سيرفرات تربط فيها شي، فالـ Instance Profile مو متاح.

للمراجعة: دورين في IAM، والخلط بينهم كلاسيكي في هذا الجزء، وAmazon ECS task IAM role في وثائق AWS.

السؤال 2 من 6

شركة تشغّل تطبيقاتها على Kubernetes في مركز بياناتها وعلى سحابة ثانية. وفريقها يعرف أدوات Kubernetes كويس ويبي يكمل عليها في AWS. وش يناسب؟

اعرض الجواب

الجواب الصحيح: B

EKS يشغّل طبقة التحكم في Kubernetes لك، وأدوات الفريق تستمر تشتغل، هنا وفي غيرها.

  • A: هذي بداية ممتازة لأغلب التطبيقات، بس هو نظام AWS الخاص، مو Kubernetes.
  • C: هذا يبني خدمة ويب على ECS من صورة، وهو مو Kubernetes كمان.
  • D: هذا يشغّل دوال مع الأحداث، وما فيه Kubernetes.

للمراجعة: ECS أو EKS؟ في هذا الجزء، وWhat is Amazon EKS? في وثائق AWS.

السؤال 3 من 6

مهمة دفعية تشتغل في حاوية كل ليلة حوالي ساعتين، وما فيه شي يحتاج يشتغل باقي اليوم. وش يناسب بأقل تكلفة؟

اعرض الجواب

الجواب الصحيح: C

الجدول يبدأ مهمة تتوقف لما تخلص، وعلى Fargate تدفع بس وقت تشغيلها.

  • A: بتدفع على مهمة 24 ساعة في اليوم، عشان ساعتين شغل.
  • B: تشغيل Lambda ينتهي عند 15 دقيقة، وهذا أقل بكثير من ساعتين.
  • D: بتدفع على السيرفر طول الوقت، ولازم تديره كمان.

للمراجعة: مو بس خدمات ويب في هذا الجزء، وUsing Amazon EventBridge Scheduler to schedule Amazon ECS tasks في وثائق AWS.

السؤال 4 من 6

عدة مهام Fargate في Service واحد تحتاج تقرأ وتكتب نفس الملفات المرفوعة، والملفات لازم تبقى لما تتوقف مهمة. وش يربط الفريق؟

اعرض الجواب

الجواب الصحيح: A

EFS نظام ملفات مشترك تقدر المهام تربطه على Fargate وEC2، والملفات تبقى خارج أي مهمة.

  • B: قرص الحاوية يختفي معها، وما ينشارك مع المهام الثانية.
  • C: هذا قرص مؤقت على سيرفر، وFargate ما يعطيك سيرفر تربطه فيه.
  • D: هذا يخزن صور الحاويات، مو ملفات التطبيق.

للمراجعة: التخزين في هذا الجزء، وUse Amazon EFS volumes with Amazon ECS في وثائق AWS.

السؤال 5 من 6

ECS Service يشتغل على سيرفرات EC2 في مجموعة Auto Scaling. ووقت الذروة يحتاج مهام أكثر، وهذي المهام تحتاج سيرفرات تنزل عليها. أي ميزتين يعالجون هذا؟ (اختر اثنين.)

اعرض الجواب

الجواب الصحيح: A + E

Service Auto Scaling يغير عدد المهام، والـ Capacity Provider يضيف سيرفرات لما تحتاجها المهام. وعلى EC2 تحتاج الطبقتين.

  • B: هذا يخلي ECS يسحب الصور ويرسل السجلات، وما له علاقة بالتوسع.
  • C: هذا يدور ثغرات في الصور.
  • D: هذا يوزع الزيارات على المهام الموجودة، وما يضيف مهام.

للمراجعة: التوسع في هذا الجزء، وAutomatically scale your Amazon ECS service وAmazon ECS capacity providers for EC2 workloads في وثائق AWS.

السؤال 6 من 6

شركة تشغّل حاوياتها على ECS في AWS. وبعضها لازم الحين يشتغل على سيرفرات في مصنعها، والفريق يبي يكمل بنفس أدوات ECS. وش يناسب؟

اعرض الجواب

الجواب الصحيح: B

ECS Anywhere يسجل سيرفراتك أو أجهزتك الافتراضية في مجموعة ECS، فيكمل الفريق بأدواته.

  • A: هذي مكونات Kubernetes تشغلها وتدعمها بنفسك، والفريق يستخدم ECS.
  • C: هذا يشغّل المهام على سعة AWS بسعر أقل، مو على سيرفراتك.
  • D: هذا يشتغل في AWS، وما عاد يقبل عملاء جدد.

للمراجعة: حاويات على سيرفراتك في هذا الجزء، وAmazon ECS clusters for external instances في وثائق AWS.

الحاويات لسا تشتغل وتكلف وهي منتظرة. طيب لو كودك يشتغل بس لما يكون فيه شغل، وما تدفع شي غير كذا؟ في الجزء الحادي والعشرين نبني API بـ Lambda وAPI Gateway وDynamoDB.