Python

Boto3 S3 на Python: базовые примеры

Boto3 позволяет работать с Amazon S3 из Python: загружать файлы, скачивать объекты, получать список ключей, удалять файлы и обрабатывать ошибки доступа. Для запуска нужны учетные данные AWS и права на нужный bucket

Не храните access key и secret key прямо в коде. Используйте переменные окружения, AWS CLI profile, IAM role или другой безопасный способ, который подходит вашему окружению

По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы

По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы

Установка

pip install boto3

Если вы работаете локально, чаще всего сначала настраивают AWS CLI:

aws configure

После этого boto3.client('s3') сможет взять credentials из стандартного окружения AWS

Создать S3 client

import boto3

s3 = boto3.client('s3')

Если нужен конкретный регион:

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

В большинстве примеров ниже используются переменные:

bucket = 'my-bucket'

Замените my-bucket на имя своего bucket

Загрузить файл в S3

import boto3

s3 = boto3.client('s3')

s3.upload_file(
    Filename='report.txt',
    Bucket='my-bucket',
    Key='reports/report.txt',
)

print('Файл загружен')

Filename — локальный файл на компьютере. Bucket — имя bucket. Key — путь объекта внутри S3

S3 не является обычной папкой на диске. reports/report.txt — это ключ объекта, который визуально выглядит как путь

Скачать файл из S3

import boto3

s3 = boto3.client('s3')

s3.download_file(
    Bucket='my-bucket',
    Key='reports/report.txt',
    Filename='downloaded-report.txt',
)

print('Файл скачан')

Если ключ не существует или у пользователя нет прав, boto3 выбросит ошибку

Получить список объектов

import boto3

s3 = boto3.client('s3')

response = s3.list_objects_v2(
    Bucket='my-bucket',
    Prefix='reports/',
)

for item in response.get('Contents', []):
    print(item['Key'], item['Size'])

response.get('Contents', []) нужен, потому что если объектов нет, поля Contents может не быть

Для bucket с большим количеством объектов понадобится пагинация. Но для первого примера list_objects_v2() достаточно

Прочитать объект как текст

Иногда файл не нужно сохранять на диск, достаточно прочитать содержимое

import boto3

s3 = boto3.client('s3')

response = s3.get_object(
    Bucket='my-bucket',
    Key='reports/report.txt',
)

text = response['Body'].read().decode('utf-8')

print(text)

Так удобно читать маленькие JSON, CSV или текстовые файлы. Для больших файлов лучше продумать потоковую обработку

Загрузить строку как объект

import boto3

s3 = boto3.client('s3')

s3.put_object(
    Bucket='my-bucket',
    Key='reports/status.txt',
    Body='готово'.encode('utf-8'),
    ContentType='text/plain; charset=utf-8',
)

print('Объект создан')

put_object() удобен, когда данные уже находятся в памяти и не нужно читать локальный файл

Удалить объект

import boto3

s3 = boto3.client('s3')

s3.delete_object(
    Bucket='my-bucket',
    Key='reports/status.txt',
)

print('Объект удален')

Будьте аккуратны с удалением. В учебных примерах используйте отдельный bucket или тестовый prefix

Обработка ошибок ClientError

import boto3
from botocore.exceptions import ClientError

s3 = boto3.client('s3')

try:
    s3.download_file(
        Bucket='my-bucket',
        Key='reports/missing.txt',
        Filename='missing.txt',
    )
except ClientError as error:
    code = error.response['Error']['Code']
    print(f'Ошибка S3: {code}')

Через ClientError можно поймать отсутствие прав, несуществующий объект, неправильный bucket и другие ответы AWS

Пагинация списка объектов

Если объектов много, одного list_objects_v2() может быть недостаточно. Тогда используйте paginator

import boto3

s3 = boto3.client('s3')
paginator = s3.get_paginator('list_objects_v2')

for page in paginator.paginate(Bucket='my-bucket', Prefix='reports/'):
    for item in page.get('Contents', []):
        print(item['Key'])

Paginator сам делает несколько запросов и возвращает страницы результата. Это важнее для production-скриптов, где в bucket могут быть сотни или тысячи объектов

Мини-функции для повторного использования

Даже в маленьком скрипте полезно вынести операции в функции

import boto3

s3 = boto3.client('s3')

def upload_report(local_path, bucket, key):
    s3.upload_file(local_path, bucket, key)
    return key

def list_keys(bucket, prefix=''):
    response = s3.list_objects_v2(Bucket=bucket, Prefix=prefix)
    return [item['Key'] for item in response.get('Contents', [])]

Так код легче тестировать и менять. Например, можно заменить bucket, prefix или добавить логирование в одном месте

Частые ошибки

Хранить ключи доступа в коде

Путать имя bucket и key объекта

Не проверять IAM-права

Ожидать поле Contents в пустом ответе list_objects_v2()

Не учитывать регион bucket

Удалять объекты без тестового prefix

Практические задачи

Загрузите локальный report.txt в prefix reports/

Выведите список объектов с размером

Скачайте объект в новый локальный файл

Прочитайте маленький текстовый объект через get_object()

Добавьте обработку ClientError

Удалите тестовый объект после проверки

Базовая работа с S3 через boto3 строится вокруг boto3.client('s3') и методов upload_file(), download_file(), list_objects_v2(), get_object(), put_object() и delete_object()

Главное — не хранить секреты в коде, правильно различать bucket и key, проверять права IAM и обрабатывать ошибки AWS через ClientError

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x