1. Обзор
В ходе этой лабораторной работы вы интегрируете бессерверные базы данных (Spanner и Firestore) с приложениями (Go и Node.js), работающими в Cloud Run. Приложение Cymbal Eats включает в себя несколько сервисов, которые работают в Cloud Run. На следующих шагах вы настроите службы для использования реляционной базы данных Cloud Spanner и Cloud Firestore — базы данных документов NoSQL. Использование бессерверных продуктов для уровня данных и среды выполнения приложений позволяет абстрагировать все управление инфраструктурой, сосредоточившись на создании приложения, а не на накладных расходах.
2. Чему вы научитесь
В этой лабораторной работе вы научитесь делать следующее:
- Интегрировать гаечный ключ
- Включить управляемые службы Spanner
- Интеграция в код
- Развертывание кода подключения к Spanner
- Интегрируйте Firestore
- Включить управляемые службы Firestore
- Интеграция в код
- Развертывание кода для подключения к Firestore
3. Настройка и требования
Самостоятельная настройка среды
- Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .
- Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы всегда можете обновить его.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (невозможно изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно идентифицируемый как
PROJECT_ID
). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Альтернативно, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага и он сохраняется на протяжении всего проекта. - К вашему сведению, есть третье значение — номер проекта , которое используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
- Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не будет стоить много, если вообще что-то стоить. Чтобы отключить ресурсы и избежать выставления счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .
Среда установки
- Создайте переменную идентификатора проекта
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export SPANNER_INSTANCE=inventory-instance
export SPANNER_DB=inventory-db
export REGION=us-east1
export SPANNER_CONNECTION_STRING=projects/$PROJECT_ID/instances/$SPANNER_INSTANCE/databases/$SPANNER_DB
- Включите API-интерфейсы Spanner, Cloud Run, Cloud Build и Artifact Registry.
gcloud services enable \
compute.googleapis.com \
spanner.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
firestore.googleapis.com \
appengine.googleapis.com \
artifactregistry.googleapis.com
- Клонировать репозиторий
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
- Перейдите в каталог
cd cymbal-eats/inventory-service/spanner
4. Создайте и настройте экземпляр Spanner.
Spanner — это реляционная база данных серверной службы инвентаризации. Вы создадите экземпляр, базу данных и схему Spanner, выполнив следующие шаги.
Создать экземпляр
- Создайте экземпляр Cloud Spanner
gcloud spanner instances create $SPANNER_INSTANCE --config=regional-${REGION} \
--description="Cymbal Menu Inventory" --nodes=1
Пример вывода
Creating instance...done.
- Проверьте, правильно ли настроен экземпляр Spanner.
gcloud spanner instances list
Пример вывода
NAME: inventory-instance DISPLAY_NAME: Cymbal Menu Inventory CONFIG: regional-us-east1 NODE_COUNT: 1 PROCESSING_UNITS: 100 STATE: READY
Создайте базу данных и схему
Создайте новую базу данных и используйте стандартный язык определения данных SQL (DDL) Google для создания схемы базы данных.
- Создать файл DDL
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
- Создайте базу данных гаечных ключей
gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl-file=table.ddl
Пример вывода
Creating database...done.
Проверка состояния и схемы базы данных
- Просмотр состояния базы данных
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE
Пример вывода
createTime: '2022-04-22T15:11:33.559300Z' databaseDialect: GOOGLE_STANDARD_SQL earliestVersionTime: '2022-04-22T15:11:33.559300Z' encryptionInfo: - encryptionType: GOOGLE_DEFAULT_ENCRYPTION name: projects/cymbal-eats-7-348013/instances/menu-inventory/databases/menu-inventory state: READY versionRetentionPeriod: 1h
- Посмотреть схему базы данных
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE
Пример вывода
CREATE TABLE InventoryHistory ( ItemRowID STRING(36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, TimeStamp TIMESTAMP, ) PRIMARY KEY(ItemRowID);
5. Интеграция гаечного ключа
В этом разделе вы узнаете, как интегрировать Spanner в ваше приложение. Кроме того, SQL Spanner предоставляет Клиентские библиотеки , драйверы JDBC , драйверы R2DBC , API REST и API RPC , которые позволяют интегрировать Spanner в любое приложение.
В следующем разделе вы будете использовать клиентскую библиотеку Go для установки, аутентификации и изменения данных в Spanner.
Установка клиентской библиотеки
Клиентская библиотека Cloud Spanner упрощает интеграцию с Cloud Spanner, автоматически используя учетные данные приложения по умолчанию (ADC) для поиска учетных данных вашей сервисной учетной записи.
Настройка аутентификации
Google Cloud CLI и клиентские библиотеки Google Cloud автоматически определяют, когда они работают в Google Cloud, и используют учетную запись службы среды выполнения текущей версии Cloud Run. Эта стратегия называется «Учетные данные приложения по умолчанию» и обеспечивает переносимость кода в нескольких средах.
Однако лучше всего создать выделенное удостоверение, назначив ему управляемую пользователем учетную запись службы вместо учетной записи службы по умолчанию.
- Предоставьте роль администратора базы данных Spanner сервисной учетной записи.
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"
Пример вывода
Updated IAM policy for project [cymbal-eats-6422-3462]. [...]
Использование клиентских библиотек
Клиентские библиотеки Spanner абстрагируют сложности интеграции со Spanner и доступны на многих популярных языках программирования.
Создать клиент Spanner
Клиент Spanner — это клиент для чтения и записи данных в базу данных Cloud Spanner. Клиент можно безопасно использовать одновременно, за исключением метода Close.
В приведенном ниже фрагменте создается клиент-спанер.
main.go
var dataClient *spanner.Client ... dataClient, err = spanner.NewClient(ctx, databaseName)
Вы можете думать о Клиенте как о соединении с базой данных: все ваши взаимодействия с Cloud Spanner должны проходить через Клиента. Обычно вы создаете Клиент при запуске приложения, а затем повторно используете этот клиент для чтения, записи и выполнения транзакций. Каждый клиент использует ресурсы Cloud Spanner.
Изменить данные
Существует несколько способов вставки, обновления и удаления данных из базы данных Spanner. Ниже перечислены доступные методы.
В этой лабораторной работе вы будете использовать мутации для изменения данных в Spanner.
Мутации в Spanner
Мутация — это контейнер для операций мутации. Мутация представляет собой последовательность вставок, обновлений и удалений, которые Cloud Spanner атомарно применяет к различным строкам и таблицам в базе данных Cloud Spanner.
main.go
m := []*spanner.Mutation{} m = append(m, spanner.Insert( "inventoryHistory", inventoryHistoryColumns, []interface{}{uuid.New().String(), element.ItemID, element.InventoryChange, time.Now()}))
Фрагмент кода вставляет новую строку в таблицу истории запасов.
Развертывание и тестирование
Теперь, когда Spanner настроен и вы ознакомились с ключевыми элементами кода, разверните приложение в Cloud Run.
Разверните приложение в Cloud Run
Cloud Run может автоматически создавать, отправлять и развертывать ваш код с помощью одной команды. В следующей команде вы вызовете команду deploy
в службе run
, передав переменные, используемые запущенным приложением, такие как SPANNER_CONNECTION_STRING, которые вы создали ранее.
- Нажмите Открыть терминал.
- Развертывание службы инвентаризации в Cloud Run
gcloud run deploy inventory-service \
--source . \
--region $REGION \
--update-env-vars SPANNER_CONNECTION_STRING=$SPANNER_CONNECTION_STRING \
--allow-unauthenticated \
--project=$PROJECT_ID \
--quiet
Пример вывода
Service [inventory-service] revision [inventory-service-00001-sug] has been deployed and is serving 100 percent of traffic. Service URL: https://inventory-service-ilwytgcbca-uk.a.run.app
- Сохраните URL-адрес службы
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
Тестирование приложения Cloud Run
Вставить элемент
- В CloudShell введите следующую команду.
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
{
"itemID": 1,
"inventoryChange": 5
}
]'
Пример вывода
HTTP/2 200 access-control-allow-origin: * content-type: application/json x-cloud-trace-context: 10c32f0863d26521497dc26e86419f13;o=1 date: Fri, 22 Apr 2022 21:41:38 GMT server: Google Frontend content-length: 2 OK
Запросить элемент
- Запросить службу инвентаризации
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}
Пример ответа
HTTP/2 200 access-control-allow-origin: * content-type: text/plain; charset=utf-8 x-cloud-trace-context: b94f921e4c2ae90210472c88eb05ace8;o=1 date: Fri, 22 Apr 2022 21:45:50 GMT server: Google Frontend content-length: 166 [{"ItemID":1,"Inventory":5}]
6. Концепции гаечных ключей
Cloud Spanner запрашивает свои базы данных, используя декларативные операторы SQL. Операторы SQL указывают, чего хочет пользователь, не описывая, как будут получены результаты.
- В терминале введите эту команду, чтобы запросить таблицу для ранее созданной записи.
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'
Пример вывода
ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp:
Планы выполнения запросов
План выполнения запроса — это серия шагов, которые Спаннер использует для получения результатов. Может быть несколько способов получить результаты конкретного оператора SQL. Планы выполнения запросов доступны в консоли и клиентских библиотеках. Чтобы увидеть, как Spanner обрабатывает SQL-запросы:
- В консоли откройте страницу экземпляров Cloud Spanner.
- Перейти к экземплярам Cloud Spanner
- Щелкните имя экземпляра Cloud Spanner. В разделе баз данных выберите базу данных, к которой вы хотите выполнить запрос.
- Нажмите Запрос.
- Введите следующий запрос в редакторе запросов
SELECT * FROM InventoryHistory WHERE ItemID=1
- Нажмите «Выполнить».
- Нажмите ОБЪЯСНЕНИЕ
Cloud Console отображает визуальный план выполнения вашего запроса.
Оптимизатор запросов
Оптимизатор запросов Cloud Spanner сравнивает альтернативные планы выполнения и выбирает наиболее эффективный. Со временем оптимизатор запросов будет развиваться, расширяя возможности выбора плана выполнения запроса и повышая точность оценок, которые определяют этот выбор, что приведет к более эффективным планам выполнения запросов.
Cloud Spanner распространяет обновления оптимизатора в виде новых версий оптимизатора запросов. По умолчанию каждая база данных начинает использовать последнюю версию оптимизатора не ранее, чем через 30 дней после выпуска этой версии.
Чтобы увидеть версию, используемую при запуске запроса в gcloud spanner, установите для флага –query-mode значение PROFILE.
- Введите следующую команду, чтобы просмотреть версию оптимизатора
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'
Пример вывода
TOTAL_ELAPSED_TIME: 6.18 msecs CPU_TIME: 5.17 msecs ROWS_RETURNED: 1 ROWS_SCANNED: 1 OPTIMIZER_VERSION: 3 RELATIONAL Distributed Union (1 execution, 0.11 msecs total latency) subquery_cluster_node: 1 | +- RELATIONAL Distributed Union | (1 execution, 0.09 msecs total latency) | call_type: Local, subquery_cluster_node: 2 | | | \- RELATIONAL Serialize Result | (1 execution, 0.08 msecs total latency) | | | +- RELATIONAL Scan | | (1 execution, 0.08 msecs total latency) | | Full scan: true, scan_target: InventoryHistory, scan_type: TableScan | | | | | +- SCALAR Reference | | | ItemRowID | | | | | +- SCALAR Reference | | | ItemID | | | | | +- SCALAR Reference | | | InventoryChange | | | | | \- SCALAR Reference | | Timestamp | | | +- SCALAR Reference | | $ItemRowID | | | +- SCALAR Reference | | $ItemID | | | +- SCALAR Reference | | $InventoryChange | | | \- SCALAR Reference | $Timestamp | \- SCALAR Constant true ItemRowID: 1 ItemID: 1 InventoryChange: 3 Timestamp:
Обновите версию оптимизатора
На момент выполнения этой лабораторной работы последней версией является версия 4. Далее вы обновите Spanner Table, чтобы использовать версию 4 для оптимизатора запросов.
- Обновите оптимизатор
gcloud spanner databases ddl update $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl='ALTER DATABASE InventoryHistory
SET OPTIONS (optimizer_version = 4)'
Пример вывода
Schema updating...done.
- Введите следующую команду, чтобы просмотреть обновление версии оптимизатора
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'
Пример вывода
TOTAL_ELAPSED_TIME: 8.57 msecs CPU_TIME: 8.54 msecs ROWS_RETURNED: 1 ROWS_SCANNED: 1 OPTIMIZER_VERSION: 4 [...]
Визуализация версии оптимизатора запросов в обозревателе метрик
Вы можете использовать Обозреватель метрик в Cloud Console, чтобы визуализировать количество запросов для вашего экземпляра базы данных. Вы можете увидеть, какая версия оптимизатора используется в каждой базе данных.
- Перейдите к мониторингу в облачной консоли и выберите «Обозреватель метрик» в левом меню.
- В поле Тип ресурса выберите Экземпляр Cloud Spanner.
- В поле «Метрика» выберите «Количество запросов» и нажмите «Применить».
- В поле «Группировать по» выберите базу данных, оптимизатор_версию и статус.
7. Создайте и настройте базу данных Firestore.
Firestore — это база данных документов NoSQL, созданная для автоматического масштабирования, высокой производительности и простоты разработки приложений. Хотя интерфейс Firestore имеет многие из тех же функций, что и традиционные базы данных, база данных NoSQL отличается от них описанием отношений между объектами данных.
Следующая задача поможет вам создать приложение Cloud Run для службы заказов, поддерживаемое Firestore. Служба заказов вызовет службу инвентаризации, созданную в предыдущем разделе, для запроса базы данных Spanner перед запуском заказа. Эта услуга обеспечит наличие достаточного количества товара и возможность выполнения заказа.
8. Концепции пожарного хранилища
Модель данных
База данных Firestore состоит из коллекций и документов.
Документы
Каждый документ содержит набор пар ключ-значение. Firestore оптимизирован для хранения больших коллекций небольших документов.
Коллекции
Все документы необходимо хранить в коллекциях. Документы могут содержать подколлекции и вложенные объекты, включая примитивные поля, такие как строки, или сложные объекты, такие как списки.
Создайте базу данных Firestore
- Создайте базу данных Firestore.
gcloud firestore databases create --location=$REGION
Пример вывода
Success! Selected Google Cloud Firestore Native database for cymbal-eats-6422-3462
9. Интеграция Firestore в ваше приложение
В этом разделе вы обновите учетную запись службы, добавите учетные записи службы доступа к Firestore, просмотрите и развернете правила безопасности Firestore, а также увидите, как данные изменяются в Firestore.
Настройка аутентификации
- Предоставьте роль пользователя хранилища данных сервисному аккаунту.
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/datastore.user"
Пример вывода
Updated IAM policy for project [cymbal-eats-6422-3462].
Правила безопасности Firestore
Правила безопасности обеспечивают контроль доступа и проверку данных в выразительном, но простом формате.
- Перейдите в каталог order-service/starter-code.
cd ~/cymbal-eats/order-service
- Откройте файл firestore.rules в облачном редакторе.
cat firestore.rules
firestore.rules
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { ⇐ All database match /{document=**} { ⇐ All documents allow read: if true; ⇐ Allow reads } match /{document=**} { allow write: if false; ⇐ Deny writes } } }
Предупреждение. Рекомендуется ограничить доступ к хранилищу Firestore. Для целей этой лабораторной работы разрешено любое чтение. Это не рекомендуемая производственная конфигурация.
Включить управляемые службы Firestore
- Нажмите Открыть терминал.
- Создайте файл .firebaserc с текущим идентификатором проекта. Настройки целей развертывания хранятся в файле .firebaserc в каталоге вашего проекта.
firebaserc.tmpl
sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
- Загрузите двоичный файл Firebase
curl -sL https://firebase.tools | upgrade=true bash
Пример вывода
-- Checking for existing firebase-tools on PATH... Your machine already has firebase-tools@10.7.0 installed. Nothing to do. -- All done!
- Разверните правила Firestore.
firebase deploy
Пример вывода
=== Deploying to 'cymbal-eats-6422-3462'... i deploying firestore i cloud.firestore: checking firestore.rules for compilation errors... ✔ cloud.firestore: rules file firestore.rules compiled successfully i firestore: uploading rules firestore.rules... ✔ firestore: released rules firestore.rules to cloud.firestore ✔ Deploy complete! Project Console: https://console.firebase.google.com/project/cymbal-eats-6422-3462/overview
Изменить данные
Коллекции и документы создаются неявно в Firestore. Просто назначьте данные документу в коллекции. Если коллекция или документ не существует, Firestore создаст их.
Добавить данные в Firestore
Есть несколько способов записи данных в Cloud Firestore:
- Установите данные документа внутри коллекции, явно указав идентификатор документа.
- Добавьте новый документ в коллекцию. В этом случае Cloud Firestore автоматически генерирует идентификатор документа.
- Создайте пустой документ с автоматически сгенерированным идентификатором и назначьте ему данные позже.
В следующем разделе вы узнаете, как создать документ с помощью метода set.
Установить документ
Используйте метод set()
для создания документа. С помощью метода set()
вы должны указать идентификатор создаваемого документа.
Взгляните на фрагмент кода ниже.
index.js
const orderDoc = db.doc(`orders/123`); await orderDoc.set({ orderNumber: 123, name: Anne, address: 555 Bright Street, city: Mountain View, state: CA, zip: 94043, orderItems: [id: 1], status: 'New' });
Этот код создаст документ с указанием созданного пользователем идентификатора документа 123. Чтобы Firestore сгенерировал идентификатор от вашего имени, используйте метод add()
или create()
.
Обновить документы
Метод обновления update()
позволяет обновлять некоторые поля документа, не перезаписывая весь документ.
В приведенном ниже фрагменте код обновляет порядок 123.
index.js
const orderDoc = db.doc(`orders/123`); await orderDoc.update(name: "Anna");
Удалить документы
В Firestore вы можете удалять коллекции, документы или определенные поля из документа. Чтобы удалить документ, используйте метод delete()
.
Фрагмент ниже удаляет заказ 123.
index.js
const orderDoc = db.doc(`orders/123`); await orderDoc.delete();
10. Развертывание и тестирование
В этом разделе вы развернете приложение в Cloud Run и протестируете методы создания, обновления и удаления.
Разверните приложение в Cloud Run
- Сохраните URL-адрес в переменной INVENTORY_SERVICE_URL для интеграции со службой инвентаризации.
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
--region=$REGION \
--format=json | jq \
--raw-output ".status.url")
- Развертывание службы заказов
gcloud run deploy order-service \
--source . \
--platform managed \
--region $REGION \
--allow-unauthenticated \
--project=$PROJECT_ID \
--set-env-vars=INVENTORY_SERVICE_URL=$INVENTORY_SERVICE_URL \
--quiet
Пример вывода
[...] Done. Service [order-service] revision [order-service-00001-qot] has been deployed and is serving 100 percent of traffic. Service URL: https://order-service-3jbm3exegq-uk.a.run.app
Тестирование приложения Cloud Run
Создать документ
- Сохраните URL-адрес приложения службы заказов в переменной для тестирования.
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
- Создайте запрос заказа и опубликуйте новый заказ в базе данных Firestore.
curl --request POST $ORDER_SERVICE_URL/order \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Jane Doe",
"email": "Jane.Doe-cymbaleats@gmail.com",
"address": "123 Maple",
"city": "Buffalo",
"state": "NY",
"zip": "12346",
"orderItems": [
{
"id": 1
}
]
}'
Пример вывода
{"orderNumber":46429}
Сохраните номер заказа для дальнейшего использования.
export ORDER_NUMBER=<value_from_output>
Посмотреть результаты
Посмотреть результаты в Firestore
- Перейдите в консоль Firestore.
- Нажмите на данные
Обновить документ
В отправленном заказе не указано количество.
- Обновите запись и добавьте количественную пару ключ-значение.
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
{
"id": 1,
"quantity": 1
}
]
}'
Пример вывода
{"status":"success"}
Посмотреть результаты
Посмотреть результаты в Firestore
- Перейдите в консоль Firestore.
- Нажмите на данные
Удалить документ
- Удалить товар 46429 из коллекции заказов Firestore.
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}
Посмотреть результаты
- Перейдите в консоль Firestore.
- Нажмите на данные
11. Поздравляем!
Поздравляем, вы закончили лабораторную работу!
Что дальше:
Ознакомьтесь с другими лабораториями Cymbal Eats:
- Запуск облачных рабочих процессов с помощью Eventarc
- Запуск обработки событий из облачного хранилища
- Подключение к частному CloudSQL из Cloud Run
- Безопасное бессерверное приложение с прокси-сервером с идентификацией личности (IAP)
- Запуск заданий Cloud Run с помощью Cloud Scheduler
- Безопасное развертывание в Cloud Run
- Защита входящего трафика Cloud Run
- Подключение к частному AlloyDB из GKE Autopilot
Очистить
Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий ресурсы, либо сохраните проект и удалите отдельные ресурсы.
Удаление проекта
Самый простой способ избавиться от выставления счетов — удалить проект, созданный вами для этого руководства.