Menggunakan tag entity untuk kontrol konkurensi optimis

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

Dalam beberapa kasus, dua proses yang memperbarui resource yang sama secara paralel dapat mengganggu satu sama lain, di mana proses yang terakhir akan menimpa upaya proses yang pertama.

ETag menyediakan sarana untuk kontrol konkurensi optimis dengan memungkinkan proses untuk 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 disematkan dalam data Secret. Semua permintaan lainnya menerima parameter etag opsional.

Jika ETag diberikan dan cocok dengan ETag resource saat ini, permintaan akan berhasil; jika tidak, permintaan akan gagal dengan 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 dibuat saat pembuatan resource (projects.secrets.create, projects.secrets.addVersion) dan diperbarui untuk setiap permintaan modifikasi yang tercantum di atas. Permintaan modifikasi hanya memperbarui ETag resource yang berlaku. Artinya, memperbarui versi secret tidak memengaruhi ETag secret, dan begitu juga sebaliknya, memperbarui ETag tidak memengaruhi versi secret.

Meskipun pembaruan tidak mengubah status resource, pembaruan tersebut tetap memperbarui ETag resource.

Perhatikan contoh berikut:

  • Pengguna 1 mencoba mengaktifkan versi rahasia tanpa menyadari bahwa versi tersebut sudah diaktifkan. Sistem memproses ini, dan hanya mengubah ETag versi.

  • Pengguna 2, yang menggunakan ETag lama, mencoba menonaktifkan versi.

  • Hal ini gagal karena sistem mengenali ETag yang lebih baru, yang menunjukkan maksud yang lebih baru untuk mengaktifkan versi tersebut.

Bahkan update yang tampaknya kecil pun penting karena perubahan ETag. Hal ini memastikan konsistensi data, terutama dengan beberapa pengguna atau sistem yang berinteraksi dengan resource yang sama.

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

Menghapus secret dengan ETag

Bagian ini menjelaskan penggunaan ETag saat menghapus secret. Jika secret telah diubah oleh proses lain, operasi penghapusan akan gagal.

gcloud

Sebelum menggunakan salah satu data perintah di bawah, lakukan penggantian berikut:

  • SECRET_ID: ID secret atau ID yang memenuhi syarat sepenuhnya untuk secret.
  • ETAG: tag entity secret. ETag harus menyertakan tanda kutip di sekitarnya. Misalnya, jika nilai ETag adalah "abc", nilai yang di-escape shell adalah "\"abc\"".

Jalankan perintah berikut:

Linux, macOS, atau Cloud Shell

gcloud secrets delete SECRET_ID \
    --etag "ETAG"

Windows (PowerShell)

gcloud secrets delete SECRET_ID `
    --etag "ETAG"

Windows (cmd.exe)

gcloud secrets delete SECRET_ID ^
    --etag "ETAG"

REST

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • PROJECT_ID: Google Cloud project ID.
  • SECRET_ID: ID secret atau ID yang memenuhi syarat sepenuhnya untuk secret.
  • ETAG: tag entity secret. ETag ditentukan sebagai bagian dari string kueri URL dan harus dienkode URL. Misalnya, jika nilai ETag adalah "abc", nilai yang dienkode URL adalah %22abc%22 karena karakter kutipan dienkode sebagai %22.

Metode HTTP dan URL:

DELETE https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID?etag=ETAG

Isi JSON permintaan:

{}

Untuk mengirim permintaan Anda, pilih salah satu opsi berikut:

curl

Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

curl -X DELETE \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID?etag=ETAG"

PowerShell

Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method DELETE `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID?etag=ETAG" | Select-Object -Expand Content

Anda akan melihat respons JSON seperti berikut:

{}

Memperbarui secret dengan ETag

Bagian ini menjelaskan penggunaan ETag saat memperbarui secret. Jika secret telah diubah oleh proses lain, operasi update akan gagal.

gcloud

Sebelum menggunakan salah satu data perintah di bawah, lakukan penggantian berikut:

  • SECRET_ID: ID secret atau ID yang memenuhi syarat sepenuhnya untuk secret.
  • KEY: nama label.
  • VALUE: nilai label yang sesuai.
  • ETAG: tag entity secret. ETag harus menyertakan tanda kutip di sekitarnya. Misalnya, jika nilai ETag adalah "abc", nilai yang di-escape shell adalah "\"abc\"".

Jalankan perintah berikut:

Linux, macOS, atau Cloud Shell

gcloud secrets update SECRET_ID \
    --update-labels "KEY=VALUE" \
    --etag "ETAG"

Windows (PowerShell)

gcloud secrets update SECRET_ID `
    --update-labels "KEY=VALUE" `
    --etag "ETAG"

Windows (cmd.exe)

gcloud secrets update SECRET_ID ^
    --update-labels "KEY=VALUE" ^
    --etag "ETAG"

Respons menampilkan rahasia.

REST

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • PROJECT_ID: Google Cloud project ID.
  • SECRET_ID: ID secret atau ID yang memenuhi syarat sepenuhnya untuk secret.
  • ETAG: tag entity secret. ETag ditentukan sebagai kolom di Secret dan harus menyertakan tanda petik di sekitarnya. Misalnya, jika nilai ETag adalah "abc", nilai yang di-escape JSON adalah {"etag":"\"abc\""}.
  • KEY: nama label.
  • VALUE: nilai label yang sesuai.

Metode HTTP dan URL:

PATCH https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID?updateMask=labels

Isi JSON permintaan:

{"etag":"ETAG", "labels":{"KEY": "VALUE"}}

Untuk mengirim permintaan Anda, pilih salah satu opsi berikut:

curl

Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID?updateMask=labels"

PowerShell

Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID?updateMask=labels" | Select-Object -Expand Content

Anda akan melihat respons JSON seperti berikut:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID",
  "createTime": "2024-09-04T04:06:00.660420Z",
  "labels": {
    "KEY": "VALUE"
  },
  "etag": "\"162145a4f894d5\""
}

Memperbarui versi secret dengan ETag

Bagian ini menjelaskan penggunaan ETag saat memperbarui versi secret. Jika versi secret telah diubah oleh proses lain, operasi update akan gagal.

Contoh kode di sini menjelaskan cara menonaktifkan versi secret dengan ETag. Anda juga dapat menentukan ETag selama operasi mutasi rahasia lainnya, seperti saat mengaktifkan versi yang dinonaktifkan atau menghancurkan versi rahasia. Lihat contoh kode untuk Secret Manager.

gcloud

Sebelum menggunakan salah satu data perintah di bawah, lakukan penggantian berikut:

  • VERSION_ID: ID versi secret.
  • SECRET_ID: ID secret atau ID yang memenuhi syarat sepenuhnya untuk secret.
  • ETAG: tag entity. ETag harus menyertakan tanda kutip di sekitarnya. Misalnya, jika nilai ETag adalah "abc", nilai yang di-escape shell adalah "\"abc\"".

Jalankan perintah berikut:

Linux, macOS, atau Cloud Shell

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

Windows (PowerShell)

gcloud secrets versions disable VERSION_ID `
  --secret SECRET_ID `
  --etag "ETAG"

Windows (cmd.exe)

gcloud secrets versions disable VERSION_ID ^
  --secret SECRET_ID ^
  --etag "ETAG"

Respons menampilkan rahasia.

REST

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • PROJECT_ID: Google Cloud project ID
  • SECRET_ID: ID secret atau ID yang memenuhi syarat sepenuhnya untuk secret
  • VERSION_ID: ID versi secret
  • ETAG: tag entity versi secret. ETag ditentukan sebagai kolom di SecretVersion dan harus menyertakan tanda kutip di sekitarnya. Misalnya, jika nilai ETag adalah "abc", nilai yang di-escape JSON adalah {"etag":"\"abc\""}.

Metode HTTP dan URL:

POST https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION_ID:disable"

Isi JSON permintaan:

{"etag":"ETAG"}

Untuk mengirim permintaan Anda, pilih salah satu opsi berikut:

curl

Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION_ID:disable""

PowerShell

Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION_ID:disable"" | Select-Object -Expand Content

Anda akan melihat respons JSON yang mirip dengan berikut ini:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID/versions/VERSION_ID",
  "createTime": "2024-09-04T06:41:57.859674Z",
  "state": "DISABLED",
  "etag": "\"1621457b3c1459\""
}

Langkah berikutnya