1. Обзор
В этой лабораторной работе вы создадите новый сервис Cloud Run, сборщик мусора изображений, который будет запускаться Eventarc — новым сервисом для получения событий в Cloud Run. Когда изображение удаляется из хранилища изображений, сервис получает событие от Eventarc. Затем он удаляет изображение из хранилища миниатюр, а также удаляет его из коллекции изображений Firestore.

Что вы узнаете
- Cloud Run
- Облачное хранилище
- Облачный Firestore
- Эвентарк
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



- Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google, и вы можете изменить её в любое время.
- Идентификатор проекта должен быть уникальным для всех проектов Google Cloud и неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор проекта (обычно он обозначается как
PROJECT_ID), поэтому, если он вам не нравится, сгенерируйте другой случайный идентификатор или попробуйте свой собственный и посмотрите, доступен ли он. Затем он "замораживается" после создания проекта. - Существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
- Далее вам потребуется включить оплату в консоли Cloud, чтобы использовать ресурсы/API Cloud. Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, следуйте инструкциям по «очистке», приведенным в конце практического задания. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Запустить Cloud Shell
Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.
В консоли GCP щелкните значок Cloud Shell на панели инструментов в правом верхнем углу:

Подготовка и подключение к среде займут всего несколько минут. После завершения вы должны увидеть что-то подобное:

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Всю работу в этой лаборатории можно выполнять с помощью обычного браузера.
3. Введение в Eventarc
Eventarc упрощает подключение сервисов Cloud Run к событиям из различных источников. Он берет на себя обработку событий, их доставку, обеспечение безопасности, авторизацию и обработку ошибок.

Вы можете получать события из источников Google Cloud и пользовательских приложений, публикующих данные в Cloud Pub/Sub, и передавать их в приемники Google Cloud Run.
События из множества источников Google Cloud доставляются через журналы аудита Cloud Audit Logs. Задержка и доступность доставки событий из этих источников связаны с аналогичными показателями журналов аудита Cloud Audit Logs. При каждом срабатывании события из источника Google Cloud создается соответствующая запись в журнале аудита Cloud Audit Log.
Пользовательские приложения, публикующие сообщения в Cloud Pub/Sub, могут отправлять сообщения в указанную ими тему Pub/Sub в любом формате.
Триггеры событий — это механизм фильтрации, позволяющий определить, какие события следует передавать в какой приемник.
Все мероприятия проводятся в формате CloudEvents v1.0 для обеспечения совместимости между различными сервисами.
4. Прежде чем начать
Включить API
Для запуска службы Cloud Run вам потребуется служба Eventarc. Убедитесь, что она включена:
gcloud services enable eventarc.googleapis.com
Вы должны увидеть сообщение об успешном завершении операции:
Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.
Настройка учетных записей служб
В триггерах будет использоваться учетная запись вычислительной службы по умолчанию. Предоставьте учетной записи вычислительной службы по умолчанию роль eventarc.eventReceiver :
PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)')
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
--role roles/eventarc.eventReceiver
Предоставьте учетной записи службы Cloud Storage роль pubsub.publisher . Это необходимо для триггера Eventarc Cloud Storage:
SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)
gcloud projects add-iam-policy-binding $PROJECT_NUMBER \
--member serviceAccount:$SERVICE_ACCOUNT \
--role roles/pubsub.publisher
Если вы включили учетную запись службы Pub/Sub 8 апреля 2021 года или ранее, предоставьте этой учетной записи службы роль iam.serviceAccountTokenCreator :
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role roles/iam.serviceAccountTokenCreator
5. Клонируйте код
Если вы еще не клонировали код в предыдущем практическом занятии, сделайте это следующим образом:
git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
Затем вы можете перейти в каталог, содержащий службу:
cd serverless-photosharing-workshop/services/garbage-collector/nodejs
Структура файлов сервиса будет следующей:
services
|
├── garbage-collector
|
├── nodejs
|
├── index.js
├── package.json
Внутри папки находятся 3 файла:
-
index.jsсодержит код Node.js. -
package.jsonопределены зависимости библиотеки.
6. Изучите код
Зависимости
В файле package.json определены необходимые зависимости библиотек:
{
"name": "garbage_collector_service",
"version": "0.0.1",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"cloudevents": "^4.0.1",
"express": "^4.17.1",
"@google/events": "^3.1.0",
"@google-cloud/firestore": "^4.9.9",
"@google-cloud/storage": "^5.8.3"
}
}
Для удаления изображений из Cloud Storage мы используем библиотеку Cloud Storage. Также мы указываем зависимость от Cloud Firestore для удаления ранее сохраненных метаданных изображений. Кроме того, для чтения событий CloudEvents, отправляемых Eventarc, мы используем SDK CloudEvents и библиотеки Google Events. Express — это веб-фреймворк на JavaScript/Node. Для обработки промисов используется Bluebird.
index.js
Давайте подробнее рассмотрим наш код index.js :
const express = require('express');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');
const { HTTP } = require("cloudevents");
const {toStorageObjectData} = require('@google/events/cloud/storage/v1/StorageObjectData');
Для работы нашей программы нам необходимы следующие зависимости: Express — это веб-фреймворк Node, который мы будем использовать, Bluebird — библиотека для обработки промисов JavaScript, Storage и Firestore — для работы с Google Cloud Storage (наши хранилища изображений) и хранилищем данных Cloud Firestore соответственно. Кроме того, нам требуется CloudEvent для чтения события CloudEvent, отправляемого Eventarc StoreObjectData из библиотеки Google Events, а также для чтения тела события Cloud Storage.
const app = express();
app.use(express.json());
app.post('/', async (req, res) => {
try {
const cloudEvent = HTTP.toEvent({ headers: req.headers, body: req.body });
console.log(cloudEvent);
/* ... */
} catch (err) {
console.log(`Error: ${err}`);
res.status(500).send(err);
}
});
Выше представлена структура нашего обработчика Node.js: наше приложение отвечает на HTTP POST-запросы. Оно считывает объект CloudEvent из HTTP-запроса, и мы выполняем некоторую обработку ошибок на случай, если что-то пойдет не так. Давайте теперь посмотрим, что находится внутри этой структуры.
Следующий шаг — получить и проанализировать тело события CloudEvent и извлечь имя объекта:
const storageObjectData = toStorageObjectData(cloudEvent.data);
console.log(storageObjectData);
const objectName = storageObjectData.name;
Как только мы узнаем название изображения, мы можем удалить его из папки с миниатюрами:
try {
await storage.bucket(bucketThumbnails).file(objectName).delete();
console.log(`Deleted '${objectName}' from bucket '${bucketThumbnails}'.`);
}
catch(err) {
console.log(`Failed to delete '${objectName}' from bucket '${bucketThumbnails}': ${err}.`);
}
В качестве последнего шага удалите также метаданные изображений из коллекции Firestore:
try {
const pictureStore = new Firestore().collection('pictures');
const docRef = pictureStore.doc(objectName);
await docRef.delete();
console.log(`Deleted '${objectName}' from Firestore collection 'pictures'`);
}
catch(err) {
console.log(`Failed to delete '${objectName}' from Firestore: ${err}.`);
}
res.status(200).send(`Processed '${objectName}'.`);
Теперь настроим наш Node-скрипт на прослушивание входящих запросов. Также убедитесь, что установлены необходимые переменные окружения:
app.listen(PORT, () => {
if (!bucketThumbnails) throw new Error("BUCKET_THUMBNAILS not set");
console.log(`Started service on port ${PORT}`);
});
7. Протестируйте локально.
Перед развертыванием в облаке протестируйте код локально, чтобы убедиться в его работоспособности.
В папке garbage-collector/nodejs установите зависимости npm и запустите сервер:
export BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT npm install; npm start
Если всё прошло успешно, сервер должен запуститься на порту 8080:
Started service on port 8080
Для выхода используйте сочетание CTRL-C .
8. Сборка и развертывание в Cloud Run
Перед развертыванием в Cloud Run установите регион Cloud Run в качестве одного из поддерживаемых регионов и платформу для managed :
REGION=europe-west1 gcloud config set run/region $REGION gcloud config set run/platform managed
Вы можете проверить, что конфигурация настроена:
gcloud config list ... [run] platform = managed region = europe-west1
Вместо того чтобы вручную создавать и публиковать образ контейнера с помощью Cloud Build, вы также можете использовать Cloud Run для создания образа контейнера с помощью Google Cloud Buildpacks .
Выполните следующую команду, чтобы создать образ контейнера с помощью Google Cloud Buildpack , а затем разверните образ контейнера в Cloud Run:
SERVICE_NAME=garbage-collector-service
gcloud run deploy $SERVICE_NAME \
--source . \
--no-allow-unauthenticated \
--update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS
Обратите внимание на флаг –-source . Он указывает Cloud Run использовать Google Cloud Buildpacks для сборки образа контейнера без Dockerfile. Флаг --no-allow-unauthenticated делает службу Cloud Run внутренней службой, которая будет запускаться только определенными учетными записями служб. Позже вы создадите триггер с учетной записью вычислительной службы по умолчанию, имеющей роль run.invoker , для вызова внутренних служб Cloud Run.
9. Создайте триггер
В Eventarc триггер определяет, какой сервис должен получать какие типы событий. В данном случае вам нужно, чтобы сервис получал события при удалении файла в хранилище.
Укажите местоположение триггера в том же регионе, что и хранилище загруженных изображений:
gcloud config set eventarc/location eu
Создайте триггер AuditLog для фильтрации событий storage.objects.delete и отправки их в службу Cloud Run:
BUCKET_IMAGES=uploaded-pictures-$GOOGLE_CLOUD_PROJECT gcloud eventarc triggers create trigger-$SERVICE_NAME \ --destination-run-service=$SERVICE_NAME \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.storage.object.v1.deleted" \ --event-filters="bucket=$BUCKET_IMAGES" \ --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
Вы можете убедиться в создании триггера с помощью этой команды:
gcloud eventarc triggers list
10. Проверьте работу сервиса.
Чтобы проверить работоспособность сервиса, перейдите в хранилище uploaded-pictures и удалите одно из изображений. В логах сервиса вы увидите, что соответствующее изображение было удалено из хранилища thumbnails , а также удален документ, относящийся к нему, из коллекции pictures Firestore.

11. Уборка (необязательно)
Если вы не планируете продолжать выполнение остальных лабораторных работ из этой серии, вы можете освободить ресурсы, чтобы сэкономить средства и в целом ответственно относиться к облачным технологиям. Освободить ресурсы можно по отдельности следующим образом.
Удалить сервис:
gcloud run services delete $SERVICE_NAME -q
Удалите триггер Eventarc:
gcloud eventarc triggers delete trigger-$SERVICE_NAME -q
В качестве альтернативы вы можете удалить весь проект:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
12. Поздравляем!
Поздравляем! Вы создали сервис Cloud Run, сборщик мусора изображений, который запускается Eventarc — новым сервисом для получения событий в Cloud Run. Когда изображение удаляется из хранилища изображений, сервис получает событие от Eventarc. Затем он удаляет изображение из хранилища миниатюр, а также из коллекции изображений Firestore.
Что мы рассмотрели
- Cloud Run
- Облачное хранилище
- Облачный Firestore
- Эвентарк