אורכיסטרציית קונטיינרים מוכנה לייצור ב-Amazon ECS
בעת הגדרת קלאסטר Amazon ECS לייצור, עליך לבחור בין סוגי ההשקה Fargate ו-EC2, להגדיר Task Definitions עם IAM Task Roles, להקים ECS Service עם אינטגרציית ALB, וליישם צינור CI/CD עם קנה מידה אוטומטי ו-Spot Instances להפחתת עלויות. הניסיון שלנו — 12+ שנים ב-DevOps, מהנדסי AWS מוסמכים — עוזר להימנע ממלכודות נפוצות. לפי תיעוד AWS, ECS הוא שירות אורכיסטרציית קונטיינרים מנוהל במלואו. בהשוואה ל-Kubernetes (K8s), ECS פשוט יותר להקמה ולתפעול: אין צורך לנהל etcd, CNI, או ingress controllers.
איזה סוג השקה לבחור: Fargate או EC2?
סוג ההשקה קובע כיצד הקונטיינרים שלך רצים. להלן השוואה של פרמטרים מרכזיים.
| פרמטר | Fargate | סוג השקה EC2 |
|---|---|---|
| ניהול צמתים | אין (serverless) | מלא (ASG, AMI, patching) |
| קנה מידה | אוטומטי | דרך ASG + Capacity Provider |
| עלות | לפי vCPU ו-RAM של המשימה | לפי מופע EC2 + Spot |
| GPU | לא | כן (P3, G4, וכו') |
| התחלה קרה | ~1-2 שניות | ~10-30 שניות (תלוי ב-AMI) |
| עומס טיפוסי | < 500 משימות | > 500 משימות או GPU |
Fargate הוא קונטיינרים serverless. אין צורך לנהל צמתים, לתקן AMIs, או לעקוב אחר ניצול. אתה משלם עבור vCPU ו-RAM של המשימה. עבור עומס עבודה טיפוסי של 100 משימות, Fargate עולה בערך $3000 לחודש, בעוד EC2 עם Spot יכול להפחית זאת לפחות מ-$1000 לחודש. לקוחות בדרך כלל רואים הפחתות עלויות של עד 70% על ידי שימוש ב-Spot Instances עם סוג השקה EC2. Fargate מהיר פי 10 לפריסה מאשר סוג השקה EC2 עבור קלאסטרים קטנים, מכיוון שהוא מבטל את הצורך בהקצאת צמתים. סוג השקה EC2 — אתה מנהל מופעי EC2 בקלאסטר. עליך להגדיר Auto Scaling Group, לעדכן AMIs. בתמורה: Spot Instances מפחיתות עלויות (חיסכון של עד 70% לעומת On-Demand), צפיפות משימות גבוהה יותר, GPU. עבור רוב ההתקנות הראשוניות, התחל עם Fargate. כשהעומס גדל, אנו עוברים ל-EC2 + Spot.
למה Task Definition הוא הבסיס
ה-Task Definition הוא תבנית להפעלת קונטיינר. הוא מתווסף בגרסה אוטומטית עם כל שינוי. שדות חשובים שלעתים קרובות מוגדרים לא נכון:
- CPU וזיכרון עבור Fargate — רק שילובים קבועים. הקצאת CPU נמוכה גורמת להתחלות קרות איטיות.
-
stopTimeout— זמן לכיבוי מסודר (מקסימום 120 שניות עבור Fargate). אם לא מוגדר, ECS הורג את הקונטיינר לאחר 30 שניות. -
healthCheckברמת ה-Task Definition — נבדק על ידי סוכן ECS, ללא תלות בבדיקת הבריאות של ALB:
{
"healthCheck": {
"command": ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"],
"interval": 30,
"timeout": 5,
"retries": 3,
"startPeriod": 60
}
}{ "healthCheck": { "command": ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"], "interval": 30, "timeout": 5, "retries": 3, "startPeriod": 60 } } הוא תקופת חסד עבור יישומים איטיים.
דוגמה ל-Task Definition (Terraform)
resource "aws_iam_role" "task" {
name = "myapp-ecs-task"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = {
Service = "ecs-tasks.amazonaws.com"
}
Action = "sts:AssumeRole"
}
]
})
}
resource "aws_iam_role_policy" "task" {
name = "myapp-task-permissions"
role = aws_iam_role.task.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = ["s3:GetObject", "s3:PutObject"]
Resource = "arn:aws:s3:::myapp-bucket/*"
},
{
Effect = "Allow"
Action = ["ssm:GetParameter"]
Resource = "arn:aws:ssm:eu-west-1:*:parameter/myapp/*"
}
]
})
} פרמטרים מומלצים ל-Task Definition
| פרמטר | ערך ברירת מחדל | המלצה |
|---|---|---|
startPeriod | 30 שניות | 120 שניות עבור בקשות ארוכות |
stopTimeout | 0 שניות | 60-120 שניות עבור התחלה איטית |
startPeriod | אין | חייב להיות מוגדר |
| CPU (Fargate) | 256 | 1024 עבור ייצור |
הבטחת אבטחה עם IAM Task Roles
קונטיינרים ב-ECS לא צריכים להשתמש באישורים במשתני סביבה. עבור גישה לשירותי AWS, השתמש ב-IAM Task Role. ה-Task Role מספק אוטומטית אישורים זמניים דרך ה-IMDS של הקונטיינר. SDKs (boto3, aws-sdk) קולטים אותם אוטומטית.
resource "aws_ecs_service" "app" {
name = "myapp"
cluster = aws_ecs_cluster.main.id
task_definition = aws_ecs_task_definition.app.arn
desired_count = 3
deployment_circuit_breaker {
enable = true
rollback = true
}
deployment_controller {
type = "ECS"
}
}בנוסף, השתמש ב-Task Execution Role כדי למשוך תמונות מ-ECR ולשלוח לוגים.
שירות: עדכונים מתגלגלים ו-Circuit Breaker
ECS Service מנהל שמירה על המספר הרצוי של משימות רצות ופריסת עדכונים. Deployment Circuit Breaker הוא הגנה מובנית מפני פריסות גרועות. אם משימות לא מתחילות בריאות, ה-Circuit Breaker עוצר את הפריסה ומחזיר אוטומטית לגרסת ה-Task Definition הקודמת, ומפחית כשלי פריסה בעד 80% בהשוואה לפריסות בלעדיו:
# Build и push образа в ECR
aws ecr get-login-password --region eu-west-1 | \
docker login --username AWS --password-stdin \
${AWS_ACCOUNT_ID}.dkr.ecr.eu-west-1.amazonaws.com
docker build -t myapp:${GIT_SHA} .
docker tag myapp:${GIT_SHA} \
${AWS_ACCOUNT_ID}.dkr.ecr.eu-west-1.amazonaws.com/myapp:${GIT_SHA}
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.eu-west-1.amazonaws.com/myapp:${GIT_SHA}
# Обновление Task Definition и деплой Service
aws ecs update-service \
--cluster myapp-cluster \
--service myapp \
--task-definition myapp:$(aws ecs register-task-definition \
--cli-input-json "$(cat taskdef.json | sed 's/IMAGE_TAG/${GIT_SHA}/g')" \
--query 'taskDefinition.revision' --output text) \
--force-new-deployment
ללא Circuit Breaker, אם גרסת תמונה חדשה נכשלת בהתחלה, ECS ימשיך לנסות ללא הגבלת זמן.
אינטגרציית ALB ו-Deregistration
ECS Service + ALB Target Group הוא ההתקנה הסטנדרטית לשירותי web. במהלך scale-in או פריסה, ECS מבטל תחילה את רישום המשימה מה-ALB, ה-ALB מרוקן חיבורים (healthCheck — ברירת מחדל 300 שניות), ואז ECS עוצר את הקונטיינר. עבור פריסות מהירות, ניתן להנמיך את resource "aws_iam_role" "task" { name = "myapp-ecs-task" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Principal = { Service = "ecs-tasks.amazonaws.com" } Action = "sts:AssumeRole" }] }) } resource "aws_iam_role_policy" "task" { name = "myapp-task-permissions" role = aws_iam_role.task.id policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = ["s3:GetObject", "s3:PutObject"] Resource = "arn:aws:s3:::myapp-bucket/*" }, { Effect = "Allow" Action = ["ssm:GetParameter"] Resource = "arn:aws:ssm:eu-west-1:*:parameter/myapp/*" } ] }) } ל-30–60 שניות.
הקמת CI/CD עבור ECS
צינור פריסה סטנדרטי:
# Build and push image to ECR
aws ecr get-login-password --region eu-west-1 | \
docker login --username AWS --password-stdin \
${AWS_ACCOUNT_ID}.dkr.ecr.eu-west-1.amazonaws.com
docker build -t myapp:${GIT_SHA} .
docker tag myapp:${GIT_SHA} \
${AWS_ACCOUNT_ID}.dkr.ecr.eu-west-1.amazonaws.com/myapp:${GIT_SHA}
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.eu-west-1.amazonaws.com/myapp:${GIT_SHA}
# Update Task Definition and deploy Service
aws ecs update-service \
--cluster myapp-cluster \
--service myapp \
--task-definition myapp:$(aws ecs register-task-definition \
--cli-input-json "$(cat taskdef.json | sed 's/IMAGE_TAG/${GIT_SHA}/g')" \
--query 'taskDefinition.revision' --output text) \
--force-new-deployment
תוצרים כלולים
בעת הזמנת התקנת ECS turnkey, אנו מספקים:
- מודולי Terraform עבור קלאסטר, task definitions, IAM, ALB, CI/CD.
- תיעוד עם runbooks — הוראות לתפעול, עדכון, rollback.
- שעתיים של הדרכה לצוות שלך.
- שבועיים של תמיכה לאחר ההשקה — ניטור והתאמות.
רשימת בדיקה להקמת ECS
- קבע את סוג ההשקה (Fargate או EC2).
- צור קלאסטר ECS.
- הגדר Task Definition עם health check ו-stopTimeout.
- הגדר IAM Task Role ו-Task Execution Role.
- צור Service עם Circuit Breaker.
- חבר ALB Target Group.
- הגדר צינור CI/CD (ECR + update-service).
- ודא קנה מידה אוטומטי (HPA או ECS Service Auto Scaling).
לוחות זמנים: הקמת קלאסטר Fargate בסיסי — מ-3 ימים. פרויקטים מורכבים עם EC2, Spot, פריסה אוטומטית — 4–5 ימים.
קבל ייעוץ — אנו נעריך את הפרויקט שלך ונספק הצעה מפורטת.
סיכום: מתי ECS הוא הבחירה הנכונה
ECS היא פלטפורמה בוגרת לאורכיסטרציית קונטיינרים ב-AWS. עבור 80% מהמשימות בייצור, הפונקציונליות שלה מספיקה, והמורכבות התפעולית נמוכה בהרבה מ-Kubernetes. המפתח הוא להגדיר כראוי את הפרטים: Task Definitions, תפקידי IAM, Circuit Breaker. הניסיון שלנו מבטיח שתמנע מטעויות נפוצות ותחסוך עד 50% מתקציב התשתית שלך. צור קשר לייעוץ.







