العمل مع S3 والتخزين السحابي في C++ باستخدام AWS SDK للغة C++
\n\nفي تطوير التطبيقات الحديثة، أصبح التكامل مع التخزين السحابي أمرًا شائعًا بشكل متزايد. Amazon S3 (خدمة التخزين البسيطة) هو المعيار الفعلي لتخزين الكائنات في السحابة. بالنسبة للغة C++، الحل الأكثر قوة ودعمًا هو المكتبة الرسمية AWS SDK للغة C++ (aws-sdk-cpp). وهي توفر مجموعة كاملة من الأدوات للعمل ليس فقط مع S3، ولكن أيضًا مع MinIO و DigitalOcean Spaces و Yandex Object Storage وأي مخازن أخرى متوافقة مع S3.
\n\nالميزات والمزايا
\n- \n
- اكتمال API — تغطي المكتبة جميع عمليات S3: إنشاء/حذف الحاويات (Buckets)، رفع/تنزيل الكائنات، إدارة الإصدارات، الرفع متعدد الخيوط للملفات الكبيرة. \n
- التوافق عبر المنصات — تعمل على Linux و macOS و Windows، بالإضافة إلى المنصات المحمولة (iOS، Android). \n
- عدم التزامن — دعم مدمج لـ async/await عبر futures، مما يسمح بكتابة كود فعال غير محظور. \n
- التوافق مع بدائل S3 — يكفي تغيير endpoint وبيانات الاعتماد للتبديل من AWS S3 إلى MinIO أو Yandex Object Storage. \n
- دعم التدفقات — رفع/تنزيل البيانات مباشرة عبر
std::iostreamدون حفظ الملف بأكمله في الذاكرة. \n
التثبيت والتوصيل
\nيتم توزيع المكتبة عبر vcpkg أو Conan أو يتم بناؤها من المصدر. الطريقة الموصى بها هي عبر vcpkg:
\n# تثبيت vcpkg (إذا لم يكن مثبتًا بالفعل)\ngit clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh # أو bootstrap-vcpkg.bat لنظام Windows\n\n# تثبيت SDK لـ S3\n./vcpkg install aws-sdk-cpp[s3]\n\nفي CMakeLists.txt، يكفي إضافة:
\nfind_package(AWSSDK REQUIRED COMPONENTS s3)\ntarget_link_libraries(your_target PRIVATE ${AWSSDK_LINK_LIBRARIES})\n\nمثال أساسي: رفع كائن إلى S3
\nقبل البدء، يجب إعداد بيانات الاعتماد. الطريقة الأكثر أمانًا هي استخدام ملف ~/.aws/credentials أو متغيرات البيئة AWS_ACCESS_KEY_ID و AWS_SECRET_ACCESS_KEY.
#include <aws/core/Aws.h>\n#include <aws/s3/S3Client.h>\n#include <aws/s3/model/PutObjectRequest.h>\n#include <fstream>\n\nint main() {\n Aws::SDKOptions options;\n Aws::InitAPI(options);\n {\n Aws::S3::S3Client s3_client;\n\n const Aws::String bucket_name = "my-bucket";\n const Aws::String object_key = "example.txt";\n\n // إعداد الطلب\n Aws::S3::Model::PutObjectRequest request;\n request.SetBucket(bucket_name);\n request.SetKey(object_key);\n\n // قراءة الملف\n auto input_data = Aws::MakeShared<Aws::FStream>("tag",\n "local_file.txt", std::ios::in | std::ios::binary);\n request.SetBody(input_data);\n\n // تنفيذ الطلب\n auto outcome = s3_client.PutObject(request);\n if (outcome.IsSuccess()) {\n std::cout << "تم رفع الملف بنجاح!" << std::endl;\n } else {\n std::cerr << "خطأ: " << outcome.GetError().GetMessage() << std::endl;\n return 1;\n }\n }\n Aws::ShutdownAPI(options);\n return 0;\n}\n\nالعمل مع MinIO (مخزن S3 محلي)
\nللتطوير والاختبار، من المناسب استخدام MinIO. لجعل SDK يعمل مع MinIO، يجب تغيير endpoint وتعطيل التحقق من SSL (إذا لم يتم إعداد HTTPS):
\n#include <aws/core/Aws.h>\n#include <aws/s3/S3Client.h>\n\nint main() {\n Aws::SDKOptions options;\n Aws::InitAPI(options);\n {\n // إعداد العميل لـ MinIO\n Aws::Client::ClientConfigura