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())\ También en la biblioteca
Geolocalización y mapas en Go (Golang): bibliotecas y ejemplos
Machine Learning en Go: revisión de bibliotecas para Golang
Trabajo con Markdown en C++: bibliotecas, analizadores y herramientas
Generador de códigos QR en Swift: biblioteca EFQRCode para iOS y macOS
Trabajo con CSV en PHP: lectura, escritura y procesamiento de datos