Вступ
Оркестрація контейнерів та Infrastructure as Code (IaC) є фундаментальними для сучасних хмарних застосунків. AWS надає Amazon ECS та Fargate для запуску контейнеризованих навантажень, CloudFormation для декларативного керування інфраструктурою та SAM (Serverless Application Model) для спрощених безсерверних розгортань.
Цей посібник досліджує визначення завдань ECS, безсерверні контейнери Fargate, керування стеками CloudFormation та синтаксис шаблонів SAM. Ми розглянемо шаблони розгортання контейнерів, blue/green розгортання та production найкращі практики.
Серія AWS Developer Certification
📚 Переглянути повний посібник AWS Developer Certification - Опануйте всі 7 частин з нашим комплексним шляхом навчання.
Це Частина V (Поточна стаття) нашого комплексного 7-частинного посібника для AWS розробників:
- Частина I: IAM EC2 та Auto Scaling
- Частина II: RDS Aurora та DynamoDB
- Частина III: SQS SNS та Kinesis
- Частина IV: Lambda API Gateway
- Частина V: ECS Fargate та IaC (Поточна стаття)
- Частина VI: Cognito KMS Security
- Частина VII: CodePipeline та Monitoring
← Частина IV: Lambda API Gateway | Частина VI: Cognito KMS Security →
Amazon ECS (Elastic Container Service)
Архітектура ECS
ECS оркеструє Docker контейнери на EC2 інстансах або безсерверному Fargate, з вбудованим балансуванням навантаження та автомасштабуванням.
Ключові концепції:
- Cluster: Логічне угруповання завдань або сервісів
- Task Definition: Схема для контейнерів (образ, CPU, пам'ять, порти)
- Task: Запущений екземпляр визначення завдання
- Service: Підтримує бажану кількість завдань, інтегрується з балансувальником навантаження
- ECS Agent: Працює на EC2 інстансах для зв'язку з площиною управління ECS
EC2 проти Fargate типів запуску
| Функція | EC2 Launch Type | Fargate Launch Type |
|---|---|---|
| Інфраструктура | Керування EC2 інстансами | Безсерверний (без серверів) |
| Ціноутворення | Вартість EC2 інстансу | За vCPU/GB-годину |
| Масштабування | Вручну + Auto Scaling | Автоматичне |
| Випадок використання | Оптимізація витрат, контроль | Простота, оплата за використання |
| Сховище | EBS, EFS | Ephemeral (20GB) + EFS |
Визначення завдання ECS
Приклад визначення завдання (JSON):
{
"family": "web-app",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "256",
"memory": "512",
"containerDefinitions": [
{
"name": "nginx",
"image": "123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest",
"portMappings": [
{
"containerPort": 80,
"protocol": "tcp"
}
],
"environment": [
{
"name": "ENVIRONMENT",
"value": "production"
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/web-app",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "ecs"
}
},
"healthCheck": {
"command": ["CMD-SHELL", "curl -f http://localhost/ || exit 1"],
"interval": 30,
"timeout": 5,
"retries": 3
}
}
],
"taskRoleArn": "arn:aws:iam::123456789012:role/ecsTaskRole",
"executionRoleArn": "arn:aws:iam::123456789012:role/ecsExecutionRole"
}
Зареєструвати визначення завдання:
aws ecs register-task-definition --cli-input-json file://task-definition.json
Запуск завдань ECS
Запустити завдання (одноразове виконання):
aws ecs run-task \
--cluster production \
--task-definition web-app:5 \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[subnet-12345],securityGroups=[sg-67890],assignPublicIp=ENABLED}"
Створити сервіс (підтримує бажану кількість):
aws ecs create-service \
--cluster production \
--service-name web-service \
--task-definition web-app:5 \
--desired-count 3 \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[subnet-12345],securityGroups=[sg-67890]}" \
--load-balancers "targetGroupArn=arn:aws:elasticloadbalancing:...,containerName=nginx,containerPort=80"
Автомасштабування сервісу ECS
Target tracking масштабування:
# Зареєструвати масштабовувану ціль
aws application-autoscaling register-scalable-target \
--service-namespace ecs \
--resource-id service/production/web-service \
--scalable-dimension ecs:service:DesiredCount \
--min-capacity 2 \
--max-capacity 10
# Створити політику масштабування (на основі CPU)
aws application-autoscaling put-scaling-policy \
--service-namespace ecs \
--resource-id service/production/web-service \
--scalable-dimension ecs:service:DesiredCount \
--policy-name cpu-scaling \
--policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration '{
"TargetValue": 70.0,
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ECSServiceAverageCPUUtilization"
}
}'
Amazon ECR (Elastic Container Registry)
Основи ECR
ECR зберігає Docker образи з вбудованим скануванням, шифруванням та політиками життєвого циклу.
Завантажити образ в ECR:
# Автентифікувати Docker в ECR
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
# Позначити образ
docker tag my-app:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
# Завантажити в ECR
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
Політика життєвого циклу (автовидалення старих образів):
{
"rules": [
{
"rulePriority": 1,
"description": "Keep last 10 images",
"selection": {
"tagStatus": "any",
"countType": "imageCountMoreThan",
"countNumber": 10
},
"action": {
"type": "expire"
}
}
]
}
AWS CloudFormation
Архітектура CloudFormation
CloudFormation підготовляє інфраструктуру за допомогою декларативних шаблонів (JSON/YAML).
Компоненти шаблону:
- Resources (обов'язково): Ресурси AWS для створення
- Parameters: Вхідні значення для налаштування
- Mappings: Статичні пари ключ-значення
- Outputs: Значення для експорту або відображення
- Conditions: Контроль створення ресурсів
Приклад шаблону CloudFormation
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Simple web application stack'
Parameters:
InstanceType:
Type: String
Default: t3.micro
AllowedValues: [t3.micro, t3.small, t3.medium]
Environment:
Type: String
Default: dev
AllowedValues: [dev, staging, prod]
Mappings:
RegionMap:
us-east-1:
AMI: ami-0c55b159cbfafe1f0
us-west-2:
AMI: ami-0d1cd67c26f5fca19
Conditions:
IsProduction: !Equals [!Ref Environment, prod]
Resources:
WebServerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow HTTP
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
WebServer:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref InstanceType
ImageId: !FindInMap [RegionMap, !Ref 'AWS::Region', AMI]
SecurityGroups:
- !Ref WebServerSecurityGroup
UserData:
Fn::Base64: !Sub |
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "Hello from ${Environment}" > /var/www/html/index.html
Outputs:
WebsiteURL:
Description: URL of the website
Value: !Sub 'http://${WebServer.PublicDnsName}'
Export:
Name: !Sub '${AWS::StackName}-URL'
Операції зі стеками CloudFormation
Створити стек:
aws cloudformation create-stack \
--stack-name my-web-app \
--template-body file://template.yaml \
--parameters ParameterKey=Environment,ParameterValue=prod \
--capabilities CAPABILITY_IAM
Оновити стек:
aws cloudformation update-stack \
--stack-name my-web-app \
--template-body file://template-v2.yaml \
--parameters ParameterKey=InstanceType,ParameterValue=t3.small
Видалити стек:
aws cloudformation delete-stack --stack-name my-web-app
Описати події стеку (усунення неполадок):
aws cloudformation describe-stack-events --stack-name my-web-app
AWS SAM (Serverless Application Model)
Огляд SAM
SAM спрощує безсерверні розгортання зі стислим синтаксисом CloudFormation для Lambda, API Gateway та DynamoDB.
Приклад шаблону SAM:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Serverless API with Lambda and DynamoDB
Globals:
Function:
Runtime: nodejs18.x
Timeout: 30
Environment:
Variables:
TABLE_NAME: !Ref UsersTable
Resources:
# API Gateway
ApiGateway:
Type: AWS::Serverless::Api
Properties:
StageName: prod
Cors:
AllowOrigin: "'*'"
AllowHeaders: "'Content-Type,Authorization'"
# Lambda Function
GetUserFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./src
Handler: index.handler
Events:
GetUser:
Type: Api
Properties:
RestApiId: !Ref ApiGateway
Path: /users/{id}
Method: GET
Policies:
- DynamoDBReadPolicy:
TableName: !Ref UsersTable
# DynamoDB Table
UsersTable:
Type: AWS::Serverless::SimpleTable
Properties:
PrimaryKey:
Name: userId
Type: String
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
Outputs:
ApiUrl:
Description: API Gateway endpoint
Value: !Sub 'https://${ApiGateway}.execute-api.${AWS::Region}.amazonaws.com/prod'
Команди SAM CLI
Збірка та розгортання:
# Ініціалізувати новий SAM проект
sam init --runtime nodejs18.x --name my-app
# Зібрати застосунок
sam build
# Розгорнути в AWS
sam deploy --guided
# Локальне тестування
sam local start-api
sam local invoke GetUserFunction -e events/test.json
Пакування для розгортання:
# Пакування та завантаження в S3
sam package \
--template-file template.yaml \
--output-template-file packaged.yaml \
--s3-bucket my-deployment-bucket
# Розгорнути запакований шаблон
sam deploy \
--template-file packaged.yaml \
--stack-name my-serverless-app \
--capabilities CAPABILITY_IAM
Production найкращі практики
Найкращі практики ECS
- Task Definitions: Використовувати версіювання, незмінні визначення завдань
- Service Discovery: Використовувати AWS Cloud Map для комунікації сервіс-до-сервісу
- Fargate vs EC2: Використовувати Fargate для простоти, EC2 для оптимізації витрат (Reserved Instances)
- Секрети: Зберігати в Secrets Manager або Parameter Store, посилатися у визначенні завдання
- Логування: Увімкнути CloudWatch Logs зі структурованим логуванням
- Health Checks: Налаштувати health checks ELB та контейнера
Найкращі практики CloudFormation
- Модульні шаблони: Використовувати вкладені стеки для повторного використання
- Параметри: Виносити специфічні для середовища значення
- Change Sets: Переглядати зміни перед застосуванням (як Terraform plan)
- Stack Policies: Запобігати випадковому видаленню критичних ресурсів
- Cross-Stack References: Використовувати Outputs та
!ImportValueдля залежностей - Rollback: Увімкнути автоматичне відкочування при невдачі
Найкращі практики SAM
- Локальне тестування: Використовувати
sam localдля розробки перед розгортанням - Змінні середовища: Використовувати секцію Globals для спільної конфігурації
- Policies: Використовувати шаблони політик SAM (DynamoDBReadPolicy, S3CrudPolicy)
- Canary Deployments: Використовувати
AutoPublishAliasз CodeDeploy для поступових розгортань - Layers: Ділитися залежностями між функціями
Моніторинг та усунення неполадок
Метрики ECS (CloudWatch):
CPUUtilization- Використання CPU завданняMemoryUtilization- Використання пам'яті завданняRunningTasksCount- Кількість запущених завдань
Події CloudFormation:
CREATE_IN_PROGRESS→CREATE_COMPLETEUPDATE_IN_PROGRESS→UPDATE_COMPLETEROLLBACK_IN_PROGRESS(при невдачі)
Поширені проблеми:
- Завдання ECS не запускається: Перевірте дозволи ролі завдання, security groups, маршрути підмережі
- Rollback CloudFormation: Перевірте події стеку на предмет невдач створення ресурсів
- Невдале розгортання SAM: Перевірте дозволи S3 bucket, можливості IAM
Поради для іспиту
Ключові концепції:
- Стратегії розміщення завдань ECS: Binpack (вартість), Random, Spread (доступність)
- Fargate: Безсерверний, без керування EC2, оплата за vCPU/GB
- Вбудовані функції CloudFormation:
!Ref,!GetAtt,!Sub,!Join - SAM Transform:
AWS::Serverless-2016-10-31увімкнює синтаксис SAM - ECS Service: Підтримує бажану кількість завдань, інтегрується з ALB/NLB
Поширені сценарії:
- "Потрібні безсерверні контейнери" → Fargate
- "Оптимізація витрат на контейнери" → ECS EC2 з Reserved Instances
- "Розгорнути Lambda + API Gateway" → SAM
- "Керувати інфраструктурою як кодом" → CloudFormation
- "Відкотити невдале розгортання" → Автоматичне відкочування CloudFormation
- "Blue/Green розгортання для ECS" → CodeDeploy з ECS
Висновок
Оркестрація контейнерів AWS з ECS та Fargate у поєднанні з Infrastructure as Code через CloudFormation та SAM надає потужні інструменти для розгортання та керування сучасними застосунками. ECS пропонує гнучкість між EC2 та безсерверним Fargate, CloudFormation забезпечує декларативне керування інфраструктурою, а SAM спрощує безсерверні розгортання.
Обирайте ECS EC2 для оптимізації витрат та контролю, Fargate для безсерверної простоти, CloudFormation для складної інфраструктури та SAM для безсерверних застосунків. Розуміння визначень завдань, керування стеками та шаблонів розгортання є важливим як для production архітектур, так і для іспиту AWS Certified Developer Associate.
Часті запитання
П: Чим відрізняється ECS від Fargate?
ECS - це сервіс оркестрації контейнерів, що працює на EC2 інстансах (ви керуєте) або Fargate (AWS керує). ECS на EC2 забезпечує контроль та економію через Reserved Instances, але вимагає керування інстансами. Fargate пропонує безсерверні контейнери без керування інстансами з оплатою за використання vCPU/пам'яті.
П: Як працюють ECS task definitions?
Task definitions - це JSON blueprint, що визначає Docker образи контейнерів, vCPU, пам'ять, змінні середовища, порти та IAM ролі. Task definitions є версійованими; кожна зміна створює нову версію. ECS Services використовують task definitions для запуску та підтримки бажаної кількості завдань з балансуванням навантаження та авторозгортанням.
П: Що таке CloudFormation drift detection?
Drift detection виявляє зміни, внесені в ресурси стеку поза CloudFormation (наприклад, ручні зміни в консолі). Запустіть виявлення drift на стеку; CloudFormation порівнює поточний стан з шаблоном. Корисно для виявлення незадокументованих змін та забезпечення відповідності інфраструктури як коду.
П: Як працює SAM порівняно з CloudFormation?
SAM розширює CloudFormation зі скороченим синтаксисом для безсерверних ресурсів. Transform: AWS::Serverless-2016-10-31 конвертує синтаксис SAM в CloudFormation. AWS::Serverless::Function створює Lambda + роль + дозволи. SAM CLI надає локальне тестування з sam local. Використовуйте SAM для безсерверних застосунків, CloudFormation для загальної інфраструктури.
П: Чим відрізняються режими розгортання ECS rolling від blue/green?
Rolling розгортання поступово замінює завдання новими версіями в межах одного сервісу, контрольованими minimumHealthyPercent та maximumPercent. Blue/green створює окреме середовище, перемикає трафік та видаляє старе. Rolling швидше з меншими ресурсами; blue/green забезпечує миттєве відкочування та тестування перед переключенням.
П: Як працюють ECS service discovery?
Service Discovery інтегрується з AWS Cloud Map для автоматичної реєстрації DNS task IP адрес. ECS створює записи A або SRV в Route 53 приватній hosted zone. Застосунки запитують ім'я сервісу; Route 53 повертає здорові IP task. Увімкніть з serviceRegistries в визначенні сервісу, вказуючи Cloud Map namespace.
П: Що таке CloudFormation StackSets?
StackSets розгортають стеки CloudFormation в кількох акаунтах та регіонах з однією операцією. Визначте шаблон стеку, цільові акаунти/регіони та параметри; CloudFormation створює екземпляри стеку. Використовуйте для стандартизації інфраструктури організації, базових конфігурацій безпеки або мультирегіонних застосунків з централізованим керуванням.