مكتبة 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())\