Menggunakan Cloud Storage dengan Rust

Cloud Storage adalah layanan terkelola untuk menyimpan data yang tidak terstruktur. Crate google-cloud-storage di Library Klien Cloud untuk Rust menyediakan API Rust idiomatis yang melanjutkan upload dan download yang terhenti, memverifikasi integritas data, mencoba ulang error metadata sementara, dan melakukan polling operasi yang berjalan lama.

Dokumen ini menunjukkan cara membuat bucket Cloud Storage, menulis objek ke bucket tersebut, membaca kembali konten objek, dan menghapus kedua resource.

Sebelum memulai

Sebelum menjalankan kode dalam dokumen ini, selesaikan prasyarat berikut:

Dependensi

Tambahkan library klien Cloud Storage dan crate pendukung ke file Cargo.toml Anda:

cargo add google-cloud-storage anyhow bytes
cargo add tokio --features macros,rt-multi-thread

Membuat bucket

Operasi pada bucket dan metadata objek menggunakan klien StorageControl:

  1. Lakukan inisialisasi klien StorageControl:

    use google_cloud_storage as gcs;
    use google_cloud_storage::client::StorageControl;
    let control = StorageControl::builder().build().await?;

  2. Konfigurasikan permintaan create_bucket dengan project ID dan ID bucket unik global Anda:

    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}"))
        )

  3. Opsional: Konfigurasikan atribut bucket seperti akses level bucket yang seragam:

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

  4. Kirim permintaan dan tunggu metadata Bucket yang dibuat:

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

Menulis objek

Operasi yang membaca atau menulis data objek menggunakan klien Storage:

  1. Lakukan inisialisasi klien Storage:

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

  2. Tulis objek bernama hello.txt ke bucket menggunakan write_object:

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

Membaca objek

Untuk membaca konten objek, panggil read_object dan kumpulkan potongan yang di-streaming:

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)
);

Saat dijalankan, langkah ini akan mencetak byte yang didownload:

object contents successfully downloaded b"Hello World!"

Menghapus objek dan bucket

Hapus objek dan bucket dalam program Anda jika tidak lagi diperlukan:

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?;

Kode lengkap

Fungsi berikut menggabungkan semua langkah sebelumnya:

pub async fn sample(project_id: &str, bucket_id: &str) -> anyhow::Result<()> {
    use google_cloud_storage as gcs;
    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}"))
                .set_iam_config(
                    gcs::model::bucket::IamConfig::new().set_uniform_bucket_level_access(
                        gcs::model::bucket::iam_config::UniformBucketLevelAccess::new()
                            .set_enabled(true),
                    ),
                ),
        )
        .send()
        .await?;
    println!("bucket successfully created {bucket:?}");

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

    let object = client
        .write_object(&bucket.name, "hello.txt", "Hello World!")
        .send_buffered()
        .await?;
    println!("object successfully uploaded {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?;

    Ok(())
}

Pembersihan

Jika sampel keluar lebih awal sebelum menjalankan langkah-langkah penghapusan, hapus bucket secara manual agar Anda tidak dikenai biaya berkelanjutan untuk resource yang dibuat dalam dokumen ini.