빠른 시작: Rust로 Cloud Storage 사용

Google Cloud 스토리지는 비정형 데이터를 저장하기 위한 관리형 서비스입니다.

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:?}");

객체 업로드

객체 데이터에 대한 작업을 실행하는 클라이언트를 스토리지라고 합니다.

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