Protezione dei modelli ML e della proprietà intellettuale utilizzando Confidential Space

1. Panoramica

Spazio riservato offre un ambiente sicuro per la collaborazione tra più parti. Questo codelab mostra come Confidential Space può essere utilizzato per proteggere la proprietà intellettuale sensibile, ad esempio i modelli di machine learning.

In questo codelab, utilizzerai Confidential Space per consentire a un'azienda di condividere in modo sicuro il proprio modello di machine learning proprietario con un'altra azienda che vuole utilizzare il modello. Nello specifico, Company Primus dispone di un modello di machine learning che verrebbe rilasciato solo per un carico di lavoro in esecuzione in Confidential Space, consentendo a Primus di mantenere il controllo completo sulla sua proprietà intellettuale. Company Secundus sarà l'operatore del carico di lavoro ed eseguirà il carico di lavoro di machine learning in uno spazio riservato. Secundus caricherà questo modello ed eseguirà un'inferenza utilizzando dati di esempio di proprietà di Secundus.

In questo caso Primus è l'autore del carico di lavoro che crea il codice del carico di lavoro e un collaboratore che vuole proteggere la sua proprietà intellettuale dall'operatore non attendibile del carico di lavoro, Secundus. Secundus è l'operatore del carico di lavoro di machine learning.

5a86c47d935da998.jpeg

Cosa imparerai a fare

  • Come configurare un ambiente in cui una parte può condividere il proprio modello ML proprietario con un'altra senza perdere il controllo sulla sua proprietà intellettuale.

Che cosa ti serve

Ruoli coinvolti nella configurazione di Confidential Space

In questo codelab, Company Primus sarà il proprietario della risorsa e l'autore del carico di lavoro, che si occuperà di quanto segue:

  1. Configurazione delle risorse cloud richieste con un modello di machine learning
  2. Scrittura del codice del carico di lavoro
  3. Immagine della pubblicazione del carico di lavoro
  4. Configurazione del criterio del pool di identità per i carichi di lavoro per proteggere il modello ML da un operatore non attendibile

Secundus Company sarà l'operatore, responsabile di:

  1. Configurazione delle risorse cloud richieste per archiviare le immagini di esempio utilizzate dal carico di lavoro e i risultati
  2. Esecuzione del carico di lavoro ML in Confidential Space tramite il modello fornito da Primus

Come funziona Confidential Space

Quando esegui il carico di lavoro in Confidential Space, viene eseguito il seguente processo utilizzando le risorse configurate:

  1. Il carico di lavoro richiede un token di accesso Google generale per $PRIMUS_SERVICEACCOUNT al pool di identità per il carico di lavoro. Offre un token di servizio Attestation Verifier con attestazioni sui carichi di lavoro e sull'ambiente.
  2. Se le attestazioni relative alla misurazione del carico di lavoro nel token del servizio Attestation Verifier corrispondono alla condizione dell'attributo in fase di elaborazione, restituisce il token di accesso per $PRIMUS_SERVICEACCOUNT.
  3. Il carico di lavoro utilizza il token di accesso all'account di servizio associato a $PRIMUS_SERVICEACCOUNT per accedere al modello di machine learning archiviato nel bucket $PRIMUS_INPUT_STORAGE_BUCKET.
  4. Il carico di lavoro esegue un'operazione sui dati di proprietà di Secundus ed è gestito ed eseguito da Secundus nel suo progetto.
  5. Il carico di lavoro utilizza l'account di servizio $WORKLOAD_SERVICEACCOUNT per scrivere i risultati dell'operazione nel bucket $SECUNDUS_RESULT_STORAGE_BUCKET.

2. Configurazione delle risorse Cloud

Prima di iniziare

  • Clona questo repository utilizzando il comando in basso per ottenere gli script richiesti utilizzati nell'ambito di questo codelab.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • Cambia la directory per questo codelab.
cd confidential-space/codelabs/ml_model_protection/scripts
  • Assicurati di aver impostato le variabili di ambiente del progetto richieste come mostrato di seguito. Per ulteriori informazioni sulla configurazione di un progetto Google Cloud, fai riferimento a questo codelab. Fai riferimento a questo per informazioni dettagliate su come recuperare l'ID progetto e sulle differenze tra nome e numero di progetto.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus>
  • Attiva la fatturazione per i tuoi progetti.
  • Abilita l'API Confidential Computing e le API seguenti per entrambi i progetti.
gcloud services enable \
    cloudapis.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
  • Assegna valori alle variabili per i nomi delle risorse specificati in precedenza utilizzando il comando seguente. Queste variabili consentono di personalizzare i nomi delle risorse in base alle esigenze e di utilizzare le risorse esistenti, se già create. (ad es.export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket')
  1. Puoi impostare le seguenti variabili con i nomi delle risorse cloud esistenti nel progetto Primus. Se la variabile è impostata, viene utilizzata la risorsa cloud esistente corrispondente del progetto Primus. Se la variabile non viene impostata, il nome della risorsa cloud verrà generato da nome-progetto e verrà creata una nuova risorsa-cloud con quel nome. Di seguito sono riportate le variabili supportate per i nomi delle risorse:

$PRIMUS_INPUT_STORAGE_BUCKET

Il bucket in cui è archiviato il modello di machine learning di Primus.

$PRIMUS_WORKLOAD_IDENTITY_POOL

Il pool di identità per i carichi di lavoro (in fase di elaborazione) di Primus che convalida le attestazioni.

$PRIMUS_WIP_PROVIDER

Il provider di pool di identità per i carichi di lavoro di Primus, che include la condizione di autorizzazione da utilizzare per i token firmati dal servizio Attestation Verifier.

$PRIMUS_SERVICE_ACCOUNT

Account di servizio Primus che $PRIMUS_WORKLOAD_IDENTITY_POOL utilizza per accedere alle risorse protette (modello ML in questo codelab). In questo passaggio ha l'autorizzazione a leggere il modello di machine learning archiviato nel bucket $PRIMUS_INPUT_STORAGE_BUCKET.

$PRIMUS_ARTIFACT_REPOSITORY

Il repository degli artefatti in cui verrà eseguito il push dell'immagine Docker del carico di lavoro.

  1. Puoi impostare le seguenti variabili con i nomi delle risorse cloud esistenti nel progetto Secundus. Se la variabile è impostata, verrà utilizzata la risorsa cloud esistente corrispondente del progetto Secundus. Se la variabile non viene impostata, il nome della risorsa cloud verrà generato dal nome-progetto e verrà creata una nuova risorsa-cloud con quel nome. Di seguito sono riportate le variabili supportate per i nomi delle risorse:

$SECUNDUS_INPUT_STORAGE_BUCKET

Il bucket in cui sono archiviate le immagini di esempio che Secundus vorrebbe classificare utilizzando il modello fornito da Primus.

$SECUNDUS_RESULT_STORAGE_BUCKET

Il bucket in cui sono archiviati i risultati del carico di lavoro.

$WORKLOAD_IMAGE_NAME

Il nome dell'immagine del container del carico di lavoro.

$WORKLOAD_IMAGE_TAG

Il tag dell'immagine del container dei carichi di lavoro.

$WORKLOAD_SERVICE_ACCOUNT

L'account di servizio che dispone dell'autorizzazione per accedere alla Confidential VM che esegue il carico di lavoro.

  • Avrai bisogno di determinate autorizzazioni per questi due progetti e puoi fare riferimento a questa guida su come concedere i ruoli IAM utilizzando la console di Google Cloud:
  • Per $PRIMUS_PROJECT_ID, devi avere Amministratore Storage, Amministratore Artifact Registry, Amministratore account di servizio, Amministratore pool Workload Identity IAM.
  • Per $SECUNDUS_PROJECT_ID, avrai bisogno di un amministratore Compute, un amministratore Storage, un amministratore dell'account di servizio, un amministratore del pool di identità per i carichi di lavoro IAM e un amministratore della sicurezza (facoltativo).
  • Esegui il seguente script per impostare i nomi delle variabili rimanenti su valori in base all'ID progetto per i nomi delle risorse.
source config_env.sh

Configura le risorse di Primus Company

Nell'ambito di questo passaggio, configurerai le risorse cloud richieste per Primus. Esegui questo script per configurare le risorse per Primus. Le seguenti risorse verranno create come parte dell'esecuzione dello script:

  • Bucket Cloud Storage ($PRIMUS_INPUT_STORAGE_BUCKET) per archiviare il modello di machine learning di Primus.
  • Pool di identità per i carichi di lavoro ($PRIMUS_WORKLOAD_IDENTITY_POOL) per convalidare le rivendicazioni in base alle condizioni degli attributi configurate nel relativo provider.
  • Account di servizio ($PRIMUS_SERVICEACCOUNT) collegato al pool di identità per i carichi di lavoro ($PRIMUS_WORKLOAD_IDENTITY_POOL) sopra menzionato con accesso IAM per leggere i dati dal bucket Cloud Storage (con il ruolo objectViewer) e per la connessione di questo account di servizio al pool di identità per i carichi di lavoro (utilizzando il ruolo roles/iam.workloadIdentityUser).

Nell'ambito di questa configurazione delle risorse cloud, utilizzeremo un modello TensorFlow. Possiamo salvare in un archivio ZIP l'intero modello, che include l'architettura, i pesi e la configurazione di addestramento del modello. Ai fini di questo codelab, utilizzeremo il modello MobileNet V1 addestrato sul set di dati ImageNet, disponibile qui.

./setup_primus_company_resources.sh

Lo script sopra menzionato configurerà la risorsa cloud, ora scaricheremo e pubblicheremo il modello nel bucket Cloud Storage creato dallo script.

  1. Scarica il modello preaddestrato da qui.
  2. Al termine del download, rinomina il file tar scaricato in model.tar.gz.
  3. Pubblica il file model.tar.gz nel bucket Cloud Storage utilizzando il seguente comando dalla directory contenente il file model.tar.gz.
gsutil cp model.tar.gz gs://${PRIMUS_INPUT_STORAGE_BUCKET}/

Configura le risorse di Secundus Company

Nell'ambito di questo passaggio, configurerai le risorse cloud richieste per Secundus. Esegui questo script per configurare le risorse per Secundus. Nell'ambito di questa procedura, verranno create le seguenti risorse:

  • Bucket Cloud Storage ($SECUNDUS_INPUT_STORAGE_BUCKET) per archiviare le immagini di esempio per l'esecuzione delle inferenze di Secundus.
  • Bucket Cloud Storage ($SECUNDUS_RESULT_STORAGE_BUCKET) per archiviare il risultato dell'esecuzione del carico di lavoro ML da parte di Secundus.

Alcune immagini di esempio sono disponibili qui per questo codelab.

./setup_secundus_company_resources.sh

3. Crea carico di lavoro

Crea account di servizio per i carichi di lavoro

Ora creerai un account di servizio per il carico di lavoro con le autorizzazioni e i ruoli richiesti. Esegui il seguente script per creare un account di servizio per i carichi di lavoro nel progetto Secundus. Questo account di servizio verrà utilizzato dalla VM che esegue il carico di lavoro ML.

Questo account di servizio per il carico di lavoro ($WORKLOAD_SERVICEACCOUNT) avrà i seguenti ruoli:

  • confidentialcomputing.workloadUser per ricevere un token di attestazione
  • logging.logWriter per scrivere i log in Cloud Logging.
  • objectViewer per leggere i dati dal bucket Cloud Storage $SECUNDUS_INPUT_STORAGE_BUCKET.
  • objectUser per scrivere il risultato del carico di lavoro nel bucket Cloud Storage $SECUNDUS_RESULT_STORAGE_BUCKET.
./create_workload_service_account.sh

Crea carico di lavoro

Nell'ambito di questo passaggio, creerai un'immagine Docker del carico di lavoro. Il carico di lavoro deve essere creato da Primus. Il carico di lavoro utilizzato in questo codelab è il codice Python per il machine learning che accede al modello ML archiviato nel bucket di archiviazione di Primus ed esegue le inferenze con le immagini di esempio archiviate in un bucket di archiviazione.

Il modello di machine learning archiviato nel bucket di archiviazione di Primus sarebbe accessibile solo dai carichi di lavoro che soddisfano le condizioni degli attributi richieste. Queste condizioni degli attributi sono descritte più dettagliatamente nella sezione successiva relativa all'autorizzazione del carico di lavoro.

Ecco il metodo run_inference() del carico di lavoro che verrà creato e utilizzato in questo codelab. Puoi trovare l'intero codice del carico di lavoro qui.

def run_inference(image_path, model):
  try:
    # Read and preprocess the image
    image = tf.image.decode_image(tf.io.read_file(image_path), channels=3)
    image = tf.image.resize(image, (128, 128))
    image = tf.image.convert_image_dtype(image, tf.float32)
    image = tf.expand_dims(image, axis=0)

    # Get predictions from the model
    predictions = model(image)
    predicted_class = np.argmax(predictions)

    top_k = 5
    top_indices = np.argsort(predictions[0])[-top_k:][::-1]

    # Convert top_indices to a TensorFlow tensor
    top_indices_tensor = tf.convert_to_tensor(top_indices, dtype=tf.int32)

    # Use TensorFlow tensor for indexing
    top_scores = tf.gather(predictions[0], top_indices_tensor)

    return {
        "predicted_class": int(predicted_class),
        "top_k_predictions": [
            {"class_index": int(idx), "score": float(score)}
            for idx, score in zip(top_indices, top_scores)
        ],
    }
  except Exception as e:
    return {"error": str(e)}

Esegui lo script seguente per creare un carico di lavoro in cui vengono eseguiti i passaggi seguenti:

  • Crea Artifact Registry($PRIMUS_ARTIFACT_REGISTRY) di proprietà di Primus.
  • Aggiorna il codice del carico di lavoro con i nomi delle risorse richiesti.
  • Creare il carico di lavoro ML e il Dockerfile per creare un'immagine Docker del codice del carico di lavoro. Qui puoi trovare il Dockerfile utilizzato per questo codelab.
  • Crea e pubblica l'immagine Docker in Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) di proprietà di Primus.
  • Concedi a $WORKLOAD_SERVICEACCOUNT l'autorizzazione di lettura per $PRIMUS_ARTIFACT_REGISTRY. Questa operazione è necessaria affinché il container dei carichi di lavoro possa eseguire il pull dell'immagine Docker dei carichi di lavoro da Artifact Registry.
./create_workload.sh

Inoltre, i carichi di lavoro possono essere codificati per garantire che venga caricata la versione prevista del modello di machine learning controllando l'hash o la firma del modello prima di utilizzarlo. Il vantaggio di questi controlli aggiuntivi è che garantisce l'integrità del modello di machine learning. Con questo, l'operatore del carico di lavoro deve anche aggiornare l'immagine del carico di lavoro o i suoi parametri quando si prevede che il carico di lavoro utilizzi versioni diverse del modello ML.

4. Autorizza ed esegui carico di lavoro

Autorizza carico di lavoro

Primus vuole autorizzare i carichi di lavoro ad accedere al proprio modello di machine learning in base agli attributi delle seguenti risorse:

  • Cosa: il codice verificato
  • Dove: un ambiente sicuro
  • Chi: un operatore affidabile

Primus utilizza la federazione delle identità per i carichi di lavoro per applicare un criterio di accesso basato su questi requisiti. La federazione delle identità per i carichi di lavoro consente di specificare le condizioni degli attributi. Queste condizioni limitano le identità che possono autenticarsi con il pool di identità per i carichi di lavoro (in fase di elaborazione). Puoi aggiungere Attestation Verifier Service al WIP come provider di pool di identità per i carichi di lavoro per presentare le misurazioni e applicare il criterio.

Il pool di identità per i carichi di lavoro è già stato creato in precedenza durante il passaggio di configurazione delle risorse cloud. Ora Primus creerà un nuovo provider di pool di identità per i carichi di lavoro OIDC. L'elemento --attribute-condition specificato autorizza l'accesso al container del carico di lavoro. Richiede:

  • Cosa: l'ultimo $WORKLOAD_IMAGE_NAME caricato nel repository $PRIMUS_ARTIFACT_REPOSITORY.
  • Dove: l'ambiente di esecuzione attendibile di Confidential Space è in esecuzione sull'immagine VM Confidential Space VM completamente supportata.
  • Chi: account di servizio $WORKLOAD_SERVICE_ACCOUNT di Secundus.
export WORKLOAD_IMAGE_DIGEST=$(docker images digests ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}| awk 'NR>1{ print $3 }')
gcloud config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
  --issuer-uri="https://confidentialcomputing.googleapis.com/" \
  --allowed-audiences="https://sts.googleapis.com" \
  --attribute-mapping="google.subject='assertion.sub'" \
  --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' && 
'STABLE' in assertion.submods.confidential_space.support_attributes && 
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
 assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICEACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

Esegui carico di lavoro

Nell'ambito di questo passaggio, eseguiremo il carico di lavoro nella VM Confidential Space. Gli argomenti TEE obbligatori vengono passati utilizzando il flag dei metadati. Gli argomenti per il container dei carichi di lavoro vengono passati utilizzando "tee-cmd" della segnalazione. Il risultato dell'esecuzione del carico di lavoro verrà pubblicato in $SECUNDUS_RESULT_STORAGE_BUCKET.

gcloud config set project $SECUNDUS_PROJECT_ID
gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata  ^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}

Visualizza risultati

Una volta completato il carico di lavoro, il risultato del carico di lavoro ML verrà pubblicato in $SECUNDUS_RESULT_STORAGE_BUCKET.

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

Ecco alcuni esempi di come potrebbero presentarsi i risultati di inferenza sulle immagini di esempio:

Image: sample_image_1.jpeg, Response: {'predicted_class': 531, 'top_k_predictions': [{'class_index': 531, 'score': 12.08437442779541}, {'class_index': 812, 'score': 10.269512176513672}, {'class_index': 557, 'score': 9.202644348144531}, {'class_index': 782, 'score': 9.08737564086914}, {'class_index': 828, 'score': 8.912498474121094}]}

Image: sample_image_2.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 9.53619384765625}, {'class_index': 557, 'score': 7.928380966186523}, {'class_index': 783, 'score': 7.70129919052124}, {'class_index': 531, 'score': 7.611623287200928}, {'class_index': 906, 'score': 7.021416187286377}]}

Image: sample_image_3.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 6.09878396987915}, {'class_index': 447, 'score': 5.992854118347168}, {'class_index': 444, 'score': 5.9582319259643555}, {'class_index': 816, 'score': 5.502010345458984}, {'class_index': 796, 'score': 5.450454235076904}]}

Per ogni immagine di esempio in un bucket di archiviazione Secundus, visualizzerai una voce nei risultati. Questa voce includerà due informazioni chiave:

  • Indice di previsione_classe: si tratta di un indice numerico che rappresenta la classe a cui il modello prevede l'appartenenza dell'immagine.
  • Top_k_predictions: fornisce fino a k previsioni per l'immagine, classificate dalla più probabile alla meno probabile. Il valore k è impostato su 5 in questo codelab, ma puoi modificarlo nel codice del carico di lavoro per ottenere un numero maggiore o minore di previsioni.

Per tradurre l'indice del corso in un nome leggibile per il corso, consulta l'elenco delle etichette disponibile qui. Ad esempio, se l'indice di una classe è 2, corrisponde all'etichetta della classe "tench" nell'elenco delle etichette.

In questo codelab, abbiamo dimostrato che un modello di proprietà di Primus che viene rilasciato solo per il carico di lavoro in esecuzione in un TEE. Secundus esegue il carico di lavoro ML in un TEE e questo carico di lavoro è in grado di utilizzare il modello di proprietà di Primus, mentre Primus mantiene il controllo completo sul modello.

Esegui carico di lavoro non autorizzato

Secundus cambia l'immagine del carico di lavoro estraendo un'immagine del carico di lavoro diversa dal proprio repository di artefatti, che non è autorizzato da Primus. Il pool di identità per i carichi di lavoro di Primus ha autorizzato solo ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG immagine del carico di lavoro.

Esegui di nuovo il carico di lavoro

Quando Secundus tenterà di eseguire il carico di lavoro originale con questa nuova immagine del carico di lavoro, non riuscirà. Per visualizzare l'errore, elimina il file dei risultati originali e l'istanza VM, quindi riprova a eseguire il carico di lavoro.

Assicurati che sia presente una nuova immagine Docker pubblicata nell'Artifact Registry di Secundus (come us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}) e l'account di servizio del carico di lavoro ($WORKLOAD_SERVICEACCOUNT) ha concesso al lettore di Artifact Registry l'autorizzazione a leggere questa nuova immagine del carico di lavoro. Questo garantisce che il carico di lavoro non venga chiuso prima che il criterio in fase di elaborazione di Primus rifiuti il token presentato dal carico di lavoro.

Elimina un file dei risultati e un'istanza VM esistenti

  1. Imposta il progetto sul progetto $SECUNDUS_PROJECT_ID.
gcloud config set project $SECUNDUS_PROJECT_ID
  1. Elimina il file dei risultati.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
  1. Elimina l'istanza Confidential VM.
gcloud compute instances delete ${WORKLOAD_VM}

Esegui il carico di lavoro non autorizzato:

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \ 
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata  ^~^tee-image-reference=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}

Visualizza errore

Invece dei risultati del carico di lavoro, viene visualizzato un errore (The given credential is rejected by the attribute condition).

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

5. Esegui la pulizia

Qui puoi trovare lo script che può essere utilizzato per eseguire la pulizia delle risorse che abbiamo creato nell'ambito di questo codelab. Nell'ambito di questa pulizia, le seguenti risorse verranno eliminate:

  • Bucket di archiviazione di input di Primus ($PRIMUS_INPUT_STORAGE_BUCKET).
  • Account di servizio Primus ($PRIMUS_SERVICEACCOUNT).
  • Repository di artefatti di Primus ($PRIMUS_ARTIFACT_REPOSITORY).
  • Pool di identità per i carichi di lavoro Primus ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Account di servizio per i carichi di lavoro di Secundus ($WORKLOAD_SERVICEACCOUNT).
  • Bucket di archiviazione di input di Secundus ($SECUNDUS_INPUT_STORAGE_BUCKET).
  • delle istanze Compute dei carichi di lavoro.
  • Bucket di archiviazione dei risultati di Secundus ($SECUNDUS_RESULT_STORAGE_BUCKET).
$ ./cleanup.sh

Se hai terminato l'esplorazione, valuta la possibilità di eliminare il progetto.

  • Vai alla console di Cloud Platform.
  • Seleziona il progetto che vuoi chiudere e fai clic su "Elimina". in alto: in questo modo viene pianificata l'eliminazione del progetto

Passaggi successivi

Dai un'occhiata ad alcuni di questi codelab simili...