Создание и удаление S3‑бакета с помощью Boto3 и Python

Кратко: в статье показано, как установить библиотеку Boto3 для Python, создать и удалить S3‑бакет через методы client.create_bucket и client.delete_bucket. Приведены готовые скрипты, рекомендации по безопасности и чеклисты для тестирования.
Что вы получите из этой статьи
- Быстрый пошаговый пример создания и удаления S3‑бакета через Boto3.
- Рабочие скрипты для создания и удаления бакета.
- Объяснение важных параметров create_bucket и возможных ошибок.
- Альтернативы, чеклист ролей, меры безопасности и критерии приёмки.
Предпосылки
- Аккаунт AWS (создайте, если его нет).
- Базовое понимание S3: объекты, бакеты, регионы.
- Базовые навыки Python.
- Установленный Python и pip на вашей машине.
План работы
- Установить Boto3.
- Ознакомиться с требуемыми методами (create_bucket, delete_bucket).
- Создать и удалить S3‑бакет с помощью Python‑скриптов.
Установка зависимостей Boto3
На Ubuntu Python обычно уже установлен. Проверить версию Python можно командами:
which python /usr/bin/python –version
или
python –version
Если pip отсутствует (Ubuntu), сначала обновите локальный репозиторий:
sudo apt update
Установите pip:
sudo apt install python-pip
Проверьте версию pip:
pip –version
После установки Python и pip установите Boto3:
pip install boto3

Проверить установленную библиотеку и её версию:
pip show boto3

Ознакомление с методами Boto3
Для создания бакета мы используем метод create_bucket клиента S3. Ниже — синтаксис метода с параметрами (полный список). Вы не обязаны передавать все параметры — достаточно минимального набора.
Request Syntax of create_bucket method
response = client.create_bucket(
ACL='private'|'public-read'|'public-read-write'|'authenticated-read',
Bucket='string',
CreateBucketConfiguration={
'LocationConstraint': 'EU'|'eu-west-1'|'us-west-1'|'us-west-2'|'ap-south-1'|'ap-southeast-1'|'ap-southeast-2'|'ap-northeast-1'|'sa-east-1'|'cn-north-1'|'eu-central-1'
},
GrantFullControl='string',
GrantRead='string',
GrantReadACP='string',
GrantWrite='string',
GrantWriteACP='string',
ObjectLockEnabledForBucket=True|False
)Краткие пояснения параметров:
- ACL: заранее определённый набор прав доступа (canned ACL). Обычно “private” по умолчанию.
- Bucket: имя бакета — обязательно уникально в глобальном масштабе.
- CreateBucketConfiguration / LocationConstraint: регион создания. По умолчанию (если не указан) используется us‑east‑1 (N. Virginia). Для других регионов обязательно указывать соответствующий LocationConstraint.
- GrantFullControl, GrantRead, GrantReadACP, GrantWrite, GrantWriteACP: дополнительные разрешения для грантов.
- ObjectLockEnabledForBucket: включение Object Lock (влияет на возможность удаления объектов).
Для удаления используется метод delete_bucket:
response = client.delete_bucket(
Bucket='string'
)Важно: delete_bucket удалит только пустой бакет. Если в бакете есть объекты (включая версионированные объекты), сначала нужно удалить объекты или очистить версии.
Пример: подготовка файла конфигурации
Создайте файл config.properties, в котором будут храниться ваши ключи доступа и регион. В примере используются простые переменные — не храните секреты в публичных репозиториях.
config.properties
aws_access_key_id_value='ACCESS-KEY-OF-THE-AWS-ACCOUNT'
aws_secret_access_key_value='SECRETE-KEY-OF-THE-AWS-ACCOUNT'
region_name_value='eu-west-3'
Важно: безопаснее использовать профили AWS CLI, переменные окружения или IAM‑роли для EC2/Lambda вместо явной записи ключей в файл.
Скрипт: создание S3‑бакета (create-s3-bucket.py)
Файл create-s3-bucket.py (ниже — исходный пример). Этот скрипт читает значения из config.properties и создаёт бакет с именем, указанным в параметре Bucket. Измените имя бакета на своё уникальное.
vim create-s3-bucket.py
import boto3
def getVarFromFile(filename):
import imp
f = open(filename)
global data
data = imp.load_source('data', '', f)
f.close()
getVarFromFile('config.properties')
client = boto3.client(
's3',
aws_access_key_id=data.aws_access_key_id_value,
aws_secret_access_key=data.aws_secret_access_key_value
)
response = client.create_bucket(
Bucket='rahul-boto3-test-delete',
CreateBucketConfiguration={
'LocationConstraint': 'eu-west-3',
},
)
print (response)
Примечания по коду:
- Параметр CreateBucketConfiguration с LocationConstraint обязателен для создания бакета вне региона us‑east‑1.
- Если вы используете профиль AWS CLI, предпочтительнее создать клиент через boto3.Session(profile_name=…) или полагаться на переменные окружения.
Альтернативный, более современный пример создания клиента с явным указанием региона:
import boto3
from botocore.exceptions import ClientError
session = boto3.Session(
aws_access_key_id=data.aws_access_key_id_value,
aws_secret_access_key=data.aws_secret_access_key_value,
region_name=data.region_name_value
)
client = session.client('s3')
try:
response = client.create_bucket(
Bucket='my-unique-bucket-name',
CreateBucketConfiguration={'LocationConstraint': data.region_name_value}
)
print('Bucket created:', response)
except ClientError as e:
print('Ошибка создания бакета:', e)Скрипт: удаление S3‑бакета (delete-s3-bucket.py)
Файл delete-s3-bucket.py — код для удаления бакета. Обратите внимание: бакет должен быть пустым.
vim delete-s3-bucket.py
def getVarFromFile(filename):
import imp
f = open(filename)
global data
data = imp.load_source('data', '', f)
f.close()
getVarFromFile('config.properties')
client = boto3.client(
's3',
aws_access_key_id=data.aws_access_key_id_value,
aws_secret_access_key=data.aws_secret_access_key_value
)
response = client.delete_bucket(Bucket='rahul-boto3-test-delete')
print (response)
Команды для запуска скриптов:
- Создать бакет:
python create-s3-bucket.py
- Удалить бакет:
python delete-s3-bucket.py
Важные примечания и распространённые ошибки
- Нельзя создать бакет с именем, уже используемым в глобальном масштабе. Вы получите ошибку BucketAlreadyExists.
- Удаление не сработает, если в бакете есть объекты или включена версионирование (требуется удаление всех версий).
- Если включён Object Lock, удаление объектов и бакета может быть заблокировано.
- При создании в регионе, отличном от us‑east‑1, укажите соответствующий LocationConstraint, иначе получите ошибку.
- Никогда не храните секретные ключи в публичных репозиториях. Предпочитайте IAM‑роли и переменные окружения.
Когда это не сработает (Counterexamples)
- Попытка удалить непустой бакет: вы получите 409 Conflict или AccessDenied. Необходимо сначала удалить объекты и версии.
- Неправильные политики IAM: если у пользователя нет прав s3:CreateBucket или s3:DeleteBucket — операции будут отклонены.
- Имя бакета конфликтует с политиками DNS или не соответствует правилам S3 (недопустимые символы, слишком короткое/длинное имя).
Альтернативные подходы
- AWS CLI: aws s3 mb s3://bucket-name и aws s3 rb s3://bucket-name –force. Удобно для одноразовых задач.
- Terraform / CloudFormation: объявьте ресурс aws_s3_bucket и управляйте инфраструктурой как кодом.
- AWS Console: визуальный способ создать бакет с подробными настройками (версионирование, шифрование, политики).
Модель мышления и эвристики при создании бакета
- Минимум прав: выдавайте IAM‑полномочия только тем сущностям, которые действительно должны управлять бакетом.
- Регион ближе к пользователям/ресурсам — ниже задержка и, возможно, стоимость.
- Версионирование ≠ резервное копирование: используйте версионирование для защиты от удаления/перезаписи, но применяйте жизненный цикл для управления запасами.
Контрольный список ролей (Role-based checklist)
- Разработчик:
- Проверил локальную установку Python/Boto3.
- Запустил скрипт создания в тестовом аккаунте.
- Администратор/DevOps:
- Настроил IAM‑политику с принципом Least Privilege.
- Настроил логирование доступа (S3 Server Access Logging, CloudTrail).
- Безопасность:
- Проверил включение шифрования на уровне бакета (SSE‑S3 или SSE‑KMS).
- Проверил отсутствие публичного доступа, если он не требуется.
Критерии приёмки
- Скрипт создаёт бакет с заданным именем в указанном регионе без ошибок.
- Бакет доступен для чтения/записи согласно заданным ACL/политикам.
- Скрипт корректно удаляет бакет, если в нём нет объектов.
- Журнал операций (CloudTrail) содержит записи о create_bucket/delete_bucket.
Безопасность и рекомендации по защите
- Используйте IAM‑роли для EC2/Lambda вместо встраивания ключей в код.
- Храните секреты в AWS Secrets Manager или Parameter Store.
- Включайте серверное шифрование (SSE) для критичных данных.
- Настройте блокировку публичного доступа на уровне аккаунта и бакета, если публичный доступ не нужен.
- Ограничьте доступ через политики бакета и VPC endpoint, если требуется.
Примеры тестов и сценарии приёма
- Позитивный тест: создать бакет с уникальным именем и проверить статус ответа API 200/200‑серии.
- Негативный тест: попробовать создать бакет с уже существующим именем — ожидается ошибка BucketAlreadyExists.
- Удаление непустого бакета: ожидается ошибка; затем очистка объектов и успешное удаление.
Мини‑методология для рабочей процедуры
- Настроить безопасный доступ (IAM/роли/profiles).
- Тестировать создание в dev/тест‑аккаунте.
- Внедрять через CI/CD или Infrastructure as Code.
- Проверять логи и оповещения.
Пример простого плейбука
- Шаг 1: Подготовить config.properties или профиль AWS.
- Шаг 2: Запустить create-s3-bucket.py.
- Шаг 3: Проверить бакет в консоли AWS и через aws s3 ls.
- Шаг 4: Если бакет больше не нужен — очистить и запустить delete-s3-bucket.py.
Mermaid: базовый поток операций
flowchart TD
A[Начало] --> B{Есть credentials?}
B -- Нет --> C[Настроить профиль или переменные окружения]
B -- Да --> D[Запустить скрипт создания]
D --> E{Создано успешно?}
E -- Да --> F[Проверить в консоли]
E -- Нет --> G[Просмотреть ошибку / IAM права]
F --> H[Использование бакета]
H --> I[Очистка и удаление]
I --> J[Запустить delete-s3-bucket.py]
J --> K[Конец]Часто задаваемые вопросы
Можно ли создать бакет без указания региона?
Да — по умолчанию бакеты создаются в регионе us‑east‑1. Но для других регионов обязательно указывать CreateBucketConfiguration с соответствующим LocationConstraint.
Что делать, если delete_bucket возвращает ошибку?
Проверьте, что бакет пустой: удалите все объекты и версии (если включено версионирование). Проверьте права IAM и Object Lock.
Безопасно ли хранить ключи в config.properties?
Нет. Это удобно для локальной разработки, но небезопасно для продакшена. Используйте IAM‑роли, переменные окружения, AWS Profiles или Secrets Manager.
Заключение
Мы показали базовый рабочий процесс создания и удаления S3‑бакета с помощью Boto3 для Python: от установки библиотеки до запуска готовых скриптов. Также рассмотрены распространённые ошибки, альтернативные подходы, рекомендации по безопасности и чеклисты для ролей.
Ключевые рекомендации:
- Проверяйте регион (LocationConstraint) при создании.
- Убедитесь, что бакет пуст перед удалением.
- Не храните секреты в репозиториях; используйте IAM‑роли или Secrets Manager.
Краткое резюме:
- Создание/удаление бакета — простая операция, но требует внимания к правам и регионам.
- Для продакшена используйте инфраструктуру как код и безопасные механизмы управления секретами.
1‑строчный глоссарий
- S3: объектное хранилище AWS.
- Бакет: пространство имён в S3 для хранения объектов.
- Boto3: официальная Python‑библиотека для работы с AWS.