מדריך למתחילים: שימוש ב-Cloud Storage עם Rust

‫Google Cloud Storage הוא שירות מנוהל לאחסון נתונים לא מובְנים.

ספריית הלקוח של Rust מספקת API אידיומטי לגישה לשירות הזה. ספריית הלקוח מחדשת הורדות והעלאות שהופסקו, ומבצעת באופן אוטומטי בדיקות תקינות של הנתונים. בפעולות שקשורות למטא-נתונים, ספריית הלקוח יכולה לנסות שוב בקשות שנכשלו, ולבצע באופן אוטומטי בדיקות חוזרות של פעולות ארוכות טווח.

במדריך הזה מוסבר איך ליצור קטגוריה של Cloud Storage, להעלות אליה אובייקט ואז לקרוא את האובייקט בחזרה.

לפני שמתחילים לפעול לפי המדריך הזה, צריך ליצור פרויקט בענן עם חיוב מופעל.

הוספת התלות של ספריית הלקוח

cargo add google-cloud-storage

יצירה של קטגוריית אחסון

הלקוח לביצוע פעולות על קטגוריות ומטא-נתונים של אובייקטים נקרא StorageControl.

    use google_cloud_storage::model::{Bucket, bucket::IamConfig, bucket::iam_config::UniformBucketLevelAccess};
    use google_cloud_storage::client::StorageControl;
    let control = StorageControl::builder().build().await?;

כדי ליצור קטגוריה, צריך לציין את שם הפרויקט ואת מזהה הקטגוריה.

    let bucket = control
        .create_bucket()
        .set_parent("projects/_")
        .set_bucket_id(bucket_id)
        .set_bucket(
            gcs::model::Bucket::new()
                .set_project(format!("projects/{project_id}"))
        )

אפשר גם לציין מאפיינים אחרים של הקטגוריה. לדוגמה, אם רוצים שכל האובייקטים בקטגוריה ישתמשו באותן הרשאות, אפשר להפעיל גישה אחידה ברמת הקטגוריה.

    Bucket::new()
        .set_project(format!("projects/{project_id}"))
        .set_iam_config(
            IamConfig::new()
                .set_uniform_bucket_level_access(
                    UniformBucketLevelAccess::new()
                        .set_enabled(true),
            ),
        ),

לאחר מכן שולחים את הבקשה ומחכים לתשובה.

        .send()
        .await?;
    println!("bucket successfully created {bucket:?}");

העלאת אובייקט

הלקוח שמבצע פעולות על נתוני אובייקטים נקרא Storage.

    use google_cloud_storage::client::Storage;
    let client = Storage::builder().build().await?;

במקרה הזה, יוצרים אובייקט בשם hello.txt עם הברכה Hello World!.

    let object = client
        .upload_object(&bucket.name, "hello.txt", "Hello World!")
        .send_buffered()
        .await?;
    println!("object successfully uploaded {object:?}");

הורדת אובייקט

כדי להוריד את התוכן של אובייקט, משתמשים בשיטה read_object().

    let mut reader = client.read_object(&bucket.name, "hello.txt").send().await?;
    let mut contents = Vec::new();
    while let Some(chunk) = reader.next().await.transpose()? {
        contents.extend_from_slice(&chunk);
    }
    println!(
        "object contents successfully downloaded {:?}",
        bytes::Bytes::from_owner(contents)
    );

לפנות משאבים

לבסוף, מסירים את האובייקט ואת הקטגוריה כדי לנקות את המשאבים שבהם השתמשתם במדריך הזה.

    control
        .delete_object()
        .set_bucket(&bucket.name)
        .set_object(&object.name)
        .set_generation(object.generation)
        .send()
        .await?;
    control
        .delete_bucket()
        .set_name(&bucket.name)
        .send()
        .await?;