AWS Elastic Beanstalk предоставляет управляемую платформу для развертывания веб-приложений без управления базовой инфраструктурой. Он берет на себя выделение мощностей, балансировку нагрузки, автомасштабирование и мониторинг состояния приложения. Это руководство рассматривает развертывание контейнеризованных приложений в Elastic Beanstalk с точки зрения senior-разработчика.
Почему Elastic Beanstalk
Elastic Beanstalk предлагает несколько преимуществ:
- Управляемая инфраструктура: AWS управляет серверами, балансировщиками нагрузки и масштабированием
- Поддержка Docker: развертывайте контейнеры без сложности Kubernetes
- Простые откаты: откат к предыдущим версиям в один клик
- Интегрированный мониторинг: метрики CloudWatch «из коробки»
- Экономичность: вы платите только за базовые ресурсы AWS
Начальная настройка
Создание приложения Elastic Beanstalk
- Перейдите в AWS Management Console
- Найдите "Elastic Beanstalk" через Find Services
- Нажмите "Create Application"
- Введите имя приложения (например, "my-docker-app")
- Выберите "Docker" в качестве платформы
- Выберите "Docker running on 64bit Amazon Linux 2"
- Нажмите "Create Application"
Дождитесь создания окружения (зеленая галочка означает успех).
Настройка типа инстанса
Инстанс t2.micro по умолчанию часто не укладывается в таймаут во время сборок. Обновите до t2.small:
- В левом боковом меню нажмите "Configuration"
- Найдите "Capacity" и нажмите "Edit"
- Измените "Instance Type" с t2.micro на t2.small
- Нажмите "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
Создайте учетные данные для развертывания:
- Найдите "IAM" в AWS Console
- Нажмите "Users" → "Add User"
- Введите имя пользователя: "eb-deploy-user"
- Выберите "Programmatic Access"
- Нажмите "Attach Existing Policies Directly"
- Найдите и выберите "AWSElasticBeanstalkFullAccess"
- Завершите создание и сохраните Access Key ID и Secret
Конфигурация Travis
Добавьте учетные данные AWS в Travis:
- Перейдите в Travis Dashboard
- Нажмите репозиторий → "More Options" → "Settings"
- Добавьте переменные окружения:
- 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
Найдите имя вашего бакета:
- Перейдите в S3 в AWS Console
- Найдите бакет, начинающийся с "elasticbeanstalk-", соответствующий вашему региону
- Скопируйте полное имя бакета
Конфигурация базы данных с RDS
Создание инстанса RDS
- Найдите "RDS" в AWS Console
- Нажмите "Create Database"
- Выберите "PostgreSQL" (или MySQL)
- Для тестирования выберите шаблон "Free tier"
- Настройте:
- 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:
- Перейдите в EC2 → Security Groups
- Найдите вашу security group для RDS
- Отредактируйте inbound rules
- Добавьте правило:
- Type: PostgreSQL (port 5432) - Source: Security group вашего окружения EB 5. Сохраните правила
Задание переменных окружения
- Перейдите в Elastic Beanstalk → Configuration
- Найдите "Software" и нажмите "Edit"
- В разделе "Environment properties" добавьте:
- DATABASEURL: postgres://admin:password@hostname:5432/myapp - RAILSENV: production - SECRETKEYBASE: (сгенерируйте с помощью rails secret) 4. Нажмите "Apply"
Redis с ElastiCache
Создание кластера Redis
- Найдите "ElastiCache" в AWS Console
- Нажмите "Create" в разделе Redis
- Настройте:
- Name: my-app-redis - Node type: cache.t3.micro - Number of replicas: 0 (для разработки) 4. Выберите ваш VPC и subnet group 5. Создайте новую security group 6. Нажмите "Create"
Настройка безопасности
- Отредактируйте security group ElastiCache
- Добавьте 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-сертификата
- Перейдите в AWS Certificate Manager (ACM)
- Нажмите "Request Certificate"
- Введите домен: *.example.com
- Подтвердите через DNS или email
- Дождитесь выпуска сертификата
Настройка 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 развертывания
Для развертываний без простоя:
- Создайте новое окружение (клонируйте существующее)
- Разверните новую версию в новом окружении
- Тщательно протестируйте
- Поменяйте URL окружений в консоли EB
- Удалите старое окружение после проверки
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: приложение упало или не слушает на правильном порту
Ключевые выводы
- Используйте Docker: контейнеризуйте для консистентных развертываний
- Разделяйте ответственность: база данных и кэш — в управляемых сервисах
- Security groups имеют значение: настраивайте внимательно для взаимодействия сервисов
- Переменные окружения: никогда не хардкодьте учетные данные
- Активно мониторьте: настройте алерты CloudWatch с первого дня
- Планируйте масштабирование: настройте автомасштабирование до того, как оно понадобится
Elastic Beanstalk обеспечивает отличный баланс между абстракцией инфраструктуры и контролем, что делает его идеальным для команд, которым нужны управляемые развертывания без полной сложности Kubernetes.