快速入门:将 Cloud Storage 与 Rust 搭配使用

Google Cloud Storage 是一种用于存储非结构化数据的代管式服务。

Rust 客户端库提供了一个惯用 API 来访问此服务。客户端库会恢复中断的下载和上传,并自动对数据执行完整性检查。对于元数据操作,客户端库可以重试失败的请求,并自动轮询长时间运行的操作。

本指南将介绍如何创建 Cloud Storage 存储桶、将对象上传到此存储桶,然后读取该对象。

在开始学习本指南之前,请创建一个已启用结算功能的 Google Cloud 项目。

添加客户端库依赖项

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

如需创建存储桶,您必须提供项目名称和存储桶 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.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?;