필드 마스크를 사용하여 리소스를 선택적으로 업데이트하는 방법을 알아봅니다. Google Cloud에서 리소스를 업데이트할 때 전체 리소스를 바꾸는 대신 특정 필드만 수정할 수 있습니다. Rust 클라이언트 라이브러리는 필드 마스크를 지원하므로 리소스의 어떤 필드를 업데이트하고 다른 필드는 변경하지 않을지 정확하게 제어할 수 있습니다.
기본 요건
이 가이드에서는 Secret Manager API를 사용하지만 이 개념은 다른 Google Cloud 리소스 및 서비스에도 적용됩니다.
계속하기 전에 Secret Manager를 사용하여 보안 비밀 만들기 및 액세스에 따라 Secret Manager API를 사용 설정하고 인증하세요.
Rust 라이브러리의 전체 설정 안내는 개발 환경 설정을 참고하세요.
종속 항목
Secret Manager를 사용 설정한 후 Cargo.toml 파일에 종속 항목을 선언합니다.
cargo add google-cloud-secretmanager-v1
cargo add tokio
잘 알려진 유형 설치
google_cloud_wkt 크레이트에는 Google Cloud API의 잘 알려진 유형이 포함되어 있습니다.
이러한 유형은 일반적으로 맞춤 JSON 인코딩이 있으며 흔히 사용되는 Rust 유형 간 변환 함수를 제공할 수 있습니다. google_cloud_wkt 크레이트에는 필드 마스크 유형인 FieldMask이 포함됩니다.
크레이트를 종속 항목으로 추가합니다.
cargo add google-cloud-wkt
필드 마스크
FieldMask은 기호 필드 경로의 집합을 나타냅니다. 필드 마스크는 업데이트 작업에서 수정하거나 가져오기 작업에서 반환하는 필드의 하위 집합을 지정합니다.
업데이트 작업에서 필드 마스크는 타겟 리소스의 업데이트할 필드를 지정합니다. API는 마스크에 지정된 필드의 값만 변경하고 나머지는 그대로 둡니다. 업데이트된 값을 설명하는 리소스를 전달하면 API는 마스크로 처리되지 않는 모든 필드의 값을 무시합니다. 업데이트 시 필드 마스크를 제공하지 않으면 작업이 모든 필드에 적용됩니다.
필드를 기본값으로 재설정하려면 마스크에 필드를 포함하고 제공된 리소스에 기본값을 설정합니다. 리소스의 모든 필드를 재설정하려면 리소스의 기본 인스턴스를 제공하고 마스크의 모든 필드를 설정하거나 마스크를 제공하지 않습니다.
리소스의 필드 업데이트
먼저 Secret Manager 클라이언트를 초기화하고 보안 비밀을 만듭니다.
let client = SecretManagerService::builder().build().await?;
let secret = client
.create_secret()
.set_parent(format!("projects/{project_id}"))
.set_secret_id("your-secret")
.set_secret(
Secret::new().set_replication(Replication::new().set_automatic(Automatic::new())),
)
.send()
.await?;
println!("CREATE = {secret:?}");
생성 작업의 출력에는 labels 및 annotations 필드가 모두 비어 있는 것으로 표시됩니다.
다음 코드는 labels 및 annotations 필드를 업데이트합니다.
let tag = |mut labels: HashMap<_, _>, msg: &str| {
labels.insert("updated".to_string(), msg.to_string());
labels
};
let update = client
.update_secret()
.set_secret(
Secret::new()
.set_name(&secret.name)
.set_etag(secret.etag)
.set_labels(tag(secret.labels, "your-label"))
.set_annotations(tag(secret.annotations, "your-annotations")),
)
.set_update_mask(FieldMask::default().set_paths(["annotations", "labels"]))
.send()
.await?;
println!("UPDATE = {update:?}");
set_etag 메서드를 사용하면 비밀에 etag를 설정할 수 있으므로 동시 업데이트가 덮어쓰는 것을 방지할 수 있습니다.
업데이트된 보안 비밀에 라벨과 주석을 설정한 후 필드 마스크를 set_update_mask에 전달하여 업데이트할 필드 경로를 지정합니다.
.set_update_mask(FieldMask::default().set_paths(["annotations", "labels"]))
업데이트 작업의 출력에 필드가 업데이트된 것으로 표시됩니다.
labels: {"updated": "your-label"},
...
annotations: {"updated": "your-annotations"},
필드 업데이트: 전체 코드
이 샘플 코드는 보안 비밀을 초기화하고 만든 후 필드 마스크를 적용합니다.
use google_cloud_secretmanager_v1::client::SecretManagerService;
use google_cloud_secretmanager_v1::model::replication::Automatic;
use google_cloud_secretmanager_v1::model::{Replication, Secret};
use google_cloud_wkt::FieldMask;
use std::collections::HashMap;
pub async fn sample(project_id: &str) -> anyhow::Result<()> {
let client = SecretManagerService::builder().build().await?;
let secret = client
.create_secret()
.set_parent(format!("projects/{project_id}"))
.set_secret_id("your-secret")
.set_secret(
Secret::new().set_replication(Replication::new().set_automatic(Automatic::new())),
)
.send()
.await?;
println!("CREATE = {secret:?}");
let tag = |mut labels: HashMap<_, _>, msg: &str| {
labels.insert("updated".to_string(), msg.to_string());
labels
};
let update = client
.update_secret()
.set_secret(
Secret::new()
.set_name(&secret.name)
.set_etag(secret.etag)
.set_labels(tag(secret.labels, "your-label"))
.set_annotations(tag(secret.annotations, "your-annotations")),
)
.set_update_mask(FieldMask::default().set_paths(["annotations", "labels"]))
.send()
.await?;
println!("UPDATE = {update:?}");
Ok(())
}