Projeto backend desenvolvido para implementar upload de arquivos para a Amazon S3, utilizando Spring Boot, configuração de IAM, políticas de bucket e CORS, seguindo boas práticas de segurança e organização de credenciais. Este projeto demonstra a integração entre uma API REST e a infraestrutura AWS para armazenamento escalável de arquivos.
Em aplicações modernas, é comum a necessidade de armazenar arquivos como:
- Imagens de produtos
- Fotos de usuários
- Documentos
- Arquivos estáticos
Em vez de armazenar esses arquivos localmente no servidor, utilizamos o Amazon S3 (Simple Storage Service), que oferece:
- Alta disponibilidade
- Escalabilidade automática
- Segurança configurável
- Acesso público ou privado controlado
Este projeto implementa essa integração utilizando Spring Boot e AWS.
O objetivo principal deste projeto foi:
- Implementar upload de arquivos para AWS S3
- Configurar corretamente permissões via IAM
- Aplicar política de bucket para acesso público controlado
- Configurar CORS para acesso via navegador
- Utilizar variáveis de ambiente para proteger credenciais
- Aplicar boas práticas de segurança e organização
Para permitir acesso público apenas de leitura aos arquivos armazenados, foi configurada a seguinte política no bucket:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bds-dscatalog1/*"
}
]
}Essa política permite que qualquer usuário acesse os arquivos via URL pública, mas não permite upload ou exclusão.
Para permitir requisições via navegador, foi configurado o seguinte CORS no bucket:
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET", "HEAD"],
"AllowedOrigins": ["*"],
"ExposeHeaders": [],
"MaxAgeSeconds": 3000
}
]Isso permite requisições GET e HEAD de qualquer origem.
Foi criado um usuário IAM específico para a aplicação, com:
- Permissão de acesso ao Amazon S3
- Access Key ID
- Secret Access Key
As credenciais não ficam expostas no código-fonte. São injetadas via variáveis de ambiente.
aws.access_key_id=${AWS_KEY:empty}
aws.secret_access_key=${AWS_SECRET:empty}
s3.bucket=${DSCATALOG_BUCKET_NAME:empty}
s3.region=${DSCATALOG_BUCKET_REGION:sa-east-1}
spring.servlet.multipart.max-file-size=${MAX_FILE_SIZE:10MB}
spring.servlet.multipart.max-request-size=${MAX_FILE_SIZE:10MB}| Variável | Descrição |
|---|---|
AWS_KEY |
Access Key do IAM |
AWS_SECRET |
Secret Key do IAM |
DSCATALOG_BUCKET_NAME |
Nome do bucket |
DSCATALOG_BUCKET_REGION |
Região do bucket |
MAX_FILE_SIZE |
Tamanho máximo permitido para upload |
- Cliente envia arquivo para a API
- Spring Boot recebe a requisição
- Arquivo é enviado para o Amazon S3
- A URL pública do arquivo é retornada
- Uso de variáveis de ambiente
- Separação de credenciais do código
- Política de bucket controlada
- Configuração correta de CORS
- Limitação de tamanho de upload
- Integração limpa entre backend e infraestrutura cloud
- Java 17
- Spring Boot
- Spring Web
- Spring Data JPA
- Hibernate
- Spring Validation
- Spring Security
- Spring Security OAuth2
- Spring Boot Test
- AWS SDK for Java (S3)
- Amazon S3
- IAM
- H2 Database
- PostgreSQL
- Commons IO
- Spring Cloud (Hoxton.SR8)
- Maven
- Upload privado com Pre-Signed URL
- Exclusão de arquivos no S3
- Versionamento de objetos
- Deploy completo na AWS (EC2 ou Elastic Beanstalk)
- Integração com CloudFront
Albert Silva de Jesus
Desenvolvedor Backend Java | Spring Boot