Menggunakan tag entity untuk kontrol serentak optimis

Secret Manager mendukung penggunaan tag entity (ETag) untuk kontrol serentak optimis.

Dalam beberapa kasus, dua proses yang mengupdate resource yang sama secara paralel dapat mengganggu satu sama lain, dengan proses yang kedua akan menimpa upaya proses sebelumnya.

ETag memberikan sarana untuk melakukan kontrol serentak optimis dengan memungkinkan proses melihat apakah resource telah dimodifikasi sebelum mengambil tindakan pada resource tersebut.

Menggunakan ETag dengan Secret Manager

Permintaan modifikasi resource berikut mendukung ETag:

Dalam permintaan secrets.patch, ETag permintaan akan disematkan dalam data Secret. Semua permintaan lainnya menerima parameter etag opsional.

Jika ETag disediakan dan cocok dengan ETag resource saat ini, permintaan akan berhasil; jika tidak, permintaan akan gagal dengan menampilkan error FAILED_PRECONDITION dan kode status HTTP 400. Jika ETag tidak diberikan, permintaan akan dilanjutkan tanpa memeriksa nilai ETag yang saat ini disimpan.

ETag resource dihasilkan saat pembuatan resource (projects.secrets.create, projects.secrets.addVersion) dan diupdate untuk setiap permintaan modifikasi yang tercantum di atas. Permintaan modifikasi hanya mengupdate ETag dari resource tempat permintaan tersebut diterapkan. Artinya, memperbarui versi rahasia tidak akan memengaruhi ETag rahasia, dan sebaliknya.

Update resource tanpa pengoperasian juga akan mengupdate ETag resource. Misalnya, pertimbangkan skenario berikut: Pemanggil mengirimkan permintaan untuk mengaktifkan versi secret yang sudah diaktifkan, tanpa disadari. Permintaan berhasil diproses dan tidak mengubah status versi, tetapi mengubah versi ETag. Pemanggil lain, yang masih menggunakan ETag versi lama, berusaha menonaktifkan versi yang sama. Permintaan gagal karena kami telah menangkap intent untuk mengaktifkan versi sebelum permintaan penonaktifan dalam ETag yang dimodifikasi.

Resource etag akan ditampilkan dalam respons setiap kali resource (Secret atau SecretVersion) disertakan.

Penggunaan

Menghapus rahasia dengan etag

Contoh ini menunjukkan penggunaan etag saat menghapus rahasia. Jika rahasia ini telah diubah oleh proses lain, operasi penghapusan akan gagal.

gcloud

Untuk menggunakan Secret Manager di command line, Instal atau upgrade Google Cloud CLI ke versi 378.0.0 atau yang lebih baru. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

Etag harus menyertakan tanda kutip di sekitarnya. Misalnya, jika nilai etag-nya adalah "abc", nilai yang di-escape shell-nya adalah "\"abc\"".

gcloud beta secrets delete "SECRET_ID" \
    --etag "ETAG"

Anda juga dapat menentukan etag selama operasi mutasi rahasia lainnya:

API

Contoh ini menggunakan curl untuk mendemonstrasikan penggunaan API. Anda dapat membuat token akses dengan gcloud auth print-access-token. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

Etag ditentukan sebagai bagian dari string kueri URL dan harus dienkode ke URL. Misalnya, jika nilai etag adalah "abc", nilai yang dienkode ke URL akan menjadi %22abc%22 karena karakter kutipan dienkode sebagai %22.

curl "https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID?etag=ETAG" \
    --request "DELETE" \
    --header "Authorization: Bearer ACCESS_TOKEN"

Memperbarui rahasia dengan etag

Contoh ini menunjukkan penggunaan etag saat memperbarui secret. Jika rahasia ini telah diubah oleh proses lain, operasi update akan gagal.

gcloud

Untuk menggunakan Secret Manager di command line, Instal atau upgrade Google Cloud CLI ke versi 378.0.0 atau yang lebih baru. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

Etag harus menyertakan tanda kutip di sekitarnya. Misalnya, jika nilai etag-nya adalah "abc", nilai yang di-escape shell-nya adalah "\"abc\"".

gcloud beta secrets update "SECERT_ID" \
    --update-labels "foo=bar" \
    --etag "ETAG"

Anda juga dapat menentukan etag selama operasi mutasi rahasia lainnya:

API

Contoh ini menggunakan curl untuk mendemonstrasikan penggunaan API. Anda dapat membuat token akses dengan gcloud auth print-access-token. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

Etag ditentukan sebagai kolom pada Secret dan harus menyertakan tanda kutip di sekitarnya. Misalnya, jika nilai etag adalah "abc", nilai yang di-escape JSON akan menjadi {"etag":"\"abc\""}.

curl "https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID?updateMask=labels" \
    --request "PATCH" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json" \
    --data '{"etag":"ETAG", "labels":{"foo": "bar"}}'

Mengupdate versi rahasia dengan etag

Contoh ini menunjukkan penggunaan etag saat mengupdate versi rahasia. Jika versi secret telah diubah oleh proses lain, operasi update akan gagal.

gcloud

Untuk menggunakan Secret Manager di command line, Instal atau upgrade Google Cloud CLI ke versi 378.0.0 atau yang lebih baru. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

Etag harus menyertakan tanda kutip di sekitarnya. Misalnya, jika nilai etag-nya adalah "abc", nilai yang di-escape shell-nya adalah "\"abc\"".

gcloud beta secrets versions disable "VERSION_ID" \
    --secret "SECRET_ID" \
    --etag "ETAG"

Anda juga dapat menentukan etag selama operasi mutasi versi rahasia lainnya:

API

Contoh ini menggunakan curl untuk mendemonstrasikan penggunaan API. Anda dapat membuat token akses dengan gcloud auth print-access-token. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

Etag ditentukan sebagai kolom pada SecretVersion dan harus menyertakan tanda kutip di sekitarnya. Misalnya, jika nilai etag adalah "abc", nilai yang di-escape JSON akan menjadi {"etag":"\"abc\""}.

curl "https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION_ID:disable" \
    --request "POST" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json" \
    --data '{"etag":"ETAG"}'

Langkah selanjutnya