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 и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



- Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как
PROJECT_ID). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта. - К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
- Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи 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
Создайте базу данных и схему.
Создайте новую базу данных и используйте язык определения данных (DDL) стандартного SQL от Google для создания схемы базы данных.
- Создайте DDL-файл
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
- Создайте базу данных Spanner.
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 , REST API и RPC API , которые позволяют интегрировать Spanner в любое приложение.
В следующем разделе вы будете использовать клиентскую библиотеку Go для установки, аутентификации и изменения данных в Spanner.
Установка клиентской библиотеки
Клиентская библиотека Cloud Spanner упрощает интеграцию с Cloud Spanner, автоматически используя учетные данные приложения по умолчанию (ADC) для поиска учетных данных вашей сервисной учетной записи.
Настройка аутентификации
Библиотеки Google Cloud CLI и Google Cloud Client автоматически определяют, работают ли они в 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:
планы выполнения запросов
План выполнения запроса — это последовательность шагов, которые Spanner использует для получения результатов. Существует несколько способов получения результатов конкретного 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, чтобы использовать версию 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 вы можете использовать Metrics Explorer для визуализации количества запросов к вашему экземпляру базы данных. Вы также можете увидеть, какая версия оптимизатора используется в каждой базе данных.
- Перейдите в раздел «Мониторинг» в облачной консоли и выберите «Обозреватель метрик» в левом меню.
- В поле «Тип ресурса» выберите «Экземпляр Cloud Spanner».
- В поле «Метрика» выберите «Количество запросов» и нажмите «Применить».
- В поле «Группировать по» выберите базу данных, версию оптимизатора и статус.

7. Создайте и настройте базу данных Firestore.
Firestore — это документоориентированная NoSQL-база данных, созданная для автоматического масштабирования, высокой производительности и упрощения разработки приложений. Хотя интерфейс Firestore обладает многими функциями традиционных баз данных, NoSQL-база данных отличается от них в описании связей между объектами данных.
В следующем задании вы найдете пошаговое руководство по созданию облачного приложения для обработки заказов на базе Firestore. Сервис обработки заказов будет обращаться к сервису управления запасами, созданному в предыдущем разделе, для запроса к базе данных Spanner перед началом обработки заказа. Этот сервис обеспечит наличие достаточного количества товара на складе и возможность выполнения заказа.

8. Firestore Concepts
модель данных
База данных 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() ` необходимо указать идентификатор создаваемого документа.
Взгляните на приведенный ниже фрагмент кода.
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
- Безопасное развертывание в облаке
- Обеспечение безопасности входящего трафика облачных сервисов
- Подключение к частной базе данных AlloyDB из GKE Autopilot
Уборка
Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий эти ресурсы, либо сохраните проект и удалите отдельные ресурсы.
Удаление проекта
Самый простой способ избежать выставления счетов — удалить проект, созданный для этого урока.