Leitura e Escrita no S3 com Python

Toda aplicação AWS eventualmente precisa persistir arquivos: uploads de usuários, relatórios gerados, artefatos de Lambda, exportações de dados. O S3 é a resposta padrão, e o boto3 torna a leitura e escrita nele simples a partir do Python.

TL;DR: Leia e escreva arquivos no AWS S3 usando Python e boto3, incluindo upload, download e listagem de arquivos em massa.
Stack: Python, boto3, AWS S3
Nível: Iniciante
Tempo de leitura: ~5 min

Fazer upload de arquivo para o S3

import boto3
import json

s3 = boto3.client('s3',
    aws_access_key_id='SUA_ACCESS_KEY',
    aws_secret_access_key='SUA_SECRET_KEY'
)

def upload_para_s3(dados: dict, bucket: str, chave: str) -> bool:
    try:
        json_str = json.dumps(dados, indent=2)
        with open('/tmp/export.json', 'w') as f:
            f.write(json_str)
        s3.upload_file('/tmp/export.json', bucket, chave)
        print("Upload realizado com sucesso")
        return True
    except Exception as e:
        print(f"Upload falhou: {e}")
        return False

Baixar todos os arquivos de um bucket

import boto3

s3 = boto3.client('s3')
bucket_name = 'meu-bucket'

objetos = s3.list_objects(Bucket=bucket_name)['Contents']

for obj in objetos:
    nome_arquivo = obj['Key']
    try:
        s3.download_file(bucket_name, nome_arquivo, f'./arquivos/{nome_arquivo}')
        print(f"{nome_arquivo} baixado com sucesso.")
    except Exception as e:
        print(f"Erro ao baixar {nome_arquivo}: {e}")

O que você construiu

Código Python funcional para fazer upload de arquivos no S3 e baixar todos os arquivos de um bucket. O padrão de upload funciona para exportações de dados estruturados, e o loop de download é útil para pipelines de ingestão que buscam dados do S3 periodicamente.

Próximos passos

  • Use s3.put_object(Bucket=bucket, Key=chave, Body=dados_bytes) para uploads em memória sem escrever um arquivo temporário em disco primeiro.
  • Adicione notificações de evento no S3 para disparar uma função Lambda automaticamente quando um novo arquivo for enviado para um prefixo.
  • Use URLs pré-assinadas (s3.generate_presigned_url) para dar acesso temporário e com expiração a objetos S3 privados sem tornar o bucket público.

Dúvidas ou feedback? Me encontre no LinkedIn ou GitHub.

Deixe um comentário