1. Обзор
Confidential Space предлагает безопасную среду для сотрудничества между несколькими сторонами. В этой лаборатории кода показано, как можно использовать конфиденциальное пространство для защиты конфиденциальной интеллектуальной собственности, например моделей машинного обучения.
В этой лаборатории кода вы будете использовать Конфиденциальное пространство, чтобы одна компания могла безопасно поделиться своей собственной моделью машинного обучения с другой компанией, которая хотела бы использовать эту модель. В частности, у компании Primus есть модель машинного обучения, которая будет использоваться только для рабочей нагрузки, работающей в конфиденциальном пространстве, что позволяет Primus сохранять полный контроль над своей интеллектуальной собственностью. Компания Secundus будет оператором рабочей нагрузки и будет запускать рабочую нагрузку машинного обучения в конфиденциальном пространстве. Secundus загрузит эту модель и выполнит вывод, используя образцы данных, принадлежащие Secundus.
Здесь Primus является автором рабочей нагрузки, который создает код рабочей нагрузки, и соавтором, который хочет защитить свою интеллектуальную собственность от ненадежного оператора рабочей нагрузки Secundus. Secundus — это оператор рабочей нагрузки машинного обучения.
Что вы узнаете
- Как настроить среду, в которой одна сторона может делиться своей собственной моделью машинного обучения с другой стороной, не теряя контроля над своей интеллектуальной собственностью.
Что вам понадобится
- Проект облачной платформы Google
- Базовые знания Google Compute Engine ( codelab ), конфиденциальной виртуальной машины , контейнеров и удаленных репозиториев.
- Базовые знания об учетных записях служб , федерации идентификации рабочей нагрузки и условиях атрибутов .
Роли, участвующие в настройке конфиденциального пространства
В этой кодовой лаборатории компания Primus будет владельцем ресурса и автором рабочей нагрузки, который будет отвечать за следующее:
- Настройка необходимых облачных ресурсов с помощью модели машинного обучения
- Написание кода рабочей нагрузки
- Публикация образа рабочей нагрузки
- Настройка политики пула удостоверений рабочей нагрузки для защиты модели ML от ненадежного оператора
Компания Secundus будет оператором и будет нести ответственность за:
- Настройка необходимых облачных ресурсов для хранения образцов изображений, используемых рабочей нагрузкой, и результатов.
- Запуск рабочей нагрузки машинного обучения в конфиденциальном пространстве с использованием модели, предоставленной Primus.
Как работает конфиденциальное пространство
При запуске рабочей нагрузки в конфиденциальном пространстве происходит следующий процесс с использованием настроенных ресурсов:
- Рабочая нагрузка запрашивает общий токен доступа Google для
$PRIMUS_SERVICEACCOUNT
из пула идентификаторов рабочей нагрузки . Он предлагает сервисный токен Attestation Verifier с утверждениями о рабочей нагрузке и среде. - Если утверждения измерения рабочей нагрузки в сервисном токене средства проверки аттестации соответствуют условию атрибута в незавершенном документе, он возвращает токен доступа для
$PRIMUS_SERVICEACCOUNT.
- Рабочая нагрузка использует токен доступа к учетной записи службы, связанный с
$PRIMUS_SERVICEACCOUNT
для доступа к модели машинного обучения, хранящейся в сегменте$PRIMUS_INPUT_STORAGE_BUCKET
. - Рабочая нагрузка выполняет операцию с данными, принадлежащими Secundus, и эта рабочая нагрузка управляется и запускается Secundus в своем проекте.
- Рабочая нагрузка использует учетную запись службы
$WORKLOAD_SERVICEACCOUNT
для записи результатов этой операции в корзину$SECUNDUS_RESULT_STORAGE_BUCKET
.
2. Настройте облачные ресурсы
Прежде чем начать
- Клонируйте этот репозиторий с помощью приведенной ниже команды, чтобы получить необходимые скрипты, которые используются как часть этой лаборатории кода.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- Измените каталог для этой лаборатории кода.
cd confidential-space/codelabs/ml_model_protection/scripts
- Убедитесь, что вы установили необходимые переменные среды проекта, как показано ниже. Дополнительную информацию о настройке проекта GCP можно найти в этой кодовой лаборатории . Вы можете обратиться к этому, чтобы получить подробную информацию о том, как получить идентификатор проекта и чем он отличается от имени проекта и номера проекта.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus>
- Включите биллинг для своих проектов.
- Включите API конфиденциальных вычислений и следующие API для обоих проектов.
gcloud services enable \
cloudapis.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
iam.googleapis.com \
confidentialcomputing.googleapis.com
- Присвойте значения переменным для имен ресурсов, указанных выше, с помощью следующей команды. Эти переменные позволяют вам настраивать имена ресурсов по мере необходимости, а также использовать существующие ресурсы, если они уже созданы. (например
export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket'
)
- Вы можете установить следующие переменные с существующими именами облачных ресурсов в проекте Primus. Если переменная установлена, то будет использоваться соответствующий существующий облачный ресурс из проекта Primus. Если переменная не установлена, имя облачного ресурса будет сгенерировано из имени проекта, и новый облачный ресурс будет создан с этим именем. Ниже приведены поддерживаемые переменные для имен ресурсов:
| Корзина, в которой хранится модель машинного обучения Primus. |
| Пул идентификации рабочей нагрузки (WIP) Primus, который проверяет утверждения. |
| Поставщик пула удостоверений рабочей нагрузки Primus, который включает условие авторизации, используемое для токенов, подписанных службой проверки аттестации. |
| Учетная запись службы Primus, которую |
| Репозиторий артефактов, куда будет помещен образ Docker рабочей нагрузки. |
- Вы можете установить следующие переменные с существующими именами облачных ресурсов в проекте Secundus. Если переменная установлена, то будет использоваться соответствующий существующий облачный ресурс из проекта Secundus. Если переменная не установлена, имя облачного ресурса будет сгенерировано из имени проекта, и новый облачный ресурс будет создан с этим именем. Ниже приведены поддерживаемые переменные для имен ресурсов:
| Корзина, в которой хранятся образцы изображений, которые Secundus хотел бы классифицировать, используя модель, предоставленную Primus. |
| Бакет, в котором хранятся результаты рабочей нагрузки. |
| Имя образа контейнера рабочей нагрузки. |
| Тег образа контейнера рабочей нагрузки. |
| Учетная запись службы, имеющая разрешение на доступ к конфиденциальной виртуальной машине, на которой выполняется рабочая нагрузка. |
- Вам потребуются определенные разрешения для этих двух проектов, и вы можете обратиться к этому руководству , чтобы узнать, как предоставить роли IAM с помощью консоли GCP:
- Для
$PRIMUS_PROJECT_ID
вам понадобится администратор хранилища, администратор реестра артефактов, администратор учетной записи службы, администратор пула удостоверений рабочей нагрузки IAM. - Для
$SECUNDUS_PROJECT_ID
вам потребуется администратор вычислений, администратор хранилища, администратор учетной записи службы, администратор пула удостоверений рабочей нагрузки IAM, администратор безопасности (необязательно). - Запустите следующий сценарий , чтобы задать для остальных имен переменных значения, основанные на идентификаторе вашего проекта для имен ресурсов.
source config_env.sh
Настройка ресурсов компании Primus
В рамках этого шага вы настроите необходимые облачные ресурсы для Primus. Запустите следующий сценарий , чтобы настроить ресурсы для Primus. Следующие ресурсы будут созданы в ходе выполнения скрипта:
- Ведро облачного хранилища (
$PRIMUS_INPUT_STORAGE_BUCKET
) для хранения модели машинного обучения Primus. - Пул идентификации рабочей нагрузки (
$PRIMUS_WORKLOAD_IDENTITY_POOL
) для проверки утверждений на основе условий атрибутов, настроенных в рамках его поставщика. - Учетная запись службы (
$PRIMUS_SERVICEACCOUNT
), прикрепленная к вышеупомянутому пулу идентификаторов рабочей нагрузки ($PRIMUS_WORKLOAD_IDENTITY_POOL
), с доступом к IAM для чтения данных из сегмента облачного хранилища (с использованием ролиobjectViewer
) и для подключения этой учетной записи службы к пулу идентификации рабочей нагрузки (с использованиемroles/iam.workloadIdentityUser
рольroles/iam.workloadIdentityUser
).
В рамках настройки облачных ресурсов мы будем использовать модель TensorFlow. Мы можем сохранить всю модель, включая ее архитектуру, веса и конфигурацию обучения, в ZIP-архиве. Для целей этой кодовой лаборатории мы будем использовать модель MobileNet V1, обученную на наборе данных ImageNet, который можно найти здесь .
./setup_primus_company_resources.sh
Вышеупомянутый скрипт настроит облачный ресурс, теперь мы загрузим и опубликуем модель в корзину Cloud Storage, созданную сценарием.
- Загрузите предварительно обученную модель отсюда .
- После загрузки переименуйте загруженный файл tar в model.tar.gz .
- Опубликуйте файл model.tar.gz в сегменте Cloud Storage, используя следующую команду из каталога, содержащего файл model.tar.gz .
gsutil cp model.tar.gz gs://${PRIMUS_INPUT_STORAGE_BUCKET}/
Настройка ресурсов компании Secundus
В рамках этого шага вы настроите необходимые облачные ресурсы для Secundus. Запустите следующий сценарий , чтобы настроить ресурсы для Secundus. В рамках этих шагов будут созданы следующие ресурсы:
- Облачное хранилище (
$SECUNDUS_INPUT_STORAGE_BUCKET
) для хранения примеров изображений для выполнения выводов с помощью Secundus. - Контейнер облачного хранилища (
$SECUNDUS_RESULT_STORAGE_BUCKET
) для хранения результатов выполнения рабочей нагрузки ML компанией Secundus.
Некоторые примеры изображений для этой лаборатории кода доступны здесь .
./setup_secundus_company_resources.sh
3. Создайте рабочую нагрузку
Создать учетную запись службы рабочей нагрузки
Теперь вы создадите учетную запись службы для рабочей нагрузки с необходимыми ролями и разрешениями. Запустите следующий сценарий , чтобы создать учетную запись службы рабочей нагрузки в проекте Secundus. Эта учетная запись службы будет использоваться виртуальной машиной, на которой выполняется рабочая нагрузка ML.
Эта учетная запись службы рабочей нагрузки ( $WORKLOAD_SERVICEACCOUNT
) будет иметь следующие роли:
-
confidentialcomputing.workloadUser
для получения токена аттестации -
logging.logWriter
для записи журналов в Cloud Logging. -
objectViewer
для чтения данных из сегмента облачного хранилища$SECUNDUS_INPUT_STORAGE_BUCKET
. -
objectUser
для записи результата рабочей нагрузки в корзину облачного хранилища$SECUNDUS_RESULT_STORAGE_BUCKET
.
./create_workload_service_account.sh
Создать рабочую нагрузку
В рамках этого шага вы создадите образ Docker для рабочей нагрузки. Автором рабочей нагрузки будет Primus. Рабочая нагрузка, используемая в этой лаборатории кода, — это код Python для машинного обучения, который обращается к модели машинного обучения, хранящейся в сегменте хранилища Primus, и выполняет выводы с использованием образцов изображений, которые хранятся в сегменте хранилища.
Модель машинного обучения, хранящаяся в хранилище Primus, будет доступна только для рабочих нагрузок, соответствующих требуемым условиям атрибутов. Эти условия атрибутов более подробно описаны в следующем разделе, посвященном авторизации рабочей нагрузки.
Вот метод run_inference() рабочей нагрузки, который будет создан и использован в этой лаборатории кода. Полный код рабочей нагрузки вы можете найти здесь .
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)}
Запустите следующий сценарий , чтобы создать рабочую нагрузку, в которой выполняются следующие шаги:
- Создайте реестр артефактов (
$PRIMUS_ARTIFACT_REGISTRY
), принадлежащий Primus. - Обновите код рабочей нагрузки, указав необходимые имена ресурсов.
- Создайте рабочую нагрузку ML и создайте Dockerfile для создания образа Docker кода рабочей нагрузки. Вот Dockerfile, используемый для этой лаборатории кода.
- Создайте и опубликуйте образ Docker в реестре артефактов (
$PRIMUS_ARTIFACT_REGISTRY
), принадлежащем Primus. - Предоставьте
$WORKLOAD_SERVICEACCOUNT
разрешение на чтение для$PRIMUS_ARTIFACT_REGISTRY
. Это необходимо, чтобы контейнер рабочей нагрузки извлекал образ Docker рабочей нагрузки из реестра артефактов.
./create_workload.sh
Кроме того, рабочие нагрузки можно закодировать так, чтобы гарантировать загрузку ожидаемой версии модели машинного обучения, проверив хэш или подпись модели перед ее использованием. Преимущество таких дополнительных проверок в том, что они обеспечивают целостность модели машинного обучения. При этом оператору рабочей нагрузки также потребуется обновить образ рабочей нагрузки или его параметры, если ожидается, что рабочая нагрузка будет использовать разные версии модели ML.
4. Авторизация и запуск рабочей нагрузки
Авторизовать рабочую нагрузку
Primus хочет разрешить рабочим нагрузкам доступ к своей модели машинного обучения на основе атрибутов следующих ресурсов:
- Что : Код, который проверен
- Где : Безопасная среда.
- Кто : оператор, которому доверяют
Primus использует федерацию удостоверений рабочей нагрузки для реализации политики доступа, основанной на этих требованиях. Объединение удостоверений рабочей нагрузки позволяет указывать условия атрибутов . Эти условия ограничивают то, какие удостоверения могут проходить проверку подлинности с помощью пула удостоверений рабочей нагрузки (WIP) . Вы можете добавить службу проверки аттестации в НЗП в качестве поставщика пула удостоверений рабочей нагрузки для представления измерений и обеспечения соблюдения политики.
Пул идентификации рабочей нагрузки уже был создан ранее на этапе настройки облачных ресурсов. Теперь Primus создаст нового поставщика пула идентификации рабочей нагрузки OIDC. Указанное --attribute-condition
разрешает доступ к контейнеру рабочей нагрузки. Это требует:
- Что : Последняя версия
$WORKLOAD_IMAGE_NAME
загружена в репозиторий$PRIMUS_ARTIFACT_REPOSITORY
. - Где : доверенная среда выполнения Confidential Space работает на полностью поддерживаемом образе виртуальной машины Confidential Space.
- Кто : Сервисный аккаунт Secundus
$WORKLOAD_SERVICE_ACCOUNT
.
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"
Запустить рабочую нагрузку
В рамках этого шага мы будем запускать рабочую нагрузку на виртуальной машине конфиденциального пространства. Обязательные аргументы TEE передаются с использованием флага метаданных . Аргументы для контейнера рабочей нагрузки передаются с использованием части флага « tee-cmd
». Результат выполнения рабочей нагрузки будет опубликован в $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}
Посмотреть результаты
После успешного завершения рабочей нагрузки результат рабочей нагрузки ML будет опубликован в $SECUNDUS_RESULT_STORAGE_BUCKET
.
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
Вот несколько примеров того, как могут выглядеть результаты вывода на образцах изображений:
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}]}
Для каждого образца изображения в сегменте хранилища Secundus вы увидите запись в результатах. Эта запись будет включать в себя две ключевые части информации:
- Индекс предсказанного_класса: это числовой индекс, представляющий класс, к которому, по прогнозам модели, принадлежит изображение.
- Top_k_predictions: предоставляет до k прогнозов для изображения, ранжированных от наиболее вероятного к наименее вероятному. В этой лаборатории кода значение k установлено равным 5, но вы можете настроить его в коде рабочей нагрузки, чтобы получить больше или меньше прогнозов.
Чтобы перевести индекс класса в удобочитаемое имя класса, обратитесь к списку меток, доступному здесь . Например, если вы видите индекс класса 2, это соответствует метке класса «линь» в списке меток.
В этой лаборатории кода мы продемонстрировали, что модель, принадлежащая Primus, выпускается только для рабочей нагрузки, работающей в TEE. Secundus запускает рабочую нагрузку ML в TEE, и эта рабочая нагрузка может использовать модель, принадлежащую Primus, в то время как Primus сохраняет полный контроль над моделью.
Запуск несанкционированной рабочей нагрузки
Secundus меняет образ рабочей нагрузки, извлекая другой образ рабочей нагрузки из собственного хранилища артефактов, не авторизованного Primus. Пул идентификации рабочей нагрузки Primus авторизовал только ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG
Образ рабочей нагрузки.
Перезапустите рабочую нагрузку
Когда Secundus попытается запустить исходную рабочую нагрузку с этим новым образом рабочей нагрузки, это не удастся. Чтобы просмотреть ошибку, удалите исходный файл результатов и экземпляр виртуальной машины, а затем попробуйте снова запустить рабочую нагрузку.
Убедитесь, что в реестре артефактов Secundus опубликован новый образ Docker (как us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}
) и учетная запись службы рабочей нагрузки ( $WORKLOAD_SERVICEACCOUNT
) предоставил средству чтения реестра артефактов разрешение на чтение этого нового образа рабочей нагрузки. Это необходимо для того, чтобы рабочая нагрузка не завершилась до того, как политика WIP Primus отклонит токен, представленный рабочей нагрузкой.
Удалить существующий файл результатов и экземпляр виртуальной машины.
- Установите проект
$SECUNDUS_PROJECT_ID
.
gcloud config set project $SECUNDUS_PROJECT_ID
- Удалите файл результатов.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
- Удалите экземпляр конфиденциальной виртуальной машины.
gcloud compute instances delete ${WORKLOAD_VM}
Запустите несанкционированную рабочую нагрузку:
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}
Посмотреть ошибку
Вместо результатов рабочей нагрузки вы видите ошибку ( The given credential is rejected by the attribute condition
).
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
5. Очистка
Вот сценарий, который можно использовать для очистки ресурсов, которые мы создали в рамках этой лаборатории кода. В рамках этой очистки будут удалены следующие ресурсы:
- Входной сегмент памяти Primus (
$PRIMUS_INPUT_STORAGE_BUCKET)
. - Сервисный аккаунт Primus (
$PRIMUS_SERVICEACCOUNT
). - Репозиторий артефактов Primus (
$PRIMUS_ARTIFACT_REPOSITORY
). - Пул идентификации рабочей нагрузки Primus (
$PRIMUS_WORKLOAD_IDENTITY_POOL
). - Учетная запись службы рабочей нагрузки Secundus (
$WORKLOAD_SERVICEACCOUNT
). - Входной сегмент хранилища Secundus (
$SECUNDUS_INPUT_STORAGE_BUCKET)
. - Экземпляры вычислений рабочей нагрузки.
- Сегмент хранения результатов Secundus (
$SECUNDUS_RESULT_STORAGE_BUCKET
).
$ ./cleanup.sh
Если вы закончили изучение, рассмотрите возможность удаления проекта.
- Перейдите в консоль облачной платформы.
- Выберите проект, который хотите закрыть, затем нажмите «Удалить» вверху: это запланирует удаление проекта.
Что дальше?
Посмотрите некоторые из этих похожих лабораторий кода...