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.