1. Omówienie
Przestrzeń poufna zapewnia bezpieczne środowisko do współpracy wielu użytkowników. Z tego ćwiczenia z programowania dowiesz się, jak korzystać z przestrzeni poufnej do ochrony poufnej własności intelektualnej, takiej jak modele uczenia maszynowego.
W tym ćwiczeniu w ramach Codelab użyjesz przestrzeni poufnej, aby umożliwić jednej firmie bezpieczne udostępnienie własnego modelu uczenia maszynowego innej firmie, która chce go wykorzystać. W szczególności firma Primus ma model uczenia maszynowego, który będzie udostępniany tylko do zadań wykonywanych w Confidential Space, co pozwoli jej zachować pełną kontrolę nad własnością intelektualną. Firma Secundus będzie operatorem zbioru zadań i będzie uruchamiać zbiór zadań uczenia maszynowego w poufnej przestrzeni. Secundus wczyta ten model i przeprowadzi wnioskowanie na podstawie przykładowych danych należących do Secundusa.
W tym przykładzie Primus jest autorem kodu obciążenia, który chce chronić swoją własność intelektualną przed niesprawdzonym operatorem obciążenia Secundus. Secundus to operator zadania systemów uczących się.
Czego się nauczysz
- Jak skonfigurować środowisko, w którym jedna ze stron może udostępnić swój zastrzeżony model uczenia maszynowego innej stronie bez utraty kontroli nad własnością intelektualną.
Czego potrzebujesz
- Projekt Google Cloud Platform
- Podstawowa znajomość Google Compute Engine ( codelab), poufnych maszyn wirtualnych, kontenerów i repozytoriów zdalnych.
- Podstawowa znajomość kont usługi, federacji tożsamości zadań i warunków atrybutów.
Role zaangażowane w konfigurowanie poufnego pokoju
W tym samouczku firma Primus jest właścicielem zasobu i autorem obciążenia, więc odpowiada za:
- Konfigurowanie wymaganych zasobów w chmurze za pomocą modelu systemu uczącego się
- Tworzenie kodu obciążenia
- Publikowanie obrazu zbioru zadań
- Konfigurowanie reguły Workload Identity Pool w celu ochrony modelu ML przed niesprawdzonym operatorem
Secundus Company będzie operatorem i będzie odpowiedzialna za:
- Konfigurowanie wymaganych zasobów w chmurze do przechowywania przykładowych obrazów używanych przez zadanie oraz wyników
- Wykonywanie zadań związanych z ML w Poufnej przestrzeni przy użyciu modelu udostępnionego przez Primus
Jak działa pokój poufny
Gdy uruchomisz zadanie w Poufnej przestrzeni, zostanie przeprowadzony następujący proces z wykorzystaniem skonfigurowanych zasobów:
- Zadanie wysyła do puli tożsamości zadań ogólny token dostępu Google dla
$PRIMUS_SERVICEACCOUNT
. Oferuje token usługi weryfikatora za pomocą oświadczenia o obciążeniu i środowisku. - Jeśli roszczenia dotyczące pomiaru obciążenia w tokenie usługi weryfikatora pasują do warunku atrybutu w WIP, zwraca token dostępu dla
$PRIMUS_SERVICEACCOUNT.
. - Zadanie korzysta z tokena dostępu konta usługi powiązanego z kontem
$PRIMUS_SERVICEACCOUNT
, aby uzyskać dostęp do modelu systemów uczących się przechowywanego w zasobniku$PRIMUS_INPUT_STORAGE_BUCKET
. - Zadania wykonują operację na danych należących do Secundusa, a te zadania są obsługiwane i uruchamiane przez Secundusa w jego projekcie.
- Zadania używają konta usługi
$WORKLOAD_SERVICEACCOUNT
do zapisywania wyników tej operacji w zasobniku$SECUNDUS_RESULT_STORAGE_BUCKET
.
2. Konfigurowanie zasobów Cloud
Zanim zaczniesz
- Skopiuj to repozytorium, używając tego polecenia, aby pobrać wymagane skrypty używane w tym samouczku.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- Zmień katalog tego Codelab.
cd confidential-space/codelabs/ml_model_protection/scripts
- Sprawdź, czy masz ustawione wymagane zmienne środowiskowe projektu, jak pokazano poniżej. Więcej informacji o konfigurowaniu projektu GCP znajdziesz w tym CodeLab. Więcej informacji o tym, jak pobrać identyfikator projektu i czym różni się on od nazwy i numeru projektu, znajdziesz tutaj.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus>
- Włącz płatności w swoich projektach.
- Włącz interfejs Confidential Computing API i te interfejsy API w obu projektach.
gcloud services enable \
cloudapis.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
iam.googleapis.com \
confidentialcomputing.googleapis.com
- Przypisz wartości do zmiennych dla nazw zasobów określonych powyżej, używając tego polecenia. Te zmienne umożliwiają dostosowanie nazw zasobów do potrzeb oraz korzystanie z dotychczasowych zasobów, jeśli zostały już utworzone. (np.
export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket'
)
- Te zmienne możesz ustawić za pomocą nazw istniejących zasobów w chmurze w projekcie Primus. Jeśli zmienna jest ustawiona, używane jest odpowiadające jej istniejące zasobów w chmurze z projektu Primus. Jeśli zmienna nie jest ustawiona, nazwa zasobu w chmurze zostanie wygenerowana na podstawie nazwy projektu, a nowy zasób w chmurze zostanie utworzony z tą nazwą. Oto obsługiwane zmienne nazw zasobów:
| Kosz, który przechowuje model systemu uczącego się Primus. |
| Pula tożsamości zadań (WIP) w Primus, która weryfikuje roszczenia. |
| Dostawca puli tożsamości zadań Primus, który zawiera warunek autoryzacji do użycia w przypadku tokenów podpisanych przez usługę Attestation Verifier. |
| Konto usługi Primus, którego |
| Repozytorium artefaktów, do którego zostanie przesłany obraz Dockera zadania. |
- Te zmienne możesz ustawić za pomocą nazw istniejących zasobów chmurowych w projekcie Secundus. Jeśli zmienna jest ustawiona, używane jest odpowiednie istniejące zasobów w chmurze z projektu Secundus. Jeśli zmienna nie jest ustawiona, nazwa zasobu w chmurze zostanie wygenerowana na podstawie nazwy projektu, a nowy zasób w chmurze zostanie utworzony z tą nazwą. Oto obsługiwane zmienne nazw zasobów:
| Zasobnik zawierający przykładowe obrazy, które Secundus chce sklasyfikować za pomocą modelu udostępnionego przez Primus. |
| Zasobnik, w którym są przechowywane wyniki zadania. |
| Nazwa obrazu kontenera zbioru zadań. |
| Tag obrazu kontenera zbioru zadań. |
| Konto usługi, które ma uprawnienia dostępu do maszyny wirtualnej poufnej, na której działa obciążenie. |
- W przypadku tych 2 projektów potrzebujesz pewnych uprawnień. Aby przyznać role uprawnień za pomocą konsoli GCP, zapoznaj się z tym przewodnikiem:
- Aby użyć funkcji
$PRIMUS_PROJECT_ID
, musisz mieć rolę administratora pamięci masowej, administratora rejestru artefaktów, administratora konta usługi oraz administratora pul tożsamości pracowników w Uprawnieniach. - Aby utworzyć
$SECUNDUS_PROJECT_ID
, musisz mieć rolę administratora Compute, administratora usługi Storage, administratora kont usługi, administratora pul tożsamości pracowników w Uprawnieniach oraz administratora zabezpieczeń (opcjonalnie). - Uruchom poniższy skrypt, aby ustawić pozostałe nazwy zmiennych na wartości oparte na identyfikatorze projektu.
source config_env.sh
Konfigurowanie zasobów firmy Primus
W ramach tego kroku skonfigurujesz wymagane zasoby chmury dla Primus. Aby skonfigurować zasoby dla Primus, uruchom ten skrypt. W ramach wykonywania skryptu zostaną utworzone te zasoby:
- Zasobnik Cloud Storage (
$PRIMUS_INPUT_STORAGE_BUCKET
) do przechowywania modelu systemów uczących się Primus. - puli tożsamości zadań (
$PRIMUS_WORKLOAD_IDENTITY_POOL
) do weryfikowania roszczeń na podstawie warunków atrybutów skonfigurowanych w dostawcy. - Konto usługi (
$PRIMUS_SERVICEACCOUNT
) przypisane do wspomnianego powyżej zbioru tożsamości zadań ($PRIMUS_WORKLOAD_IDENTITY_POOL
) z dostępem uprawnień IAM do odczytu danych z puli magazynu w chmurze (przy użyciu roliobjectViewer
) i do łączenia tego konta usługi z pulą tożsamości zadań (przy użyciu roliroles/iam.workloadIdentityUser
).
W ramach konfiguracji zasobów chmury użyjemy modelu TensorFlow. Możemy zapisać cały model, który zawiera architekturę modelu, wagi i konfigurację treningu, w archiwum ZIP. W tym samouczku użyjemy modelu MobileNet V1 wytrenowanego na zbiorze danych ImageNet, który znajdziesz tutaj.
./setup_primus_company_resources.sh
Wymieniony skrypt skonfiguruje zasób w chmurze. Teraz pobierzesz i opublikujesz model w zasośniku Cloud Storage utworzonym przez skrypt.
- Pobierz wytrenowany model tutaj.
- Po pobraniu zmień nazwę pobranego pliku tar na model.tar.gz.
- Opublikuj plik model.tar.gz w zasobniku Cloud Storage, wykonując podane niżej polecenie z katalogu zawierającego plik model.tar.gz.
gsutil cp model.tar.gz gs://${PRIMUS_INPUT_STORAGE_BUCKET}/
Konfigurowanie zasobów firmy Secundus
W ramach tego kroku skonfigurujesz wymagane zasoby w chmurze dla Secundusa. Aby skonfigurować zasoby dla Secundusa, uruchom ten skrypt. W ramach tych czynności zostaną utworzone te zasoby:
- Zasobnik Cloud Storage (
$SECUNDUS_INPUT_STORAGE_BUCKET
) do przechowywania przykładowych obrazów do wykonywania przez Secundus wnioskowań. - Zasobnik Cloud Storage (
$SECUNDUS_RESULT_STORAGE_BUCKET
) do przechowywania wyniku wykonania zbioru zadań ML przez Secundus.
W tym celu udostępniliśmy tutaj kilka przykładowych obrazów.
./setup_secundus_company_resources.sh
3. Tworzenie zadań
Tworzenie konta usługi dotyczącego obciążenia
Teraz utwórz konto usługi dla zadania z wymaganymi rolami i uprawnieniami. Uruchom ten skrypt, aby utworzyć konto usługi obciążenia w projekcie Secundus. To konto usługi będzie używane przez maszynę wirtualną, na której działa obciążenie związane z ML.
To konto usługi zadania ($WORKLOAD_SERVICEACCOUNT
) będzie mieć przypisane te role:
confidentialcomputing.workloadUser
, aby uzyskać token atestacjilogging.logWriter
, aby zapisywać logi w Cloud Logging.objectViewer
do odczytu danych z zasobnika chmury$SECUNDUS_INPUT_STORAGE_BUCKET
.objectUser
, aby zapisać wyniki zbioru zadań w zasobniku Cloud Storage$SECUNDUS_RESULT_STORAGE_BUCKET
.
./create_workload_service_account.sh
Tworzenie zbioru zadań
W ramach tego kroku utworzysz obraz Dockera zadania. Zadania będą tworzone przez Primus. Zadanie użyte w tym laboratorium kodu to kod Pythona do uczenia maszynowego, który uzyskuje dostęp do modelu ML przechowywanego w zasobniku Primus i wykonuje wnioskowanie na podstawie przykładowych obrazów przechowywanych w zasobniku.
Model systemów uczących się przechowywany w zasobniku Primus byłby dostępny tylko dla zadań spełniających wymagane warunki atrybutów. Warunki atrybutów są opisane bardziej szczegółowo w następnej sekcji dotyczącej autoryzacji obciążenia.
Oto metoda run_inference() z workloadu, która zostanie utworzona i użyta w tym ćwiczeniu z programowania. Cały kod obciążenia znajdziesz tutaj.
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)}
Uruchom ten skrypt, aby utworzyć zadanie, w ramach którego wykonywane są te czynności:
- Utwórz Artifact Registry(
$PRIMUS_ARTIFACT_REGISTRY
) należącą do Primus. - Zaktualizuj kod zbioru zadań, podając nazwy wymaganych zasobów.
- Utwórz zadanie uczenia maszynowego i plik Dockerfile, aby skompilować obraz Dockera z kodem zadania. Tutaj znajduje się plik Dockerfile użyty w tym ćwiczeniu.
- Skompiluj i opublikuj obraz Dockera w repozytorium Artifact Registry (
$PRIMUS_ARTIFACT_REGISTRY
) należącym do Primus. - Przyznaj usłudze
$WORKLOAD_SERVICEACCOUNT
uprawnienie do odczytu w przypadku usługi$PRIMUS_ARTIFACT_REGISTRY
. Jest to konieczne, aby kontener zadania pobierał obraz Dockera zadania z rejestru artefaktów.
./create_workload.sh
Dodatkowo można zakodować obciążenia, aby upewnić się, że wczytują one oczekiwaną wersję modelu uczenia maszynowego. Można to zrobić, sprawdzając hasz lub podpis modelu przed jego użyciem. Zaletą takich dodatkowych kontroli jest to, że zapewniają one integralność modelu systemów uczących się. W takim przypadku operator zadania musiałby też zaktualizować obraz zadania lub jego parametry, gdy zadanie ma używać różnych wersji modelu ML.
4. Autoryzowanie i uruchamianie zbioru zadań
Autoryzowanie zbioru zadań
Firma Primus chce autoryzować obciążenia, aby uzyskały dostęp do modelu systemów uczących się na podstawie atrybutów tych zasobów:
- Co: kod, który został zweryfikowany
- Gdzie: środowisko, które jest bezpieczne
- Kto: zaufany operator
Primus używa federacji tożsamości zadań, aby egzekwować zasady dostępu na podstawie tych wymagań. Federacja tożsamości zadań umożliwia określenie warunków atrybutów. Te warunki ograniczają tożsamości, które mogą uwierzytelniać się w puli tożsamości zadań (WIP). Aby przedstawić pomiary i wdrożyć zasady, możesz dodać usługę weryfikatora autentyczności do puli WIP jako dostawcę puli tożsamości zadań.
Pula tożsamości zadań została już utworzona wcześniej w ramach kroku konfiguracji zasobów w chmurze. Teraz Primus utworzy nowego dostawcę puli tożsamości zadań OIDC. Określony --attribute-condition
autoryzuje dostęp do kontenera zbioru zadań. Wymagania:
- Co: najnowsze
$WORKLOAD_IMAGE_NAME
przesłane do repozytorium$PRIMUS_ARTIFACT_REPOSITORY
. - Gdzie: zaufane środowisko wykonawcze Poufnej przestrzeni działa na w pełni obsługiwanym obrazie maszyny wirtualnej Poufnej przestrzeni.
- Kto: konto usługi Secundus
$WORKLOAD_SERVICE_ACCOUNT
.
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
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"
Uruchamianie zadania
Na tym etapie uruchamiamy zadanie w maszynie wirtualnej w Poufnej przestrzeni. Wymagane argumenty TEE są przekazywane za pomocą flagi metadanych. Argumenty dla kontenera zbioru zadań są przekazywane za pomocą części flagi „tee-cmd
”. Wynik wykonania zbioru zadań zostanie opublikowany w $SECUNDUS_RESULT_STORAGE_BUCKET
.
gcloud compute instances create ${WORKLOAD_VM} \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--project=${SECUNDUS_PROJECT_ID} \
--maintenance-policy=MIGRATE \
--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}
Wyświetl wyniki
Po zakończeniu przetwarzania wyniki zostaną opublikowane w $SECUNDUS_RESULT_STORAGE_BUCKET
.
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
Oto kilka przykładów tego, jak mogą wyglądać wyniki wnioskowania na przykładowych obrazach:
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}]}
W wynikach zobaczysz wpis dla każdego przykładowego obrazu w zasobach Secundus. Ten wpis będzie zawierać 2 kluczowe informacje:
- Indeks predicted_class: to numeryczny indeks reprezentujący klasę, do której model przewiduje, że należy obraz.
- Top_k_predictions: zawiera do k prognoz dla obrazu, uszeregowanych od najbardziej do najmniej prawdopodobnych. W tym CodeLab wartość k jest ustawiona na 5, ale możesz ją dostosować w kodzie zadania, aby uzyskać więcej lub mniej prognoz.
Aby przetłumaczyć indeks klasy na czytelną nazwę klasy, zapoznaj się z listą dostępnych etykiet tutaj. Jeśli na przykład widzisz indeks klasy 2, odpowiada on etykiecie klasy „tench” na liście etykiet.
W tym CodeLab pokazujemy, że model należący do Primus jest udostępniany tylko do zadań wykonywanych w ramach TEE. Secundus wykonuje zadanie związane z ML w ramach TEE, a to zadanie może korzystać z modelu należącego do Primus, przy czym Primus zachowuje pełną kontrolę nad modelem.
Uruchamianie nieautoryzowanego zbioru zadań
Secundus zmienia obraz zadania, pobierając inny obraz zadania z własnego repozytorium artefaktów, które nie jest autoryzowane przez Primus. Pula tożsamości zadań Primus ma autoryzowane tylko ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG
Workload image.
Ponownie uruchom zadanie
Gdy Secundus spróbuje uruchomić pierwotny zbiór zadań za pomocą tego nowego obrazu zbioru zadań, nie uda mu się to. Aby wyświetlić błąd, usuń oryginalny plik wyników i instancję maszyny wirtualnej, a następnie spróbuj ponownie uruchomić obciążenie.
Upewnij się, że nowy obraz Dockera został opublikowany w rejestrze artefaktów Secundus (jako us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}
), a konto usługi workload ($WORKLOAD_SERVICEACCOUNT
) przyznało czytnikowi rejestru artefaktów uprawnienia do odczytu tego nowego obrazu workload. Dzięki temu zadanie nie zostanie zamknięte, zanim polityka WIP usługi Primus odrzuci token przedstawiony przez to zadanie.
Usuwanie istniejącego pliku wyników i instancji maszyny wirtualnej
- Ustaw projekt jako projekt
$SECUNDUS_PROJECT_ID
.
gcloud config set project $SECUNDUS_PROJECT_ID
- Usuń plik z wynikami.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
- Usuń poufną maszynę wirtualną.
gcloud compute instances delete ${WORKLOAD_VM} --zone=${SECUNDUS_PROJECT_ZONE}
Uruchamianie nieautoryzowanego zadania:
gcloud compute instances create ${WORKLOAD_VM} \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=MIGRATE \
--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=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}
Wyświetl błąd
Zamiast wyników zadań zobaczysz błąd (The given credential is rejected by the attribute condition
).
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
5. Czyszczenie
Tutaj znajdziesz skrypt, który możesz wykorzystać do wyczyszczenia zasobów utworzonych w ramach tego ćwiczenia. W ramach tego czyszczenia zostaną usunięte te zasoby:
- Zasobnik wejściowy Primus (
$PRIMUS_INPUT_STORAGE_BUCKET)
). - Konto usługi Primus (
$PRIMUS_SERVICEACCOUNT
). - Repozytorium artefaktów Primus (
$PRIMUS_ARTIFACT_REPOSITORY
). - Pula tożsamości zadań Primus (
$PRIMUS_WORKLOAD_IDENTITY_POOL
). - Konto usługi Workload Managera Secundus (
$WORKLOAD_SERVICEACCOUNT
). - Wpisz zasobnik danych Secundus (
$SECUNDUS_INPUT_STORAGE_BUCKET)
). - Instancje obliczeniowe zbioru zadań.
- Zasobnik na dane Secundus (
$SECUNDUS_RESULT_STORAGE_BUCKET
).
$ ./cleanup.sh
Gdy skończysz eksplorować, możesz usunąć projekt.
- Otwórz konsolę Cloud Platform.
- Wybierz projekt, który chcesz wyłączyć, a potem u góry kliknij „Usuń”. Spowoduje to zaplanowanie usunięcia projektu.
Co dalej?
Sprawdź te podobne laboratoria programistyczne…