ECS Fargate CloudFormation SAM: Розгортання контейнерів

AWS Контейнери та Infrastructure as Code: ECS, Fargate, CloudFormation та SAM

Вступ

Оркестрація контейнерів та 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 розробників:

  1. Частина I: IAM EC2 та Auto Scaling
  2. Частина II: RDS Aurora та DynamoDB
  3. Частина III: SQS SNS та Kinesis
  4. Частина IV: Lambda API Gateway
  5. Частина V: ECS Fargate та IaC (Поточна стаття)
  6. Частина VI: Cognito KMS Security
  7. Частина VII: CodePipeline та Monitoring

← Частина IV: Lambda API Gateway | Частина VI: Cognito KMS Security →


Amazon ECS (Elastic Container Service)

Архітектура ECS

ECS оркеструє Docker контейнери на EC2 інстансах або безсерверному Fargate, з вбудованим балансуванням навантаження та автомасштабуванням.

   ECS Cluster   

   Fargate Launch Type   

   EC2 Launch Type   

   pull image   

   pull image   

  EC2 Instance  

  ECS Agent  

  EC2 Instance  

  ECS Agent  

  Fargate Task  

  Serverless  

  Fargate Task  

  Serverless  

  ECS Service  

  Maintains Tasks  

  Application Load Balancer  

  ECR  

  Container Registry  

Ключові концепції:

  • 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).

   AWS Resources   

   creates   

   provisions   

   provisions   

   provisions   

   provisions   

  CloudFormation Template  

  YAML/JSON  

  CloudFormation Stack  

  Resource Group  

  VPC  

  EC2 Instances  

  RDS Database  

  Load Balancer  

Компоненти шаблону:

  • 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

  1. Task Definitions: Використовувати версіювання, незмінні визначення завдань
  2. Service Discovery: Використовувати AWS Cloud Map для комунікації сервіс-до-сервісу
  3. Fargate vs EC2: Використовувати Fargate для простоти, EC2 для оптимізації витрат (Reserved Instances)
  4. Секрети: Зберігати в Secrets Manager або Parameter Store, посилатися у визначенні завдання
  5. Логування: Увімкнути CloudWatch Logs зі структурованим логуванням
  6. Health Checks: Налаштувати health checks ELB та контейнера

Найкращі практики CloudFormation

  1. Модульні шаблони: Використовувати вкладені стеки для повторного використання
  2. Параметри: Виносити специфічні для середовища значення
  3. Change Sets: Переглядати зміни перед застосуванням (як Terraform plan)
  4. Stack Policies: Запобігати випадковому видаленню критичних ресурсів
  5. Cross-Stack References: Використовувати Outputs та !ImportValue для залежностей
  6. Rollback: Увімкнути автоматичне відкочування при невдачі

Найкращі практики SAM

  1. Локальне тестування: Використовувати sam local для розробки перед розгортанням
  2. Змінні середовища: Використовувати секцію Globals для спільної конфігурації
  3. Policies: Використовувати шаблони політик SAM (DynamoDBReadPolicy, S3CrudPolicy)
  4. Canary Deployments: Використовувати AutoPublishAlias з CodeDeploy для поступових розгортань
  5. Layers: Ділитися залежностями між функціями

Моніторинг та усунення неполадок

Метрики ECS (CloudWatch):

  • CPUUtilization - Використання CPU завдання
  • MemoryUtilization - Використання пам'яті завдання
  • RunningTasksCount - Кількість запущених завдань

Події CloudFormation:

  • CREATE_IN_PROGRESSCREATE_COMPLETE
  • UPDATE_IN_PROGRESSUPDATE_COMPLETE
  • ROLLBACK_IN_PROGRESS (при невдачі)

Поширені проблеми:

  • Завдання ECS не запускається: Перевірте дозволи ролі завдання, security groups, маршрути підмережі
  • Rollback CloudFormation: Перевірте події стеку на предмет невдач створення ресурсів
  • Невдале розгортання SAM: Перевірте дозволи S3 bucket, можливості IAM

Поради для іспиту

Ключові концепції:

  1. Стратегії розміщення завдань ECS: Binpack (вартість), Random, Spread (доступність)
  2. Fargate: Безсерверний, без керування EC2, оплата за vCPU/GB
  3. Вбудовані функції CloudFormation: !Ref, !GetAtt, !Sub, !Join
  4. SAM Transform: AWS::Serverless-2016-10-31 увімкнює синтаксис SAM
  5. 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 створює екземпляри стеку. Використовуйте для стандартизації інфраструктури організації, базових конфігурацій безпеки або мультирегіонних застосунків з централізованим керуванням.