العمل مع S3 والتخزين السحابي في C++: مكتبة aws-sdk-cpp

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مكتبة aws-sdk-cpp: دمج S3 والتخزين السحابي في C++



تتطلب تطبيقات C++ الحديثة بشكل متزايد التفاعل مع التخزين السحابي. سواء كان ذلك للنسخ الاحتياطي، أو تخزين ملفات الوسائط، أو تبادل البيانات بين الخدمات — أصبحت التخزينات المتوافقة مع S3 (Amazon S3، MinIO، Yandex Object Storage، DigitalOcean Spaces) المعيار الفعلي. توفر المكتبة الرسمية aws-sdk-cpp من Amazon مجموعة أدوات قوية ومرنة للعمل مع S3 مباشرة من كود C++.



في هذه المقالة، سنشرح كيفية توصيل aws-sdk-cpp، وإعداد المصادقة، وتنفيذ العمليات الأساسية مع الكائنات والحاويات (buckets)، بالإضافة إلى مناقشة ميزات العمل مع التخزينات المتوافقة.



ما هو aws-sdk-cpp؟



aws-sdk-cpp هو SDK رسمي من Amazon Web Services للغة C++. يتضمن وحدات لجميع خدمات AWS الرئيسية، بما في ذلك S3 وDynamoDB وLambda وEC2 وغيرها. للعمل مع التخزين السحابي، يتم استخدام وحدة S3 التي تدعم:



  • إنشاء وحذف وسرد الحاويات (buckets).
  • تحميل وتنزيل ونسخ وحذف الكائنات.
  • العمل مع التحميل متعدد الأجزاء (multipart upload) للملفات الكبيرة.
  • إدارة البيانات الوصفية وقوائم التحكم في الوصول (ACL).
  • دعم نقل البيانات المتدفق والعمليات غير المتزامنة.


التثبيت والتوصيل



أسهل طريقة لتثبيت SDK هي من خلال مدير الحزم vcpkg:



vcpkg install aws-sdk-cpp[s3]


للتجميع اليدوي من المصدر، ستحتاج إلى CMake ومترجم يدعم C++14 أو أحدث. بعد التثبيت، قم بتوصيل المكتبة في CMakeLists.txt:



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)


لاحظ: s3-crt هو تنفيذ بديل يعتمد على Common Runtime، والذي يوفر أداءً أفضل لعمليات التدفق.



إعداد عميل S3



قبل البدء، يجب إنشاء كائن Aws::S3::S3Client. للوصول إلى التخزينات المتوافقة (مثل MinIO أو Yandex Object Storage)، تحتاج إلى تحديد نقطة نهاية مخصصة:



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

// لـ MinIO محلياً: config.endpointOverride = "http://localhost:9000"; // config.region = "us-east-1"; // MinIO يستخدم هذه المنطقة افتراضياً

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

// ثم العمل مع العميل}Aws::ShutdownAPI(options);


مثال: تحميل ملف إلى S3



لننظر إلى عملية أساسية — تحميل ملف محلي إلى حاوية (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())\

توصيات