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

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

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

ابدأ الدورة

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

\n\n

أصبحت مخازن الكائنات السحابية، مثل Amazon S3، المعيار لتخزين وتسليم الملفات والنسخ الاحتياطية ومحتوى الوسائط. تقدم Rust، كلغة برمجة نظامية، أدوات قوية وآمنة للتكامل مع هذه الخدمات. المكتبة الرئيسية هي aws-sdk-s3 — SDK الرسمي من Amazon لـ Rust.

\n\n

في هذه المقالة، سنشرح كيفية إعداد المشروع، وتنفيذ العمليات الأساسية (الرفع، التنزيل، الحذف)، والعمل مع مخازن متوافقة مع S3 (مثل MinIO أو Yandex Object Storage).

\n\n

التثبيت والإعداد

\n\n

أضف إلى Cargo.toml:

\n\n
[dependencies]\naws-sdk-s3 = "1.0"\naws-config = "1.0"\ntokio = { version = "1", features = ["full"] }\n
\n\n

للمصادقة، يتم استخدام متغيرات البيئة أو ملف ~/.aws/credentials:

\n\n
export AWS_ACCESS_KEY_ID="your_access_key"\nexport AWS_SECRET_ACCESS_KEY="your_secret_key"\nexport AWS_DEFAULT_REGION="us-east-1"\n
\n\n

تهيئة العميل

\n\n

لنقم بإنشاء عميل S3 غير متزامن:

\n\n
use aws_sdk_s3::Client;\nuse aws_config::load_defaults;\nuse aws_config::BehaviorVersion;\n\n#[tokio::main]\nasync fn main() {\n    let config = load_defaults(BehaviorVersion::latest()).await;\n    let client = Client::new(&config);\n    // الآن العميل جاهز للعمل\n}\n
\n\n

رفع ملف إلى S3 (Upload)

\n\n

لرفع البيانات، يتم استخدام طريقة put_object. يمكن تمرير البيانات كبايتات أو من تيار:

\n\n
use aws_sdk_s3::primitives::ByteStream;\nuse std::path::Path;\n\nasync fn upload_file(client: &Client, bucket: &str, key: &str, file_path: &str) -> Result<(), Box<dyn std::error::Error>> {\n    let body = ByteStream::from_path(Path::new(file_path)).await?;\n    \n    client\n        .put_object()\n        .bucket(bucket)\n        .key(key)\n        .body(body)\n        .send()\n        .await?;\n    \n    println!("تم رفع الملف {} إلى {}/{}", file_path, bucket, key);\n    Ok(())\n}\n
\n\n

تنزيل ملف (Get Object)

\n\n

لجلب كائن وحفظه محلياً:

\n\n
use tokio::io::AsyncWriteExt;\n\nasync fn download_file(client: &Client, bucket: &str, key: &str, dest_path: &str) -> Result<(), Box<dyn std::error::Error>> {\n    let response = client\n        .get_object()\n        .bucket(bucket)\n        .key(key)\n        .send()\n        .await?;\n    \n    let mut file = tokio::fs::File::create(dest_path).await?;\n    let mut stream = response.body;\n    \n    while let Some(bytes) = stream.try_next().await? {\n        file.write_all(&bytes).await?;\n    }\n    \n    println!("تم تنزيل الملف {}/{} إلى {}", bucket, key, dest_path);\n    Ok(())\n}\n
\n\n

قائمة الكائنات في الحاوية

\n\n

الحصول على قائمة الملفات (المفاتيح) في الحاوية:

\n\n
async fn list_objects(client: &Client, bucket: &str) -> Result<(), Box<dyn std::error::Error>> {\n    let objects = client\n        .list_objects_v2()\n        .bucket(bucket)\n        .send()\n        .await?;\n    \n    if let Some(contents) = objects.contents {\n        for obj in contents {\n            if let Some(key) = obj.key {\n                println!("- {}", key);\n            }\n        }\n    }\n    Ok(())\n}\n
\n\n

حذف كائن

\n\n
async fn delete_object(client: &Client, bucket: &str, key: &str) -> Result<(), Box<dyn std::error::Error>> {\n    client\n        .delete_object()\n        .bucket(bucket)\n        .key(key)\n        .send()\n        .await?;\n    \n    println!("تم حذف الكائن {}/{}", bucket, key);\n    Ok(())\n}\n
\n\n

العمل مع MinIO ومخازن أخرى متوافقة مع S3

\n\n

للاتصال بـ MinIO (محاكي S3 محلي) أو Yandex Object Storage، يجب إعادة تعريف نقطة النهاية (endpoint)

توصيات