クイックスタート: Rust で Cloud Storage を使用する

Google Cloud Storage は、非構造化データを保存するためのマネージド サービスです。

Rust クライアント ライブラリは、このサービスにアクセスするための慣用的な API を提供します。クライアント ライブラリは、中断されたダウンロードとアップロードを再開し、データの整合性チェックを自動的に実行します。メタデータ オペレーションの場合、クライアント ライブラリは失敗したリクエストを再試行し、長時間実行オペレーションを自動的にポーリングできます。

このガイドでは、Cloud Storage バケットを作成し、このバケットにオブジェクトをアップロードしてから、オブジェクトを読み取る方法について説明します。

このガイドを開始する前に、課金が有効になっている Google Cloud プロジェクトを作成します。

クライアント ライブラリの依存関係を追加する

cargo add google-cloud-storage

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

バケットを作成するには、プロジェクト名とバケット ID を指定する必要があります。

    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 World!」を含む hello.txt というオブジェクトを作成します。

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