Trabalhando com S3 e armazenamentos em nuvem em C++ com AWS SDK para C++
No desenvolvimento moderno de aplicações, a integração com armazenamentos em nuvem é cada vez mais necessária. O Amazon S3 (Simple Storage Service) é o padrão de facto para armazenamento de objetos na nuvem. Para a linguagem C++, a solução mais poderosa e suportada é a biblioteca oficial AWS SDK para C++ (aws-sdk-cpp). Ela fornece um conjunto completo de ferramentas para trabalhar não apenas com S3, mas também com MinIO, DigitalOcean Spaces, Yandex Object Storage e qualquer outro armazenamento compatível com S3.
Características e vantagens
- API completa — a biblioteca cobre todas as operações do S3: criação/exclusão de buckets, upload/download de objetos, gerenciamento de versões, upload multithread de arquivos grandes.
- Multiplataforma — funciona em Linux, macOS, Windows, bem como em plataformas móveis (iOS, Android).
- Assincronicidade — suporte nativo a async/await via futures, permitindo escrever código não bloqueante eficiente.
- Compatibilidade com alternativas ao S3 — basta alterar o endpoint e as credenciais para mudar do AWS S3 para MinIO ou Yandex Object Storage.
- Suporte a streams — upload/download de dados diretamente via
std::iostreamsem armazenar todo o arquivo na memória.
Instalação e configuração
A biblioteca é distribuída via vcpkg, Conan ou compilada a partir do código-fonte. A forma recomendada é através do vcpkg:
# Instalação do vcpkg (se ainda não estiver instalado)git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh # ou bootstrap-vcpkg.bat para Windows
# Instalação do SDK para S3./vcpkg install aws-sdk-cpp[s3]No CMakeLists.txt, basta adicionar:
find_package(AWSSDK REQUIRED COMPONENTS s3)target_link_libraries(seu_alvo PRIVATE ${AWSSDK_LINK_LIBRARIES})Exemplo básico: upload de objeto para S3
Antes de começar, é necessário configurar as credenciais. A forma mais segura é usar o arquivo ~/.aws/credentials ou as variáveis de ambiente AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY.
#include <aws/core/Aws.h>#include <aws/s3/S3Client.h>#include <aws/s3/model/PutObjectRequest.h>#include <fstream>
int main() { Aws::SDKOptions options; Aws::InitAPI(options); { Aws::S3::S3Client s3_client;
const Aws::String bucket_name = "my-bucket"; const Aws::String object_key = "example.txt";
// Preparação da requisição Aws::S3::Model::PutObjectRequest request; request.SetBucket(bucket_name); request.SetKey(object_key);
// Leitura do arquivo auto input_data = Aws::MakeShared<Aws::FStream>("tag", "local_file.txt", std::ios::in | std::ios::binary); request.SetBody(input_data);
// Execução da requisição auto outcome = s3_client.PutObject(request); if (outcome.IsSuccess()) { std::cout << "Arquivo enviado com sucesso!" << std::endl; } else { std::cerr << "Erro: " << outcome.GetError().GetMessage() << std::endl; return 1; } } Aws::ShutdownAPI(options); return 0;}Trabalhando com MinIO (armazenamento S3 local)
Para desenvolvimento e testes, é conveniente usar o MinIO. Para que o SDK funcione com o MinIO, é necessário alterar o endpoint e desabilitar a verificação SSL (se HTTPS não estiver configurado):
#include <aws/core/Aws.h>#include <aws/s3/S3Client.h>
int main() { Aws::SDKOptions options; Aws::InitAPI(options); { // Configuração do cliente para MinIO Aws::Client::ClientConfigura Também na biblioteca
Trabalho com XML em Swift: parsing, criação e processamento de dados (iOS/macOS)
Cliente Redis Swift: RediStack para iOS/macOS
Monitoramento Node.js: ferramentas e bibliotecas para rastrear desempenho
Cache em Node.js: Redis, Memcached e Node-Cache
NestJS para JavaScript (Node.js): guia completo com exemplos