Запуск обработки событий из облачного хранилища с помощью Eventarc и облачных функций (2-го поколения)

1. Обзор

В ходе этой лабораторной работы вы узнаете, как использовать события сегмента Cloud Storage и Eventarc для запуска обработки событий. Вы будете использовать облачные функции (2-го поколения) для анализа данных и обработки изображений. Функция будет использовать API Google Vision и сохранит полученное изображение обратно в корзину Cloud Storage.

4756e4c218d84e26.png

Что вы узнаете

Как построить конвейер обработки изображений.

  • Настройка сегментов хранилища
  • Создайте облачную функцию для чтения и записи объектов в облачном хранилище.
  • Интегрируйте Vision API для обнаружения изображений продуктов питания
  • Развертывание облачной функции
  • Развертывание триггера Eventarc
  • Протестируйте и подтвердите комплексное решение

Предварительные условия

  • Эта лабораторная работа предполагает знакомство с облачной консолью и средами оболочки.
  • Предыдущий опыт работы с облачным хранилищем, облачными функциями или Vision API будет полезен, но не обязателен.

2. Настройка и требования

Настройка облачного проекта

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы можете обновить его в любое время.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (нельзя изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как PROJECT_ID ). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Кроме того, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага, и он останется в силе на протяжении всего проекта.
  • К вашему сведению, есть третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и избежать выставления счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить весь проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Активировать Cloud Shell

Активируйте Cloud Shell, щелкнув значок справа от панели поиска.

8613854df02635a3.png

Настройка среды

  1. Создайте переменные среды, связанные с проектом и ресурсами, выполнив приведенные ниже команды в терминале Cloud Shell.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NAME=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1 
export UPLOAD_BUCKET=gs://menu-item-uploads-$PROJECT_ID
export BUCKET_THUMBNAILS=gs://menu-item-thumbnails-$PROJECT_ID
export MENU_SERVICE_NAME=menu-service
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")
  1. Включите API, необходимые для лаборатории
gcloud services enable \
    vision.googleapis.com \
    cloudfunctions.googleapis.com \
    pubsub.googleapis.com \
    cloudbuild.googleapis.com \
    logging.googleapis.com \
    eventarc.googleapis.com \
    artifactregistry.googleapis.com \
    run.googleapis.com \
    --quiet
  1. Включите API, необходимые для лаборатории. (Специальный шаг Qwiklabs)
gcloud services disable cloudfunctions.googleapis.com
gcloud services enable cloudfunctions.googleapis.com
  1. Клонировать репозиторий
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/cloud-functions

3. Настройте сегменты облачного хранилища.

Создание сегментов хранения

Создайте сегменты Cloud Storage для загрузки и миниатюр для конвейера обработки изображений.

Используйте команду gsutil mb и уникальное имя, чтобы создать два сегмента:

  1. Сегмент загрузки, в который изображения будут загружаться в первую очередь.
  2. Область миниатюр для хранения созданных миниатюр изображений.

Создайте корзину для загрузки новых изображений:

gsutil mb -p $PROJECT_ID -l $REGION $UPLOAD_BUCKET

Пример вывода:

Creating gs://menu-item-uploads-cymbal-eats-8399-3119/...

Создайте корзину для хранения созданных миниатюр:

gsutil mb -p $PROJECT_ID -l $REGION $BUCKET_THUMBNAILS

Пример вывода:

Creating gs://menu-item-thumbnails-cymbal-eats-8399-3119/...

Обновить разрешения сегмента

Обновите разрешения сегмента хранилища, чтобы предоставить пользователям разрешения на чтение.

Используйте команду gsutil iam ch, чтобы предоставить разрешение на чтение и запись объектов в вашей корзине:

gsutil iam ch allUsers:objectViewer $UPLOAD_BUCKET
gsutil iam ch allUsers:objectViewer $BUCKET_THUMBNAILS

Пример вывода

Updated IAM policy for project [cymbal-eats-8399-3119].
[...]

4. Настройте учетные записи служб

Создайте специальную учетную запись службы для Cloud Function для обработки миниатюр:

export CF_SERVICE_ACCOUNT=thumbnail-service-sa
gcloud iam service-accounts create ${CF_SERVICE_ACCOUNT}

Предоставьте роль artifactregistry.reader , чтобы разрешить операции чтения из реестра артефактов:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/artifactregistry.reader"

Предоставьте роль storage.objectCreator , чтобы разрешить сохранение сгенерированных изображений в сегменте миниатюр:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/storage.objectCreator"

Предоставьте роль run.invoker , чтобы разрешить вызов службы Cloud Run:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/run.invoker"

Предоставьте роль eventarc.eventReceiver , чтобы разрешить получение событий от поставщиков:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/eventarc.eventReceiver"

Предоставьте роль pubsub.publisher учетной записи службы Cloud Storage. Это позволит сервисному аккаунту публиковать события при загрузке изображений в корзину.

GCS_SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_NUMBER \
    --member "serviceAccount:$GCS_SERVICE_ACCOUNT" \
    --role "roles/pubsub.publisher"

5. Обзор функций обработки изображений

Создайте функцию для загрузки изображения из Cloud Storage, изменения размера изображения и загрузки изображения обратно в Cloud Storage. Функция вызовет Vision API, чтобы присвоить изображению метку описания. Функция проверит метку описания. Если метка идентифицирует изображение как «Еда», в службу меню будет отправлено событие для обновления изображения и миниатюры пункта меню.

4c3c3b758dba6a9f.png

Запуск функции

Функции Cloud Storage основаны на уведомлениях Pub/Sub от Cloud Storage и поддерживают аналогичные типы событий:

В ходе этой лабораторной работы вы развернете и активируете функцию, когда объект будет завершен в облачном хранилище.

Завершение объекта

События завершения объекта срабатывают, когда «запись» объекта облачного хранилища успешно завершена. В частности, это означает, что создание нового объекта или перезапись существующего объекта вызывает это событие. Операции обновления архива и метаданных игнорируются этим триггером.

6. Интегрируйте облачное хранилище

Cloud Storage — сервис для хранения ваших объектов в Google Cloud. Объект — это неизменяемая часть данных, состоящая из файла любого формата. Вы храните объекты в контейнерах, называемых корзинами. Все сегменты связаны с проектом, и вы можете группировать свои проекты в рамках организации. Клиентские библиотеки и API обеспечивают интеграцию с Cloud Storage.

В ходе этой лабораторной работы вы будете использовать клиентскую библиотеку для чтения и записи объектов в Cloud Storage.

Установка клиентской библиотеки

Облачные клиентские библиотеки доступны на многих популярных языках программирования. Чтобы начать использовать библиотеки, вам необходимо установить клиентскую библиотеку.

Использование клиентской библиотеки

Детали реализации во многом зависят от языка программирования. Чтобы использовать клиентскую библиотеку в своем приложении, первым делом необходимо импортировать зависимости Cloud Storage. Например, в проекте Node.js импорт добавляется в файл package.json. В приведенном ниже фрагменте показано уведомление о файле package.json этой лабораторной работы.

пакет.json

{
    "name": "thumbnail-service",
    "version": "0.1.0",
    "dependencies": {
      "@google-cloud/functions-framework": "^3.0.0",
      "@google-cloud/storage": "^5.18.2",
      "@google-cloud/vision": "^2.4.2",
        ...
    }
  }

Зарегистрируйте обратный вызов CloudEvent

Зарегистрируйте обратный вызов CloudEvent с помощью Functions Framework , который будет запускаться Cloud Storage при загрузке нового изображения в корзину.

index.js

functions.cloudEvent('process-thumbnails', async (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);
    ...

Создание объекта ссылки на хранилище

После импорта клиентских библиотек вам потребуется создать новый клиент хранилища и сегменты, с которыми будет взаимодействовать ваше приложение.

index.js

const storage = new Storage();
const bucket = storage.bucket(file.bucket);
const thumbBucket = storage.bucket(process.env.BUCKET_THUMBNAILS);

Загрузка объектов облачного хранилища

index.js

await bucket.file(file.name).download({
            destination: originalFile
        });

Загрузить объекты в облачное хранилище

Вы можете отправлять запросы на загрузку в Cloud Storage тремя способами: одним запросом, возобновляемой загрузкой или многочастной загрузкой через XML API. Для больших загрузок или потоковой загрузки используйте возобновляемую загрузку. С помощью XML API файлы загружаются по частям и собираются как единый объект. Для небольших объектов используйте загрузку по одному запросу.

Код ниже загружает изображение в облачное хранилище с помощью загрузки одним запросом.

index.js

const thumbnailImage = await thumbBucket.upload(thumbFile);

7. Интегрируйте Vision API

Cloud Vision позволяет разработчикам легко интегрировать функции распознавания изображений в приложения, включая маркировку изображений, распознавание лиц и ориентиров, оптическое распознавание символов (OCR) и маркировку непристойного контента.

Установка клиентской библиотеки

Облачные клиентские библиотеки доступны на многих популярных языках программирования. Чтобы начать использовать библиотеки, вам необходимо установить клиентскую библиотеку.

Создайте клиент аннотатора изображений

Чтобы получить доступ к API Google с помощью официальных клиентских SDK, вы создаете объект службы на основе документа обнаружения API, который описывает API для SDK. Вам нужно будет получить его из службы обнаружения Vision API, используя свои учетные данные.

index.js

const client = new vision.ImageAnnotatorClient();

Создайте запрос Vision API

Vision API может выполнять обнаружение функций в файле изображения, отправляя содержимое файла изображения в виде строки в кодировке Base64 в теле вашего запроса.

Чтобы создать запрос с использованием ресурса изображений для аннотации вашего изображения. Запрос к этому API принимает форму объекта со списком запросов. Каждый элемент в этом списке содержит два бита информации:

  • Данные изображения в кодировке Base64
  • Список функций, которые вы хотели бы аннотировать для этого изображения.

index.js

        const client = new vision.ImageAnnotatorClient();
        const visionRequest = {
            image: { source: { imageUri: `gs://${file.bucket}/${file.name}` } },
            features: [
                { type: 'LABEL_DETECTION' },
            ]
        };
        const visionPromise = client.annotateImage(visionRequest);

8. Развертывание облачной функции

Этот сервис изменения размера изображений является частью более крупной системы Cymbal Eats. В этом разделе вы развернете только компоненты, связанные с функцией обработки изображений. Полная установка включает в себя пользовательский интерфейс для загрузки изображения и последующий запрос на сохранение полученных метаданных. Эти возможности не устанавливаются в рамках данной лабораторной работы.

Во время развертывания функции будут созданы следующие компоненты:

  • Облачная функция
  • Сервис Cloud Run
  • Триггер Eventarc
  • Тема Pub/Sub и подписка

В терминале CloudShell выполните приведенную ниже команду, чтобы развернуть облачную функцию с помощью триггерной корзины в menu-item-uploads-$PROJECT_ID :

gcloud functions deploy process-thumbnails \
  --gen2 \
  --runtime=nodejs16 \
  --source=thumbnail \
  --region=$REGION \
  --project=$PROJECT_ID \
  --entry-point=process-thumbnails \
  --trigger-bucket=$UPLOAD_BUCKET \
  --service-account="${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --set-env-vars=BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS,MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --max-instances=1 \
  --quiet

Если развертывание завершается неудачно из-за проблемы с разрешениями в сегменте хранилища для загрузки, подождите, пока изменения IAM, полученные на предыдущем шаге, распространятся. Обычно это занимает 1–2 минуты, а затем повторите развертывание еще раз.

Пример вывода

Deploying function (may take a while - up to 2 minutes)...done.
[...] 

В облачной консоли просмотрите созданную облачную функцию :

8148dd29e6757603.png

В облачной консоли просмотрите службу Cloud Run , созданную для этой функции:

42e970cdd48cae76.png

В облачной консоли просмотрите триггер Eventarc , созданный для функции:

9441995a5cc62e38.png

В облачной консоли просмотрите тему Pub/Sub и подписку , созданные для триггера Eventarc:

affe089c39ae1465.png

a4c41ede2af300db.png

9. Протестируйте и подтвердите комплексное решение

Загрузите новую фотографию в Cloud Storage и следите за ходом конвейера по мере анализа изображений. Вы протестируете комплексное решение, отслеживая журналы облачных функций.

Загрузка подходящего изображения

2fdd13b63d6148f4.jpeg

  1. Сохраните это изображение на свой локальный компьютер.
  2. Переименуйте файл 1.jpg.
  3. Откройте консоль облачного хранилища .
  4. Нажмите на ведро меню-пункт-загрузки-....
  5. Нажмите ЗАГРУЗИТЬ ФАЙЛЫ.
  6. Загрузите файл 1.jpg в корзину хранилища.
  7. В Cloud Console перейдите к Cloud Functions.
  8. Нажмите на миниатюры процессов
  9. Нажмите на вкладку ЖУРНАЛЫ

7ab4e783e474c90d.png

  1. Перейдите в корзину Menu-item-thumbnails-$PROJECT_ID Cloud Storage .
  2. Убедитесь, что миниатюра изображения создана в области миниатюр.

84d8023782eb3e0c.png

Загрузка изображения непродовольственной продукции

Чтобы убедиться, что функция работает правильно, вы загрузите изображение, не содержащее объекта, который можно было бы отнести к категории «Еда».

3226a24251084b28.jpeg

  1. Сохраните это изображение на свой локальный компьютер.
  2. Переименуйте файл 2.jpg.
  3. Откройте консоль облачного хранилища .
  4. Нажмите на ведро меню-пункт-загрузки-....
  5. Нажмите ЗАГРУЗИТЬ ФАЙЛЫ.
  6. Загрузите файл 2.jpg в хранилище.
  7. В Cloud Console перейдите к Cloud Functions.
  8. Нажмите на миниатюры процессов
  9. Нажмите на вкладку ЖУРНАЛЫ

421c36c342fceea8.png

10. Поздравляем!

Поздравляем, вы закончили лабораторную работу!

Что дальше:

Ознакомьтесь с другими лабораториями Cymbal Eats:

Очистить

Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий ресурсы, либо сохраните проект и удалите отдельные ресурсы.

Удаление проекта

Самый простой способ избавиться от выставления счетов — удалить проект, созданный вами для этого руководства.