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