💻 Примеры: AWS CLI и Boto3

⚡ Ключевые примеры

  • AWS CLI: настройка профиля, запуск EC2, работа с S3
  • Boto3: создание бакета S3, загрузка файла, список инстансов EC2
  • Security: credentials в ~/.aws/credentials, никогда в коде

Пример 1: Настройка AWS CLI и проверка

Полный сценарий первой настройки AWS CLI на рабочей машине.

# Терминал — проверяем установку
aws --version
# aws-cli/2.x.x Python/3.x.x Windows/10 botocore/1.x.x

# Запускаем настройку
aws configure

Интерактивный ввод при aws configure:

# Терминал — интерактивный вывод aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: eu-central-1
Default output format [None]: json

Проверяем, что конфигурация сохранилась:

# Терминал
aws configure list

# Ожидаемый вывод:
#       Name                    Value             Type    Location
#       ----                    -----             ----    --------
#    profile                <not set>             None    None
# access_key     ****************XAMP shared-credentials-file
# secret_key     ****************EKEY shared-credentials-file
#     region             eu-central-1      config-file    ~/.aws/config

Первичная проверка доступа:

# Терминал
# Список S3 бакетов (OK если пустой список или ваши бакеты)
aws s3 ls

# Список EC2 инстансов (OK если JSON без ошибок Access Denied)
aws ec2 describe-instances --output table

Пример 2: Работа с S3 через AWS CLI

# Терминал — создать бакет
# Имя бакета должно быть глобально уникальным!
aws s3 mb s3://your-unique-bucket-name-2024 --region eu-central-1

# Загрузить файл
aws s3 cp README.md s3://your-unique-bucket-name-2024/

# Просмотреть содержимое бакета
aws s3 ls s3://your-unique-bucket-name-2024/

# Скачать файл
aws s3 cp s3://your-unique-bucket-name-2024/README.md ./downloaded_README.md

# Синхронизировать папку (загрузить только изменённые файлы)
aws s3 sync ./my-project s3://your-unique-bucket-name-2024/my-project/

# Удалить файл
aws s3 rm s3://your-unique-bucket-name-2024/README.md

# Удалить бакет (должен быть пустым)
aws s3 rb s3://your-unique-bucket-name-2024

Пример 3: Запуск EC2 через AWS CLI

Создаём файл с User Data скриптом и запускаем инстанс:

# user-data.sh — сохранить в текущей папке
#!/bin/bash
# Amazon Linux 2023: docker и плагин compose ставятся через dnf
dnf update -y
dnf install -y docker docker-compose-plugin git
systemctl start docker
systemctl enable docker
usermod -aG docker ec2-user
cd /opt/
git clone https://github.com/it-career-hub/example-voting-app.git
cd example-voting-app
# Compose v2 — подкоманда docker (без дефиса)
docker compose up -d
# Терминал — запуск инстанса
# Замените GROUP_NAME на вашу группу и имя
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
# Терминал — проверяем, что инстанс запущен
aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=voting_app_GROUP_NAME" \
  --query 'Reservations[*].Instances[*].[InstanceId,State.Name,PublicIpAddress]' \
  --output table

Пример 4: Boto3 — создание S3 бакета и загрузка файла

# s3_demo.py
import boto3

# Клиент использует ~/.aws/credentials автоматически
s3 = boto3.client('s3')

BUCKET_NAME = 'ich-student-aws-lab-test'
REGION = 'eu-central-1'

# --- Создать бакет ---
s3.create_bucket(
    Bucket=BUCKET_NAME,
    CreateBucketConfiguration={
        'LocationConstraint': REGION
    }
)
print(f'Бакет {BUCKET_NAME} создан')

# --- Список всех бакетов ---
response = s3.list_buckets()
print('Мои бакеты:')
for bucket in response['Buckets']:
    print(f'  {bucket["Name"]}')

# --- Загрузить файл ---
with open('test.txt', 'w') as f:
    f.write('Hello from boto3!')

s3.upload_file('test.txt', BUCKET_NAME, 'hello/test.txt')
print('Файл загружен')

# --- Список объектов в бакете ---
objects = s3.list_objects_v2(Bucket=BUCKET_NAME)
for obj in objects.get('Contents', []):
    print(f'  {obj["Key"]} ({obj["Size"]} bytes)')
# Терминал — запуск
python s3_demo.py

Пример 5: Boto3 — список EC2 инстансов

# ec2_list.py
import boto3

ec2 = boto3.client('ec2', region_name='eu-central-1')

# Получаем список всех инстансов
response = ec2.describe_instances()

print(f"{'ID':<22} {'Тип':<12} {'Состояние':<12} {'IP':<16} {'Имя'}")
print('-' * 80)

for reservation in response['Reservations']:
    for instance in reservation['Instances']:
        instance_id = instance['InstanceId']
        instance_type = instance['InstanceType']
        state = instance['State']['Name']
        public_ip = instance.get('PublicIpAddress', 'нет IP')

        # Извлекаем тег Name
        name = 'без имени'
        for tag in instance.get('Tags', []):
            if tag['Key'] == 'Name':
                name = tag['Value']
                break

        print(f'{instance_id:<22} {instance_type:<12} {state:<12} {public_ip:<16} {name}')
# Терминал — запуск
python ec2_list.py

Пример 6: Boto3 — именованный профиль и Session

# boto3_profiles.py
import boto3

# Вариант 1: профиль по умолчанию (default)
s3_default = boto3.client('s3')

# Вариант 2: именованный профиль через Session
session_dev = boto3.Session(profile_name='my-dev-account')
s3_dev = session_dev.client('s3')

# Вариант 3: явный регион без смены профиля
ec2_frankfurt = boto3.client('ec2', region_name='eu-central-1')
ec2_ireland = boto3.client('ec2', region_name='eu-west-1')

# Сравнить количество инстансов в разных регионах
for client, region_name in [(ec2_frankfurt, 'eu-central-1'), (ec2_ireland, 'eu-west-1')]:
    response = client.describe_instances()
    count = sum(len(r['Instances']) for r in response['Reservations'])
    print(f'{region_name}: {count} инстансов')
⚠️ Проверить по документации: порядок поиска credentials в Boto3 может измениться в будущих версиях. Актуальный порядок: boto3 Credentials Configuration.