📖 Теория: AWS CLI и Boto3

⚡ Ключевые понятия

AWS CLI — утилита командной строки для управления всеми сервисами AWS. Boto3 — официальный Python SDK для AWS. Оба используют IAM Access Keys для аутентификации.

  • IAM Access Key ID — публичный идентификатор (начинается с AKIA...)
  • Secret Access Key — приватный ключ для подписи запросов; показывается только один раз
  • aws configure — команда настройки CLI; сохраняет ключи в ~/.aws/credentials
  • boto3.client() — низкоуровневый доступ к API (1:1 с HTTP-запросами)
  • boto3.resource() — высокоуровневый объектный интерфейс

Правило безопасности: ключи только в ~/.aws/credentials или переменных окружения, никогда в коде.

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 (передаётся через Advanced Details → 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
Логи User Data: просмотреть выполнение скрипта можно в /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:

  1. Перейти на официальную страницу AWS CLI
  2. Скачать установочный файл .msi для Windows
  3. Запустить установщик, следовать инструкциям
  4. Проверить установку в 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
Безопасность: Access Keys предоставляют полный доступ к аккаунту или его части в зависимости от IAM-политик. Никогда не коммитьте ключи в git, не передавайте в публичный чат и не хардкодьте в коде.

Настройка 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 formatjson (рекомендуется) или 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-ключи для обучения Ручная Бесплатно (базовый)
В учебном окружении: IAM-ключи для студентов выдаются через AWS Systems Manager Parameter Store. Находим параметр lab_student_key, копируем значение и вставляем при aws configure.
⚠️ Проверить по документации: текущие цены AWS Secrets Manager и Parameter Store могут изменяться. Актуальные тарифы: Secrets Manager Pricing, SSM Pricing.

Использование 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 ID 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 ищет учётные данные в следующем порядке приоритета:

  1. Явно переданные параметры в коде (не рекомендуется)
  2. Переменные окружения: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
  3. Файл ~/.aws/credentials (настраивается через aws configure)
  4. 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.