⚖️ Старый vs Новый: AWS CLI и Boto3

⚡ Ключевые изменения

  • AWS CLI v1 → v2: установка через pip заменена нативным установщиком
  • Хардкод ключей в коде → ~/.aws/credentials или IAM Role
  • boto (Python 2) → boto3 (Python 3, актуальный)
  • Root account для CLI → IAM User с минимальными правами

1. AWS CLI v1 vs v2

Старый способ (AWS CLI v1) — из лекции

# Установка через pip (устарело для v2)
pip install awscli

# Версия
aws --version
# aws-cli/1.x.x Python/...

Проблемы v1: медленнее, устаревшие зависимости Python, нет auto-prompt.

Современный способ (AWS CLI v2)

# Windows: скачать .msi установщик
# https://awscli.amazonaws.com/AWSCLIV2.msi

# macOS:
brew install awscli

# Linux:
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip && sudo ./aws/install

aws --version
# aws-cli/2.x.x Python/3.x.x ...

2. Хранение IAM Access Keys: небезопасно vs безопасно

Старый (плохой) способ — из лекции

# bad_credentials.py — так делать нельзя!
import boto3

s3 = boto3.client(
    's3',
    # Ключи прямо в коде — это катастрофа
    aws_access_key_id='AKIAIOSFODNN7EXAMPLE',
    aws_secret_access_key='wJalrXUtnFEMI/K7MDENG...',
    region_name='eu-central-1'
)

Риски: ключи попадут в git history, в логи, в публичный репозиторий → взлом аккаунта, счёт на тысячи долларов за майнинг криптовалюты на EC2.

Современный способ

# good_credentials.py — правильно
import boto3

# Boto3 автоматически читает ~/.aws/credentials
s3 = boto3.client('s3')

# Или через именованную сессию
session = boto3.Session(profile_name='dev')
s3 = session.client('s3')
# ~/.aws/credentials
[default]
aws_access_key_id = AKIA...
aws_secret_access_key = ...

Ключи никогда не попадают в код. В продакшене используйте IAM Role для EC2-инстанса — тогда ключи не нужны вообще.

Обязательно добавить в .gitignore:
# .gitignore
# AWS credentials — никогда не коммитить!
.aws/credentials
*.pem
*.key
.env

3. boto (Python 2) vs boto3 (Python 3)

Старый: boto (для Python 2)

# Устаревший boto — не использовать!
import boto

# API совершенно другой
s3 = boto.connect_s3()
bucket = s3.get_bucket('my-bucket')

# boto не поддерживается с 2016 года
# boto2 не поддерживает новые сервисы AWS

Современный: boto3 (Python 3)

# boto3 — официальный и актуальный SDK
import boto3

# Единый интерфейс для всех сервисов
s3 = boto3.client('s3')
ec2 = boto3.client('ec2')
rds = boto3.client('rds')

# Поддерживает все актуальные сервисы AWS
# Активно развивается и обновляется

4. Root account vs IAM User

Устаревшая практика

Использовать root account для повседневной работы и генерировать Access Keys от root account для CLI.

Риски: root account имеет полный доступ без ограничений — утечка ключей = потеря всего аккаунта.

Современная практика (best practice)

  1. Root account — только для первоначальной настройки, включить MFA
  2. Создать IAM User с минимально необходимыми правами
  3. Генерировать Access Keys только для IAM User, не для root
  4. Для EC2/Lambda — использовать IAM Role (без ключей вообще)

5. Формат вывода: text vs json

Из лекции (text формат)

# aws configure задаёт: output = text
aws s3 ls
# Вывод:
# 2024-01-15 12:00:00 my-bucket

Text формат читаем для людей, но сложно парсить в скриптах.

Рекомендуется: json + --query

# Рекомендуется: output = json
aws ec2 describe-instances --output json

# Ещё лучше: json + JMESPath query для фильтрации
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].[InstanceId,State.Name]' \
  --output table

JSON легко парсить в скриптах, --query позволяет выбирать нужные поля.

⚠️ Проверить по документации: возможности --query (JMESPath) в AWS CLI — актуальная документация: AWS CLI Filtering Output.