Utilizzare i tag delle entità per il controllo della concorrenza ottimistico

Secret Manager supporta l'utilizzo dei tag entità (ETag) per il controllo della contemporaneità ottimistico.

In alcuni casi, due processi che aggiornano la stessa risorsa in parallelo interferiscono tra loro, mentre quest'ultimo processo sostituisce lo sforzo il primo.

Gli ETag forniscono un mezzo per un controllo ottimistico della contemporaneità, consentendo i processi per vedere se una risorsa è stata modificata prima di intraprendere qualsiasi azione.

Utilizzo degli ETag con Secret Manager

Le seguenti richieste di modifica delle risorse supportano gli ETag:

In una richiesta secrets.patch, l'ETag della richiesta è incorporato nel Secret e i dati di Google Cloud. Tutte le altre richieste accettano un parametro facoltativo etag.

Se viene fornito un ETag che corrisponde all'ETag della risorsa attuale, la richiesta succeeds; altrimenti non va a buon fine con un FAILED_PRECONDITION e un codice di stato HTTP 400. Se non viene fornito un ETag, la richiesta procede senza controllare il valore ETag attualmente memorizzato.

Gli ETag delle risorse vengono generati al momento della creazione della risorsa (projects.secrets.create, projects.secrets.addVersion) e aggiornati per ciascuna delle richieste di modifica elencate sopra. Una richiesta di modifica aggiorna solo l'ETag della risorsa a cui si applica. Ciò significa che l'aggiornamento di una versione del secret non influisce l'ETag segreto e viceversa.

Un aggiornamento della risorsa che non richiede alcuna operazione aggiorna anche l'ETag della risorsa. Ad esempio: Considera lo scenario seguente: un chiamante invia una richiesta per abilitare un secret che è già abilitata, a sua insaputa. La richiesta viene elaborata correttamente, non modifica lo stato della versione, ma modifica l'ETag della versione. Un altro chiamante, che utilizza l'ETag precedente, tenta di disattivare la stessa versione. La richiesta non va a buon fine perché abbiamo rilevato l'intenzione di attivare la versione precedente alla richiesta di disattivazione nell'ETag modificato.

La risorsa etag viene restituita nella risposta ogni volta che una risorsa (Secret) o SecretVersion).

Utilizzo

Elimina un secret con Etag

Questo esempio mostra l'utilizzo di ETag durante l'eliminazione di un secret. Se il secret è stato modificato da un'altra procedura, l'operazione di eliminazione non andrà a buon fine.

gcloud

Per utilizzare Secret Manager nella riga di comando, devi prima Installa o esegui l'upgrade alla versione 378.0.0 o successive di Google Cloud CLI. In Compute Engine o GKE, devi eseguire l'autenticazione con l'ambito cloud-platform.

L'etag deve includere le virgolette. Ad esempio, se il valore etag era "abc", il valore con escape shell sarebbe "\"abc\"".

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

Puoi anche specificare gli ETag durante altre operazioni di mutazione dei secret:

API

In questi esempi viene utilizzato curl per dimostrare l'utilizzo dell'API. Puoi generare token di accesso con gcloud auth stampa-access-token. In Compute Engine o GKE, devi eseguire l'autenticazione con l'ambito cloud-platform.

L'etag viene specificato come parte della stringa di query dell'URL e deve essere Codificato come URL. Ad esempio, se il valore dell'etag era "abc", il valore codificato nell'URL sarebbe %22abc%22 perché le virgolette sono codificate come %22.

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

Aggiorna un secret con Etag

Questo dimostra l'utilizzo di ETag durante l'aggiornamento di un secret. Se il secret è stato modificato da un altro processo, l'operazione di aggiornamento non andrà a buon fine.

gcloud

Per utilizzare Secret Manager nella riga di comando, devi prima Installa o esegui l'upgrade alla versione 378.0.0 o successive di Google Cloud CLI. In Compute Engine o GKE, devi eseguire l'autenticazione con l'ambito cloud-platform.

L'etag deve includere le virgolette. Ad esempio, se il valore etag era "abc", il valore con escape shell sarebbe "\"abc\"".

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

Puoi anche specificare gli ETag durante altre operazioni di mutazione dei secret:

API

Questi esempi utilizzano curl per dimostrare l'utilizzo dell'API. Puoi generare token di accesso con gcloud auth stampa-access-token. In Compute Engine o GKE, devi eseguire l'autenticazione con l'ambito cloud-platform.

L'etag viene specificato come campo in Secret e deve includere le virgolette di delimitazione. Ad esempio, se il valore dell'etag era "abc", il valore Il valore con escape JSON sarebbe {"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"}}'

Aggiornare una versione del secret con gli ETag

Questo dimostra l'utilizzo di etag durante l'aggiornamento di una versione di un secret. Se la versione del segreto è stata modificata da un altro processo, l'operazione di aggiornamento non andrà a buon fine.

gcloud

Per utilizzare Secret Manager sulla riga di comando, installa o esegui l'upgrade alla versione 378.0.0 o successive di Google Cloud CLI. In Compute Engine o GKE, devi eseguire l'autenticazione con l'ambito cloud-platform.

L'etag deve includere le virgolette. Ad esempio, se il valore etag era "abc", il valore con caratteri di escape della shell sarà "\"abc\"".

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

Puoi anche specificare gli ETag durante altre operazioni di mutazione della versione del secret:

API

In questi esempi viene utilizzato curl per dimostrare l'utilizzo dell'API. Puoi generare token di accesso con gcloud auth stampa-access-token. Su Compute Engine o GKE, devi autenticarti con l'ambito cloud-platform.

L'etag è specificato come campo in SecretVersion e deve includere tra virgolette. Ad esempio, se il valore dell'etag era "abc", il valore Il valore con escape JSON sarebbe {"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"}'

Passaggi successivi