Админка
пожалуйста подождите

AWS Elastic Beanstalk предоставляет управляемую платформу для развертывания веб-приложений без управления базовой инфраструктурой. Он берет на себя выделение мощностей, балансировку нагрузки, автомасштабирование и мониторинг состояния приложения. Это руководство рассматривает развертывание контейнеризованных приложений в Elastic Beanstalk с точки зрения senior-разработчика.

Почему Elastic Beanstalk

Elastic Beanstalk предлагает несколько преимуществ:

  1. Управляемая инфраструктура: AWS управляет серверами, балансировщиками нагрузки и масштабированием
  2. Поддержка Docker: развертывайте контейнеры без сложности Kubernetes
  3. Простые откаты: откат к предыдущим версиям в один клик
  4. Интегрированный мониторинг: метрики CloudWatch «из коробки»
  5. Экономичность: вы платите только за базовые ресурсы AWS

Начальная настройка

Создание приложения Elastic Beanstalk

  1. Перейдите в AWS Management Console
  2. Найдите "Elastic Beanstalk" через Find Services
  3. Нажмите "Create Application"
  4. Введите имя приложения (например, "my-docker-app")
  5. Выберите "Docker" в качестве платформы
  6. Выберите "Docker running on 64bit Amazon Linux 2"
  7. Нажмите "Create Application"

Дождитесь создания окружения (зеленая галочка означает успех).

Настройка типа инстанса

Инстанс t2.micro по умолчанию часто не укладывается в таймаут во время сборок. Обновите до t2.small:

  1. В левом боковом меню нажмите "Configuration"
  2. Найдите "Capacity" и нажмите "Edit"
  3. Измените "Instance Type" с t2.micro на t2.small
  4. Нажмите "Apply"

Примечание: t2.small не входит в free tier, но предотвращает сбои сборки.

Конфигурация Docker

Развертывание одного контейнера

Создайте Dockerfile в корне проекта:

# Этап сборки
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# Этап production
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Мультиконтейнерное развертывание с Docker Compose

Создайте docker-compose.yml для Elastic Beanstalk:

version: '3.8'
services:
nginx:
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- "80:80"
depends_on:
- api
- frontend
api:
build:
context: ./api
dockerfile: Dockerfile
environment:
- NODE_ENV=production
- DATABASE_URL=${DATABASE_URL}
- REDIS_HOST=redis
depends_on:
- redis
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
environment:
- API_URL=http://api:5000
redis:
image: redis:alpine
worker:
build:
context: ./worker
dockerfile: Dockerfile
environment:
- REDIS_HOST=redis

Создайте nginx/default.conf:

upstream frontend {
server frontend:3000;
}
upstream api {
server api:5000;
}
server {
listen 80;
location / {
proxy_pass http://frontend;
}
location /sockjs-node {
proxy_pass http://frontend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://api;
}
}

CI/CD с Travis CI

Настройка пользователя IAM

Создайте учетные данные для развертывания:

  1. Найдите "IAM" в AWS Console
  2. Нажмите "Users" → "Add User"
  3. Введите имя пользователя: "eb-deploy-user"
  4. Выберите "Programmatic Access"
  5. Нажмите "Attach Existing Policies Directly"
  6. Найдите и выберите "AWSElasticBeanstalkFullAccess"
  7. Завершите создание и сохраните Access Key ID и Secret

Конфигурация Travis

Добавьте учетные данные AWS в Travis:

  1. Перейдите в Travis Dashboard
  2. Нажмите репозиторий → "More Options" → "Settings"
  3. Добавьте переменные окружения:

- AWSACCESSKEY: ваш IAM access key - AWSSECRETKEY: ваш IAM secret key

Создайте .travis.yml:

language: generic
services:
- docker
before_install:
- docker build -t my-app-test -f Dockerfile.dev .
script:
- docker run -e CI=true my-app-test npm test -- --coverage
deploy:
provider: elasticbeanstalk
region: us-east-1
app: my-docker-app
env: my-docker-app-env
bucket_name: elasticbeanstalk-us-east-1-123456789012
bucket_path: my-docker-app
on:
branch: main
access_key_id: $AWS_ACCESS_KEY
secret_access_key: $AWS_SECRET_KEY

Найдите имя вашего бакета:

  1. Перейдите в S3 в AWS Console
  2. Найдите бакет, начинающийся с "elasticbeanstalk-", соответствующий вашему региону
  3. Скопируйте полное имя бакета

Конфигурация базы данных с RDS

Создание инстанса RDS

  1. Найдите "RDS" в AWS Console
  2. Нажмите "Create Database"
  3. Выберите "PostgreSQL" (или MySQL)
  4. Для тестирования выберите шаблон "Free tier"
  5. Настройте:

- DB instance identifier: my-app-db - Master username: admin - Master password: (надежный пароль) 6. В разделе "Connectivity": - Выберите ваш VPC - Создайте новую security group: my-app-db-sg 7. Нажмите "Create Database"

Настройка security groups

Разрешите Elastic Beanstalk доступ к RDS:

  1. Перейдите в EC2 → Security Groups
  2. Найдите вашу security group для RDS
  3. Отредактируйте inbound rules
  4. Добавьте правило:

- Type: PostgreSQL (port 5432) - Source: Security group вашего окружения EB 5. Сохраните правила

Задание переменных окружения

  1. Перейдите в Elastic Beanstalk → Configuration
  2. Найдите "Software" и нажмите "Edit"
  3. В разделе "Environment properties" добавьте:

- DATABASEURL: postgres://admin:password@hostname:5432/myapp - RAILSENV: production - SECRETKEYBASE: (сгенерируйте с помощью rails secret) 4. Нажмите "Apply"

Redis с ElastiCache

Создание кластера Redis

  1. Найдите "ElastiCache" в AWS Console
  2. Нажмите "Create" в разделе Redis
  3. Настройте:

- Name: my-app-redis - Node type: cache.t3.micro - Number of replicas: 0 (для разработки) 4. Выберите ваш VPC и subnet group 5. Создайте новую security group 6. Нажмите "Create"

Настройка безопасности

  1. Отредактируйте security group ElastiCache
  2. Добавьте inbound rule:

- Type: Custom TCP (port 6379) - Source: security group окружения EB 3. Добавьте переменную окружения в EB: - REDIS_HOST: (endpoint ElastiCache без порта)

Health checks и мониторинг

Настройка health check

Создайте .ebextensions/healthcheck.config:

option_settings:
aws:elasticbeanstalk:application:
Application Healthcheck URL: /health
aws:elasticbeanstalk:environment:process:default:
HealthCheckPath: /health
HealthCheckInterval: 30
HealthCheckTimeout: 5
HealthyThresholdCount: 3
UnhealthyThresholdCount: 5

Реализуйте health endpoint в вашем приложении:

// Пример Express.js
app.get('/health', (req, res) => {
// Проверка подключения к базе данных
db.query('SELECT 1')
.then(() => {
res.status(200).json({ status: 'healthy' });
})
.catch(() => {
res.status(503).json({ status: 'unhealthy' });
});
});

Алерты CloudWatch

Создайте .ebextensions/cloudwatch.config:

Resources:
CPUAlarmHigh:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmDescription: "CPU > 80% for 5 minutes"
MetricName: CPUUtilization
Namespace: AWS/EC2
Statistic: Average
Period: 300
EvaluationPeriods: 1
Threshold: 80
ComparisonOperator: GreaterThanThreshold
AlarmActions:
- !Ref NotificationTopic
NotificationTopic:
Type: AWS::SNS::Topic
Properties:
Subscription:
- Endpoint: [email protected]
Protocol: email

Конфигурация автомасштабирования

Создайте .ebextensions/autoscaling.config:

option_settings:
aws:autoscaling:asg:
MinSize: 2
MaxSize: 10
aws:autoscaling:trigger:
MeasureName: CPUUtilization
Statistic: Average
Unit: Percent
LowerThreshold: 30
UpperThreshold: 70
LowerBreachScaleIncrement: -1
UpperBreachScaleIncrement: 1
aws:elasticbeanstalk:environment:
LoadBalancerType: application

Конфигурация HTTPS

Запрос SSL-сертификата

  1. Перейдите в AWS Certificate Manager (ACM)
  2. Нажмите "Request Certificate"
  3. Введите домен: *.example.com
  4. Подтвердите через DNS или email
  5. Дождитесь выпуска сертификата

Настройка HTTPS

Создайте .ebextensions/https.config:

option_settings:
aws:elb:listener:443:
ListenerProtocol: HTTPS
InstanceProtocol: HTTP
InstancePort: 80
SSLCertificateId: arn:aws:acm:region:account:certificate/id
aws:elb:listener:80:
ListenerEnabled: false

Лучшие практики развертывания

Blue-Green развертывания

Для развертываний без простоя:

  1. Создайте новое окружение (клонируйте существующее)
  2. Разверните новую версию в новом окружении
  3. Тщательно протестируйте
  4. Поменяйте URL окружений в консоли EB
  5. Удалите старое окружение после проверки

Rolling updates

Настройте в .ebextensions/deployment.config:

option_settings:
aws:elasticbeanstalk:command:
DeploymentPolicy: Rolling
BatchSizeType: Percentage
BatchSize: 25

Устранение неполадок

Просмотр логов

# Использование EB CLI
eb logs
# Или в AWS Console:
# Elastic Beanstalk → Logs → Request Logs

Распространенные проблемы

Таймаут сборки: увеличьте размер инстанса до t2.small или больше

Контейнер не запускается: проверьте логи Docker:

eb ssh
docker logs $(docker ps -q)

Подключение к базе данных отклонено: убедитесь, что правила security group разрешают трафик из EB в RDS

502 Bad Gateway: приложение упало или не слушает на правильном порту

Ключевые выводы

  1. Используйте Docker: контейнеризуйте для консистентных развертываний
  2. Разделяйте ответственность: база данных и кэш — в управляемых сервисах
  3. Security groups имеют значение: настраивайте внимательно для взаимодействия сервисов
  4. Переменные окружения: никогда не хардкодьте учетные данные
  5. Активно мониторьте: настройте алерты CloudWatch с первого дня
  6. Планируйте масштабирование: настройте автомасштабирование до того, как оно понадобится

Elastic Beanstalk обеспечивает отличный баланс между абстракцией инфраструктуры и контролем, что делает его идеальным для команд, которым нужны управляемые развертывания без полной сложности Kubernetes.

 
 
 
Языки
Темы
Copyright © 1999 — 2026
Зетка Интерактив