EC2 + Docker: практический разбор
Цель первой части занятия — создать EC2-инстанс с автоматической установкой Docker, Git и запуском Docker Compose приложения при старте сервера.
Выбор параметров EC2
- Регион: eu-central-1 (Франкфурт)
- AMI: Amazon Linux 2023 (Docker ставится через
dnf install -y docker docker-compose-plugin) - Instance type: t2.micro — бесплатный уровень, 750 часов в месяц
- VPC и subnet: убедиться, что subnet публичная (есть Internet Gateway в Route Table)
- Auto-assign Public IP: включить — иначе нет доступа снаружи
Security Groups
Security Group — виртуальный файрвол для EC2-инстанса. Правила типа "Source type":
- Anywhere (0.0.0.0/0) — доступ с любого адреса (небезопасно для SSH)
- My IP — автоматически подставляет ваш текущий IP-адрес
- Custom — указать конкретный IP или CIDR-диапазон
Для веб-приложения открываем порты: 22 (SSH), 5000 и 5001 (приложение для голосования), 80/443 (HTTP/HTTPS для продакшена).
User Data скрипт
User Data — скрипт, который выполняется при первом запуске инстанса. Позволяет полностью автоматизировать настройку сервера.
# user-data.sh
#!/bin/bash
# Обновляем пакеты без подтверждения
dnf update -y
# Amazon Linux 2023: Docker и плагин Compose ставятся напрямую через dnf
# (amazon-linux-extras существовал только в Amazon Linux 2)
dnf install -y docker docker-compose-plugin git
# Запускаем службу Docker и добавляем в автозапуск
systemctl start docker
systemctl enable docker
# Добавляем пользователя ec2-user в группу docker (без sudo)
usermod -aG docker ec2-user
# Клонируем проект и запускаем через Docker Compose v2
cd /opt/
git clone https://github.com/it-career-hub/example-voting-app.git
cd example-voting-app
docker compose up -d
/var/log/cloud-init.log и /var/log/cloud-init-output.log
Подключение к серверу
# Терминал (PowerShell или bash)
# ~/.ssh/id_rsa — путь к вашему приватному SSH-ключу
# IP-адрес смотрим в консоли EC2
ssh -i ~/.ssh/id_rsa ec2-user@<PUBLIC_IP>
AWS CLI — интерфейс командной строки
AWS CLI (Command Line Interface) — официальный инструмент для взаимодействия с сервисами Amazon Web Services через терминал.
Преимущества AWS CLI
- Автоматизация рутинных операций: создание, удаление, управление ресурсами
- Поддержка всех сервисов AWS — всё, что можно сделать в консоли, доступно в CLI
- Работает быстрее графического интерфейса
- Кросс-платформенный: Linux, macOS, Windows
- Поддержка нескольких профилей — легко переключаться между аккаунтами
Установка AWS CLI v2
Windows:
- Перейти на официальную страницу AWS CLI
- Скачать установочный файл
.msiдля Windows - Запустить установщик, следовать инструкциям
- Проверить установку в PowerShell:
# PowerShell / Терминал
aws --version
# Ожидаемый вывод: aws-cli/2.x.x Python/3.x.x Windows/10 ...
macOS (через Homebrew):
# Терминал macOS
# Установка Homebrew (если не установлен):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Установка AWS CLI:
brew install awscli
# Проверка:
aws --version
Linux:
# Терминал Linux
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
IAM Access Keys
IAM Access Keys — уникальные идентификаторы для программного доступа к сервисам AWS. Состоят из двух частей:
| Компонент | Описание | Пример |
|---|---|---|
| Access Key ID | Публичная часть — идентифицирует пользователя или сервис | AKIAIOSFODNN7EXAMPLE |
| Secret Access Key | Приватная часть — подписывает запросы; показывается только при создании | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
Настройка AWS CLI (aws configure)
Команда aws configure запускает интерактивный мастер настройки и сохраняет конфигурацию в двух файлах:
# Терминал
aws configure
Ввести последовательно:
- AWS Access Key ID — из IAM консоли или Parameter Store
- AWS Secret Access Key — секретный ключ (только один раз)
- Default region name — например,
eu-central-1 - Default output format —
json(рекомендуется) илиtext
Конфигурация сохраняется в файлы:
# ~/.aws/credentials
[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# ~/.aws/config
[default]
region = eu-central-1
output = json
Именованные профили (best practice)
При работе с несколькими аккаунтами или ролями создавайте именованные профили:
# Терминал
aws configure --profile my-dev-account
# ~/.aws/credentials
[default]
aws_access_key_id = AKIA...
aws_secret_access_key = ...
[my-dev-account]
aws_access_key_id = AKIA...OTHER...
aws_secret_access_key = ...OTHER...
# Использование конкретного профиля
aws s3 ls --profile my-dev-account
Где хранить секреты в AWS
AWS предоставляет два основных сервиса для хранения секретов и параметров:
| Сервис | Для чего | Ротация | Стоимость |
|---|---|---|---|
| AWS Secrets Manager | Пароли БД, API-ключи, сертификаты | Автоматическая ротация | Платный |
| Parameter Store (SSM) | Конфигурации, переменные окружения, IAM-ключи для обучения | Ручная | Бесплатно (базовый) |
lab_student_key, копируем значение и вставляем при aws configure.
Использование AWS CLI
Проверка подключения
# Терминал
# Список S3 бакетов (должен вернуть список или пустой вывод без ошибок)
aws s3 ls
# Список EC2 инстансов в регионе по умолчанию
aws ec2 describe-instances
Запуск EC2-инстанса через CLI
Пример запуска инстанса с User Data скриптом (все параметры в одной команде):
# Терминал
aws ec2 run-instances \
--image-id ami-0de02246788e4a354 \
--count 1 \
--instance-type t2.micro \
--key-name ich \
--associate-public-ip-address \
--security-group-ids sg-07a67fb5015140a49 \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=voting_app_GROUP_NAME}]' \
--region eu-central-1 \
--user-data file://user-data.sh
Разбор параметров:
| Параметр | Значение |
|---|---|
--image-id |
ID AMI (Amazon Machine Image) — базовый образ ОС |
--count 1 |
Количество запускаемых инстансов |
--instance-type t2.micro |
Тип инстанса (1 vCPU, 1 GB RAM, Free Tier) |
--key-name |
Имя Key Pair для SSH-доступа |
--associate-public-ip-address |
Автоматически назначить публичный IP |
--security-group-ids |
ID Security Group для управления трафиком |
--tag-specifications |
Теги для идентификации ресурса |
--region |
Регион AWS (eu-central-1 = Франкфурт) |
--user-data file:// |
Путь к файлу с User Data скриптом |
ami-0de02246788e4a354 специфичен для конкретного региона и учебного окружения. В вашем регионе AMI ID будет другим. Найдите актуальный AMI для Amazon Linux 2023 в вашем регионе через консоль EC2.
Boto3 — Python SDK для AWS
Boto3 — официальная библиотека Python для взаимодействия с Amazon Web Services. Позволяет интегрировать AWS-сервисы прямо в Python-код.
Основные функции Boto3
- Управление ресурсами: создание, изменение, удаление EC2, S3, RDS и других
- Автоматизация: резервное копирование, деплой, масштабирование
- Поддержка всех сервисов AWS: универсальный инструмент для облачной разработки
- Работа с API: прямой доступ к низкоуровневым HTTP-запросам AWS
Установка
# Терминал (PowerShell или bash)
# Создание виртуального окружения (рекомендуется)
python -m venv myenv
# Активация (Windows PowerShell):
.\myenv\Scripts\Activate.ps1
# Активация (macOS/Linux):
source myenv/bin/activate
# Установка boto3
pip install boto3
client vs resource
Boto3 предоставляет два способа взаимодействия с AWS:
| Тип | Описание | Когда использовать |
|---|---|---|
| boto3.client() | Низкоуровневый доступ, 1:1 с AWS API. Возвращает словари Python. | Полный контроль над запросами, сложные операции |
| boto3.resource() | Высокоуровневый объектный интерфейс. Работает с объектами Python. | Удобная работа с ресурсами, простые CRUD-операции |
Аутентификация Boto3
Boto3 ищет учётные данные в следующем порядке приоритета:
- Явно переданные параметры в коде (не рекомендуется)
- Переменные окружения:
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY - Файл
~/.aws/credentials(настраивается черезaws configure) - IAM Role, назначенная EC2-инстансу (лучший вариант для production)
# s3_bad_example.py — ПЛОХО, так делать нельзя
import boto3
s3 = boto3.client(
's3',
aws_access_key_id='AKIAIOSFODNN7EXAMPLE', # хардкод — опасно!
aws_secret_access_key='wJalrXUtnFEMI...' # хардкод — опасно!
)
Ключи могут попасть в git history, в публичный репозиторий или в логи.
aws configure один раз, и Boto3 автоматически возьмёт ключи из ~/.aws/credentials:
# s3_good_example.py — правильно
import boto3
# Boto3 сам читает ~/.aws/credentials
s3 = boto3.client('s3')
Пример: работа с S3
# s3_demo.py
import boto3
# Создание клиента S3 — регион берётся из ~/.aws/config
s3 = boto3.client('s3')
# Создание S3 бакета (имя должно быть глобально уникальным!)
s3.create_bucket(
Bucket='my-unique-bucket-name-2024',
CreateBucketConfiguration={
'LocationConstraint': 'eu-central-1'
}
)
# Получение списка всех бакетов в аккаунте
response = s3.list_buckets()
for bucket in response['Buckets']:
print(bucket['Name'])
us-east-1 параметр CreateBucketConfiguration НЕ указывается — это специфика AWS API. Для всех других регионов — обязателен. Актуальный пример: boto3 S3 create_bucket.