Arbeiten mit S3 und Cloud-Speichern in C++: Die Bibliothek aws-sdk-cpp

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Die Bibliothek aws-sdk-cpp: Integration von S3 und Cloud-Speichern in C++



Moderne C++-Anwendungen erfordern zunehmend die Interaktion mit Cloud-Speichern. Ob für Backups, die Speicherung von Mediendateien oder den Datenaustausch zwischen Diensten – S3-kompatible Speicher (Amazon S3, MinIO, Yandex Object Storage, DigitalOcean Spaces) sind zum De-facto-Standard geworden. Die offizielle Bibliothek aws-sdk-cpp von Amazon bietet ein leistungsstarkes und flexibles Toolkit für die Arbeit mit S3 direkt aus C++-Code.



In diesem Artikel werden wir uns ansehen, wie man aws-sdk-cpp einbindet, die Authentifizierung konfiguriert, grundlegende Operationen mit Objekten und Buckets durchführt und die Besonderheiten der Arbeit mit kompatiblen Speichern betrachtet.



Was ist aws-sdk-cpp?



aws-sdk-cpp ist das offizielle SDK von Amazon Web Services für die Sprache C++. Es enthält Module für alle wichtigen AWS-Dienste, darunter S3, DynamoDB, Lambda, EC2 und andere. Für die Arbeit mit Cloud-Speichern wird das Modul S3 verwendet, das Folgendes unterstützt:



  • Erstellen, Löschen und Auflisten von Buckets.
  • Hochladen, Herunterladen, Kopieren und Löschen von Objekten.
  • Arbeiten mit Multipart-Uploads für große Dateien.
  • Verwaltung von Metadaten und ACLs (Access Control Lists).
  • Unterstützung für Datenstreaming und asynchrone Operationen.


Installation und Einbindung



Der einfachste Weg, das SDK zu installieren, ist über den Paketmanager vcpkg:



vcpkg install aws-sdk-cpp[s3]


Für die manuelle Kompilierung aus dem Quellcode werden CMake und ein Compiler mit Unterstützung für C++14 oder neuer benötigt. Nach der Installation binden wir die Bibliothek in CMakeLists.txt ein:



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


Hinweis: s3-crt ist eine alternative Implementierung basierend auf der Common Runtime, die eine bessere Leistung für Streaming-Operationen bietet.



Konfiguration des S3-Clients



Vor Beginn der Arbeit muss ein Objekt Aws::S3::S3Client erstellt werden. Für den Zugriff auf kompatible Speicher (z. B. MinIO oder Yandex Object Storage) muss ein benutzerdefinierter Endpunkt angegeben werden:



#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"; // für Yandex Object Storage config.region = "ru-central1"; config.scheme = Aws::Http::Scheme::HTTPS;

// Für MinIO lokal: config.endpointOverride = "http://localhost:9000"; // config.region = "us-east-1"; // MinIO verwendet standardmäßig diese Region

Aws::Auth::AWSCredentials credentials("YOUR_ACCESS_KEY", "YOUR_SECRET_KEY"); Aws::S3::S3Client s3_client(credentials, config);

// Anschließend arbeiten wir mit dem Client}Aws::ShutdownAPI(options);


Beispiel: Hochladen einer Datei in S3



Betrachten wir eine grundlegende Operation – das Hochladen einer lokalen Datei in einen 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())\

Empfehlungen