Trabalhando com S3 e armazenamentos em nuvem em C++: biblioteca aws-sdk-cpp

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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())\

Recommendations