العمل مع S3 والتخزين السحابي في C++: مكتبة AWS SDK للغة C++

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

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

ابدأ الدورة

العمل مع 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\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، يكفي إضافة:

\n
find_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.

\n
#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                    

توصيات