boto3 — это официальный SDK от Amazon для работы с S3 на языке Python. С его помощью можно управлять объектами: загружать и скачивать файлы, получать списки объектов, работать с метаданными, выполнять мультипарт-загрузку и создавать подписанные URL.
Установка
Для установки boto3 используйте pip:
pip install boto3
После установки библиотека доступна для использования в Python-коде.
Настройка доступа
При использовании boto3 реквизиты доступа можно задать несколькими способами:
Через файлы ~/.aws/config и ~/.aws/credentials
При использовании AWS CLI в домашней директории пользователя автоматически создается папка .aws с файлами, содержащими данные для подключения к S3. При необходимости эту папку и файлы можно создать вручную — без использования AWS CLI. Файл ~/.aws/credentials должен содержать такие данные:
[default] aws_access_key_id = <ACCESS_KEY> aws_secret_access_key = <SECRET_KEY>
И ~/.aws/config:
[default] output = json endpoint_url = https://s3.twcstorage.ru region = ru-1
При использовании профиля default дополнительная настройка в коде не требуется — boto3 автоматически подхватит эти данные.
Через переменные окружения
Реквизиты доступа можно задать с помощью переменных окружения:
export AWS_ACCESS_KEY_ID=<ACCESS_KEY>
export AWS_SECRET_ACCESS_KEY=<SECRET_KEY>
Через код приложения
Реквизиты можно передать напрямую при создании клиента S3:
import boto3
s3 = boto3.client(
"s3",
aws_access_key_id="<ACCESS_KEY>",
aws_secret_access_key="<SECRET_KEY>",
endpoint_url="https://s3.twcstorage.ru",
region_name="ru-1"
)
Этот способ не рекомендуется для продакшена, так как ключи доступа хранятся непосредственно в коде.
Использование отдельных профилей
Если в файлах ~/.aws/config и ~/.aws/credentials настроено несколько профилей, можно явно указать нужный профиль при создании сессии:
import boto3
session = boto3.Session(profile_name="myprofile")
s3 = session.client("s3")
Это удобно, если один и тот же код используется для работы с несколькими бакетами или окружениями.
Пример
Рассмотрим, как при помощи SDK выполнять базовые операции с объектами. В этом примере скрипт:
- загружает файл в бакет;
- выводит список всех объектов;
- скачивает загруженный файл под другим именем;
- удаляет объект из хранилища.
Предварительно создайте файл с именем example.txt в той же директории, где находится скрипт.
Код скрипта:
import boto3
import os
bucket_name = "имя_бакета"
endpoint_url = "https://s3.twcstorage.ru"
local_upload_path = "example.txt"
s3_key = "example.txt"
local_download_path = "downloaded_example.txt"
# Создание клиента S3
s3 = boto3.client("s3", endpoint_url=endpoint_url)
# 1. Загрузка файла в бакет
if os.path.exists(local_upload_path):
print(f"Загрузка файла {local_upload_path} в бакет...")
s3.upload_file(local_upload_path, bucket_name, s3_key)
print("Загрузка завершена.")
else:
print(f"Файл {local_upload_path} не найден. Пропуск загрузки.")
# 2. Получение списка объектов в бакете
print("\nСодержимое бакета:")
paginator = s3.get_paginator("list_objects_v2")
for page in paginator.paginate(Bucket=bucket_name):
for obj in page.get("Contents", []):
print(f"- {obj['Key']}")
# 3. Скачивание файла из бакета
print(f"\nСкачивание {s3_key} в {local_download_path}...")
s3.download_file(bucket_name, s3_key, local_download_path)
print("Скачивание завершено.")
# 4. Удаление файла из бакета
print(f"\nУдаление {s3_key} из бакета...")
s3.delete_object(Bucket=bucket_name, Key=s3_key)
print("Удаление завершено.")
Дополнительные примеры использования SDK вы можете найти в нашем репозитории GitHub.