Trabajo con S3 y almacenamiento en la nube en C++: biblioteca aws-sdk-cpp

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Biblioteca aws-sdk-cpp: integración de S3 y almacenamiento en la nube en C++



Las aplicaciones modernas en C++ requieren cada vez más interacción con almacenamiento en la nube. Ya sea para copias de seguridad, almacenamiento de archivos multimedia o intercambio de datos entre servicios, los almacenamientos compatibles con S3 (Amazon S3, MinIO, Yandex Object Storage, DigitalOcean Spaces) se han convertido en el estándar de facto. La biblioteca oficial aws-sdk-cpp de Amazon proporciona un conjunto de herramientas potente y flexible para trabajar con S3 directamente desde código C++.



En este artículo, veremos cómo conectar aws-sdk-cpp, configurar la autenticación, realizar operaciones básicas con objetos y buckets, y también analizaremos las particularidades de trabajar con almacenamientos compatibles.



¿Qué es aws-sdk-cpp?



aws-sdk-cpp es el SDK oficial de Amazon Web Services para el lenguaje C++. Incluye módulos para todos los servicios principales de AWS, incluyendo S3, DynamoDB, Lambda, EC2 y otros. Para trabajar con almacenamiento en la nube se utiliza el módulo S3, que soporta:



  • Creación, eliminación y listado de buckets.
  • Subida, descarga, copia y eliminación de objetos.
  • Trabajo con carga multiparte (multipart upload) para archivos grandes.
  • Gestión de metadatos y ACL (Listas de Control de Acceso).
  • Soporte para transmisión de datos y operaciones asíncronas.


Instalación y configuración



La forma más sencilla de instalar el SDK es a través del gestor de paquetes vcpkg:



vcpkg install aws-sdk-cpp[s3]


Para la compilación manual desde el código fuente, se necesita CMake y un compilador compatible con C++14 o superior. Después de la instalación, se enlaza la biblioteca en CMakeLists.txt:



find_package(aws-sdk-cpp REQUIRED COMPONENTS s3 s3-crt)target_link_libraries(tu_proyecto PRIVATE AWS::aws-cpp-sdk-s3 AWS::aws-cpp-sdk-s3-crt)


Tenga en cuenta: s3-crt es una implementación alternativa basada en Common Runtime, que ofrece un mejor rendimiento para operaciones de transmisión.



Configuración del cliente S3



Antes de comenzar, es necesario crear un objeto Aws::S3::S3Client. Para acceder a almacenamientos compatibles (por ejemplo, MinIO o Yandex Object Storage), se debe especificar un 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ón por defecto

Aws::Auth::AWSCredentials credentials("TU_CLAVE_ACCESO", "TU_CLAVE_SECRETA"); Aws::S3::S3Client s3_client(credentials, config);

// Luego se trabaja con el cliente}Aws::ShutdownAPI(options);


Ejemplo: subir un archivo a S3



Veamos la operación básica: subir un archivo local a un bucket:



#include <aws/s3/model/PutObjectRequest.h>#include <fstream>

bool SubirArchivo(const Aws::S3::S3Client& client, const std::string& nombre_bucket, const std::string& clave_objeto, const std::string& ruta_archivo){ Aws::S3::Model::PutObjectRequest request; request.SetBucket(nombre_bucket); request.SetKey(clave_objeto);

std::shared_ptr<Aws::IOStream> datos_entrada = Aws::MakeShared<Aws::FStream>("SubirArchivo", ruta_archivo.c_str(), std::ios_base::in | std::ios_base::binary);

if (!datos_entrada->good())\

Recommendations