Biblioteca aws-sdk-cpp: integração S3 e armazenamentos em nuvem em C++
Aplicações C++ modernas cada vez mais exigem interação com armazenamentos em nuvem. Seja para backup, armazenamento de arquivos de mídia ou troca de dados entre serviços — armazenamentos compatíveis com S3 (Amazon S3, MinIO, Yandex Object Storage, DigitalOcean Spaces) tornaram-se o padrão de facto. A biblioteca oficial aws-sdk-cpp da Amazon fornece um conjunto de ferramentas poderoso e flexível para trabalhar com S3 diretamente do código C++.
Neste artigo, vamos abordar como conectar o aws-sdk-cpp, configurar a autenticação, realizar operações básicas com objetos e buckets, além de considerar as particularidades do trabalho com armazenamentos compatíveis.
O que é aws-sdk-cpp?
aws-sdk-cpp é o SDK oficial da Amazon Web Services para a linguagem C++. Ele inclui módulos para todos os principais serviços da AWS, incluindo S3, DynamoDB, Lambda, EC2 e outros. Para trabalhar com armazenamentos em nuvem, é utilizado o módulo S3, que suporta:
- Criação, exclusão e listagem de buckets.
- Upload, download, cópia e exclusão de objetos.
- Trabalho com upload de múltiplas partes (multipart upload) para arquivos grandes.
- Gerenciamento de metadados e ACL (Access Control Lists).
- Suporte para transmissão de dados e operações assíncronas.
Instalação e configuração
A maneira mais simples de instalar o SDK é através do gerenciador de pacotes vcpkg:
vcpkg install aws-sdk-cpp[s3]Para compilação manual a partir do código-fonte, são necessários CMake e um compilador com suporte a C++14 ou superior. Após a instalação, conecte a biblioteca no CMakeLists.txt:
find_package(aws-sdk-cpp REQUIRED COMPONENTS s3 s3-crt)target_link_libraries(seu_projeto PRIVATE AWS::aws-cpp-sdk-s3 AWS::aws-cpp-sdk-s3-crt)Observe: s3-crt é uma implementação alternativa baseada no Common Runtime, que oferece melhor desempenho para operações de streaming.
Configuração do cliente S3
Antes de começar, é necessário criar um objeto Aws::S3::S3Client. Para acessar armazenamentos compatíveis (por exemplo, MinIO ou Yandex Object Storage), é preciso especificar um endpoint personalizado:
#include <aws/core/Aws.h>#include <aws/s3/S3Client.h>#include <aws/s3/model/ListObjectsV2Request.h>
Aws::SDKOptions options;Aws::InitAPI(options);{ Aws::Client::ClientConfiguration config; config.endpointOverride = "https://storage.yandexcloud.net"; // para Yandex Object Storage config.region = "ru-central1"; config.scheme = Aws::Http::Scheme::HTTPS;
// Para MinIO local: config.endpointOverride = "http://localhost:9000"; // config.region = "us-east-1"; // MinIO usa esta região por padrão
Aws::Auth::AWSCredentials credentials("YOUR_ACCESS_KEY", "YOUR_SECRET_KEY"); Aws::S3::S3Client s3_client(credentials, config);
// Em seguida, trabalhe com o cliente}Aws::ShutdownAPI(options);Exemplo: upload de arquivo para S3
Vamos considerar a operação básica — upload de um arquivo local para um bucket:
#include <aws/s3/model/PutObjectRequest.h>#include <fstream>
bool UploadFile(const Aws::S3::S3Client& client, const std::string& bucket_name, const std::string& object_key, const std::string& file_path){ Aws::S3::Model::PutObjectRequest request; request.SetBucket(bucket_name); request.SetKey(object_key);
std::shared_ptr<Aws::IOStream> input_data = Aws::MakeShared<Aws::FStream>("UploadFile", file_path.c_str(), std::ios_base::in | std::ios_base::binary);
if (!input_data->good())\