Pic-a-daily: Лабораторная работа 6. Согласование с рабочими процессами

1. Обзор

В предыдущих лабораторных работах вы создали управляемую событиями версию приложения Pic-a-daily, которая использовала облачную функцию, запускаемую Google Cloud Storage, для службы анализа изображений, контейнер Cloud Run, запускаемый GCS, через Pub/Sub для службы миниатюр и Eventarc для запуска службы Image Garbage Collector в Cloud Run. Также существовал сервис коллажей, запускаемый Cloud Scheduler:

d93345bfc235f81e.png

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

b763efcbf5589747.png

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

  • Механизм приложений
  • Облачный пожарный магазин
  • Облачные функции
  • Облачный бег
  • Рабочие процессы

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

Самостоятельная настройка среды

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Запомните идентификатор проекта — уникальное имя для всех проектов Google Cloud (имя, указанное выше, уже занято и не подойдет вам, извините!). Позже в этой лаборатории он будет называться PROJECT_ID .

  1. Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.

Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Обязательно следуйте всем инструкциям в разделе «Очистка», в которых рассказывается, как отключить ресурсы, чтобы вам не приходилось нести расходы, выходящие за рамки этого руководства. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Запустить Cloud Shell

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

В консоли GCP щелкните значок Cloud Shell на верхней правой панели инструментов:

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

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

3. Введение в рабочие процессы

90fcd42d556e310e.jpeg

Вы можете использовать рабочие процессы для создания бессерверных рабочих процессов, которые связывают ряд бессерверных задач в заданном вами порядке. Вы можете объединить возможности API Google Cloud, бессерверных продуктов, таких как Cloud Functions и Cloud Run, и вызовов внешних API для создания гибких бессерверных приложений.

Как и следовало ожидать от оркестратора, рабочие процессы позволяют вам определять поток вашей бизнес-логики на языке определения рабочих процессов на основе YAML/JSON и предоставляют API выполнения рабочих процессов и пользовательский интерфейс рабочих процессов для запуска этих потоков.

Это больше, чем просто оркестратор со следующими встроенными и настраиваемыми функциями:

  • Гибкая обработка повторов и ошибок между шагами для надежного выполнения шагов.
  • Анализ JSON и передача переменных между этапами во избежание связующего кода.
  • Формулы выражений для решений допускают условное выполнение шагов.
  • Подрабочие процессы для модульных и многократно используемых рабочих процессов.
  • Поддержка внешних сервисов позволяет управлять сервисами за пределами Google Cloud.
  • Поддержка аутентификации для Google Cloud и внешних сервисов для безопасного выполнения шагов.
  • Коннекторы к облачным сервисам Google, таким как Pub/Sub, Firestore, Tasks, Secret Manager, для упрощения интеграции.

Не говоря уже о том, что Workflows — это полностью управляемый бессерверный продукт. Никаких серверов, которые нужно настраивать или масштабировать, и вы платите только за то, что используете.

4. Включите API

В ходе этой лабораторной работы вы будете подключать облачные функции и службы Cloud Run к рабочим процессам. Вы также будете использовать App Engine, Cloud Build, Vision API и другие сервисы.

В Cloud Shell убедитесь, что все необходимые службы включены:

gcloud services enable \
  appengine.googleapis.com \
  cloudbuild.googleapis.com \
  cloudfunctions.googleapis.com \
  compute.googleapis.com \
  firestore.googleapis.com \
  run.googleapis.com \
  vision.googleapis.com \
  workflows.googleapis.com \

Через некоторое время вы должны увидеть успешное завершение операции:

Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.

5. Получите код

Получите код, если вы еще этого не сделали на предыдущих лабораторных занятиях по кодированию:

git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop

У вас будет следующая структура папок, актуальная для этой лабораторной работы:

frontend
 |
workflows
 |
 ├── functions
 ├── |── trigger-workflow
 ├── |── vision-data-transform
 ├── services
 ├── |── collage
 ├── |── thumbnails
 ├── workflows.yaml

Это соответствующие папки:

  • frontend содержит интерфейс App Engine, который мы будем повторно использовать из лабораторной работы 4.
  • functions содержат облачные функции, созданные для рабочего процесса.
  • services содержит службы Cloud Run, модифицированные для рабочего процесса.
  • workflows.yaml — это файл определения рабочего процесса.

6. Изучите рабочие процессы YAML.

Workflows.yaml определяет рабочий процесс в виде ряда шагов. Давайте пройдемся по этому вопросу, чтобы лучше понять.

В начале рабочего процесса передаются некоторые параметры. Они будут переданы двумя облачными функциями, запускающими рабочие процессы. Мы вернемся к этим функциям позже, но вот как начинаются рабочие процессы:

d44a5e18aa9d4660.png

В YAML вы можете видеть, что эти параметры назначаются переменным на этапе init , таким как имена файлов и сегментов, вызывающие событие, а также URL-адреса некоторых облачных функций и служб Cloud Run, которые будут вызывать рабочие процессы:

main:
  params: [args]
  steps:
    - init:
        assign:
          - file: ${args.file}
          - bucket: ${args.bucket}
          - gsUri: ${"gs://" + bucket + "/" + file}
          - projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
          - urls: ${args.urls}

Затем рабочие процессы проверяют тип события. Поддерживаются два типа событий: object.finalize (генерируется при сохранении файла в сегменте облачного хранилища) и object.delete (генерируется при удалении файла). Все остальное вызовет исключение «событие не поддерживается».

dd1f450983655619.png

Вот шаг в определении рабочего процесса YAML, на котором мы проверяем тип события хранения файла:

    - eventTypeSwitch:
        switch:
            - condition: ${args.eventType == "google.storage.object.finalize"}
              next: imageAnalysisCall
            - condition: ${args.eventType == "google.storage.object.delete"}
              next: pictureGarbageCollectionGCS
    - eventTypeNotSupported:
        raise: ${"eventType " + args.eventType + " is not supported"}
        next: end

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

Далее давайте взглянем на imageAnalysisCall . Это серия вызовов из рабочих процессов для вызова Vision API для анализа изображения, преобразования данных ответа Vision API для сортировки меток объектов, распознанных на изображении, выбора доминирующих цветов, проверки безопасности изображения для отображения и затем сохраните метаданные в Cloud Firestore.

Обратите внимание, что все делается в рабочих процессах, за исключением облачных функций Vision Transform (которые мы развернем позже):

ca2ad16b9cbb436.png

Вот как эти шаги выглядят в YAML:

    - imageAnalysisCall:
        call: http.post
        args:
          url: https://vision.googleapis.com/v1/images:annotate
          headers:
            Content-Type: application/json
          auth:
            type: OAuth2
          body:
            requests:
            - image:
                source:
                  gcsImageUri: ${gsUri}
              features:
              - type: LABEL_DETECTION
              - type: SAFE_SEARCH_DETECTION
              - type: IMAGE_PROPERTIES
        result: imageAnalysisResponse
    - transformImageAnalysisData:
        call: http.post
        args:
          url: ${urls.VISION_DATA_TRANSFORM_URL}
          auth:
            type: OIDC
          body: ${imageAnalysisResponse.body}
        result: imageMetadata
    - checkSafety:
        switch:
          - condition: ${imageMetadata.body.safe == true}
            next: storeMetadata
        next: end
    - storeMetadata:
        call: http.request
        args:
          url: ${"https://firestore.googleapis.com/v1/projects/" + projectId + "/databases/(default)/documents/pictures/" + file + "?updateMask.fieldPaths=color&updateMask.fieldPaths=labels&updateMask.fieldPaths=created"}
          auth:
            type: OAuth2
          method: PATCH
          body:
            name: ${"projects/" + projectId + "/databases/(default)/documents/pictures/" + file}
            fields:
              color:
                stringValue: ${imageMetadata.body.color}
              created:
                timestampValue: ${imageMetadata.body.created}
              labels:
                arrayValue:
                  values: ${imageMetadata.body.labels}
        result: storeMetadataResponse

После анализа изображения следующими двумя шагами будут создание миниатюры изображения и коллажа из самых последних изображений. Это делается путем развертывания двух сервисов Cloud Run и выполнения вызовов к ним с помощью шагов thumbnailCall и collageCall :

76f9179323c3144.png

Шаги в YAML:

   - thumbnailCall:
        call: http.post
        args:
          url: ${urls.THUMBNAILS_URL}
          auth:
            type: OIDC
          body:
              gcsImageUri: ${gsUri}
        result: thumbnailResponse
    - collageCall:
        call: http.get
        args:
          url: ${urls.COLLAGE_URL}
          auth:
            type: OIDC
        result: collageResponse

Эта ветвь выполнения заканчивается возвратом кодов состояния от каждой службы на этапе finalizeCompleted :

    - finalizeCompleted:
        return:
          imageAnalysis: ${imageAnalysisResponse.code}
          storeMetadata: ${storeMetadataResponse.code}
          thumbnail: ${thumbnailResponse.code}
          collage: ${collageResponse.code}

Другая ветвь выполнения — это удаление файла из основной памяти, содержащего версии изображений с высоким разрешением. В этой ветке мы хотим удалить миниатюру изображения в контейнере, содержащем миниатюры, и удалить его метаданные из Firestore. Оба эти действия выполняются с помощью HTTP-вызовов из рабочих процессов:

f172379274dcb3c2.png

Шаги в YAML:

    - pictureGarbageCollectionGCS:
        try:
          call: http.request
          args:
            url: ${"https://storage.googleapis.com/storage/v1/b/thumbnails-" + projectId + "/o/" + file}
            auth:
              type: OAuth2
            method: DELETE
          result: gcsDeletionResult
        except:
          as: e
          steps:
              - dummyResultInOutVar:
                  assign:
                      - gcsDeletionResult:
                          code: 200
                          body: "Workaround for empty body response"
    - pictureGarbageCollectionFirestore:
        call: http.request
        args:
          url: ${"https://firestore.googleapis.com/v1/projects/" + projectId + "/databases/(default)/documents/pictures/" + file}
          auth:
            type: OAuth2
          method: DELETE
        result: firestoreDeletionResult

Ветка удаления заканчивается возвратом результатов/кодов каждого шага:

    - deleteCompleted:
        return:
          gcsDeletion: ${gcsDeletionResult}
          firestoreDeletion: ${firestoreDeletionResult.code}

На следующих шагах мы создадим все внешние зависимости рабочих процессов: сегменты, облачные функции, службы Cloud Run и базу данных Firestore.

7. Создайте сегменты

Вам понадобится 2 корзины для изображений: 1 для сохранения оригинальных изображений с высоким разрешением и 1 для сохранения миниатюр изображений.

Создайте общедоступную региональную (в данном случае в Европе) корзину с единым доступом, в которую пользователи смогут загружать изображения, с помощью инструмента gsutil :

export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}
gsutil mb -l EU gs://${BUCKET_PICTURES}
gsutil uniformbucketlevelaccess set on gs://${BUCKET_PICTURES}
gsutil iam ch allUsers:objectViewer gs://${BUCKET_PICTURES}

Создайте еще один общедоступный региональный сегмент для миниатюр:

export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
gsutil mb -l EU gs://${BUCKET_THUMBNAILS}
gsutil uniformbucketlevelaccess set on gs://${BUCKET_THUMBNAILS}
gsutil iam ch allUsers:objectViewer gs://${BUCKET_THUMBNAILS}

Вы можете дважды проверить, что сегменты созданы и общедоступны, посетив раздел Cloud Storage в Cloud Console:

15063936edd72f06.png

8. Преобразование данных машинного зрения (функция облака)

Workflows.yaml начинается с шагов init , eventTypeSwitch , eventTypeNotSupported . Это гарантирует, что события, поступающие из сегментов, перенаправляются на правильные шаги.

Для события object.finalize шаг imageAnalysisCall вызывает Vision API для извлечения метаданных созданного изображения. Все эти шаги выполняются в рамках рабочих процессов:

daaed43a22d2b0d3.png

Далее нам нужно преобразовать данные, возвращаемые из Vision API, прежде чем мы сможем сохранить их в Firestore. Более конкретно, нам необходимо:

  • Перечислите метки, возвращенные для изображения.
  • Получите доминирующий цвет изображения.
  • Определите, безопасна ли картина.

Это делается в коде облачной функции, и рабочие процессы просто вызывают эту функцию:

5e120e70c67779cd.png

Изучите код

Облачная функция называется vision-data-transform . Вы можете проверить его полный код в index.js . Как видите, единственная цель этой функции — выполнить преобразование JSON в JSON, чтобы удобно хранить метаданные изображения в Firestore.

Развертывание в облачных функциях

Перейдите в папку:

cd workflows/functions/vision-data-transform/nodejs

Установите регион по вашему выбору:

export REGION=europe-west1
gcloud config set functions/region ${REGION}

Разверните функцию с помощью:

export SERVICE_NAME=vision-data-transform
gcloud functions deploy ${SERVICE_NAME} \
  --source=. \
  --runtime nodejs10 \
  --entry-point=vision_data_transform \
  --trigger-http \
  --allow-unauthenticated

После развертывания функции шаг transformImageAnalysisData рабочих процессов сможет вызывать эту функцию для преобразования данных Vision API.

9. Подготовьте базу данных

Далее в рабочих процессах необходимо проверить безопасность изображения на основе данных изображения, а затем сохранить информацию об изображении, возвращаемую Vision API, в базу данных Cloud Firestore — быструю, полностью управляемую, бессерверную, облачную базу данных документов NoSQL:

6624c616bc7cd97f.png

Оба эти действия выполняются в рабочих процессах, но вам необходимо создать базу данных Firestore, чтобы хранилище метаданных работало.

Сначала создайте приложение App Engine в регионе, где вам нужна база данных Firestore (требование для Firestore):

export REGION_FIRESTORE=europe-west2
gcloud app create --region=${REGION_FIRESTORE}

Затем создайте базу данных Firestore в том же регионе:

gcloud firestore databases create --region=${REGION_FIRESTORE}

Документы будут созданы в нашей коллекции программно и будут содержать 4 поля:

  • name (строка): имя файла загруженного изображения, которое также является ключом документа.
  • labels (массив строк): метки элементов, распознанных Vision API.
  • цвет (строка): шестнадцатеричный код доминирующего цвета (например, #ab12ef).
  • создано (дата): временная отметка, когда метаданные этого изображения были сохранены.
  • миниатюра (логическое значение): необязательное поле, которое будет присутствовать и иметь значение true, если для этого изображения было создано миниатюрное изображение.

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

gcloud firestore indexes composite create --collection-group=pictures \
  --field-config field-path=thumbnail,order=descending \
  --field-config field-path=created,order=descending

Обратите внимание, что создание индекса может занять до 10 минут или около того.

Как только индекс будет создан, вы сможете увидеть его в Cloud Console:

43af1f5103bf423.png

Шаг рабочих процессов storeMetadata теперь сможет сохранять метаданные изображения в Firestore.

10. Сервис миниатюр (Cloud Run)

Следующим шагом в цепочке является создание миниатюры изображения. Это делается в коде службы Cloud Run, и рабочие процессы вызывают эту службу на этапе thumbnailCall :

84d987647f082b53.png

Изучите код

Сервис Cloud Run называется thumbnails . Вы можете проверить его полный код в index.js .

Создайте и опубликуйте образ контейнера.

Cloud Run запускает контейнеры, но сначала вам необходимо создать образ контейнера (определенный в Dockerfile ). Google Cloud Build можно использовать для создания образов контейнеров, а затем размещения в реестре контейнеров Google.

Перейдите в папку:

cd workflows/services/thumbnails/nodejs

Строить:

export SERVICE_SRC=thumbnails
export SERVICE_NAME=${SERVICE_SRC}-service
gcloud builds submit \
  . \
  --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}

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

Развертывание в Cloud Run

Установите некоторые необходимые переменные и конфигурацию:

export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
gcloud config set run/region ${REGION}
gcloud config set run/platform managed

Разверните с помощью следующей команды:

gcloud run deploy ${SERVICE_NAME} \
    --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
    --no-allow-unauthenticated \
    --memory=1Gi \
    --update-env-vars BUCKET_THUMBNAILS=${BUCKET_THUMBNAILS}

После развертывания службы шаг thumbnailCall рабочих процессов сможет вызывать эту службу.

11. Сервис коллажей (Cloud Run)

Следующим по цепочке будет создание коллажа из самых последних изображений. Это делается в коде службы Cloud Run, и рабочие процессы вызывают эту службу на этапе collageCall :

591e36149066e1ba.png

Изучите код

Сервис Cloud Run называется collage . Вы можете проверить его полный код в index.js .

Создайте и опубликуйте образ контейнера.

Cloud Run запускает контейнеры, но сначала вам необходимо создать образ контейнера (определенный в Dockerfile ). Google Cloud Build можно использовать для создания образов контейнеров, а затем размещения в реестре контейнеров Google.

Перейдите в папку:

cd services/collage/nodejs

Строить:

export SERVICE_SRC=collage
export SERVICE_NAME=${SERVICE_SRC}-service
gcloud builds submit \
  . \
  --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}

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

Развертывание в Cloud Run

Установите некоторые необходимые переменные и конфигурацию:

export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
gcloud config set run/region ${REGION}
gcloud config set run/platform managed

Развертывать:

gcloud run deploy ${SERVICE_NAME} \
    --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
    --no-allow-unauthenticated \
    --memory=1Gi \
    --update-env-vars BUCKET_THUMBNAILS=${BUCKET_THUMBNAILS}

После развертывания службы вы можете проверить, работают ли обе службы в разделе Cloud Run облачной консоли, и шаг collageCall рабочих процессов сможет вызвать эту службу:

3ae9873f4cbbf423.png

12. Развертывание рабочих процессов

Мы развернули все внешние зависимости рабочих процессов. Все оставшиеся шаги ( finalizeCompleted , pictureGarbageCollectionGCS , pictureGarbageCollectionFirestore , deleteCompleted ) могут быть выполнены самим Workflows.

Пришло время развернуть рабочие процессы!

Перейдите в папку, содержащую файл workflows.yaml , и разверните его с помощью:

export WORKFLOW_REGION=europe-west4
export WORKFLOW_NAME=picadaily-workflows
gcloud workflows deploy ${WORKFLOW_NAME} \
  --source=workflows.yaml \
  --location=${WORKFLOW_REGION}

Через несколько секунд рабочий процесс должен развернуться, и вы увидите его в разделе «Рабочие процессы» Cloud Console:

94a720149e5df9c5.png

Вы можете нажать на рабочий процесс и отредактировать его, если хотите. Во время редактирования вы получаете красивое визуальное представление рабочего процесса:

55441b158f6027f3.png

Вы также можете выполнить рабочий процесс из Cloud Console вручную с правильными параметрами. Вместо этого мы выполним его автоматически в ответ на события Cloud Storage на следующем шаге.

13. Триггеры рабочих процессов (облачные функции)

Рабочий процесс развернут и готов. Теперь нам нужно запускать рабочие процессы при создании или удалении файла в корзине Cloud Storage. Это события storage.object.finalize и storage.object.delete соответственно.

Рабочие процессы имеют API и клиентские библиотеки для создания, управления и выполнения рабочих процессов, которые вы можете использовать. В этом случае вы будете использовать API выполнения рабочих процессов и, в частности, его клиентскую библиотеку Node.js для запуска рабочего процесса.

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

c4d79646de729e4.png

Изучите код

Облачная функция называется trigger-workflow . Вы можете проверить его полный код в index.js .

Развертывание в облачных функциях

Перейдите в папку:

cd workflows/functions/trigger-workflow/nodejs

Установите некоторые необходимые переменные и конфигурацию:

export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
export WORKFLOW_NAME=picadaily-workflows
export WORKFLOW_REGION=europe-west4
export COLLAGE_URL=$(gcloud run services describe collage-service --format 'value(status.url)')
export THUMBNAILS_URL=$(gcloud run services describe thumbnails-service --format 'value(status.url)')
export VISION_DATA_TRANSFORM_URL=$(gcloud functions describe vision-data-transform --format 'value(httpsTrigger.url)')
gcloud config set functions/region ${REGION}

Разверните функцию, отвечающую на события завершения:

export SERVICE_NAME=trigger-workflow-on-finalize
gcloud functions deploy ${SERVICE_NAME} \
  --source=. \
  --runtime nodejs10 \
  --entry-point=trigger_workflow \
  --trigger-resource=${BUCKET_PICTURES} \
  --trigger-event=google.storage.object.finalize \
  --allow-unauthenticated \
  --set-env-vars GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT},WORKFLOW_REGION=${WORKFLOW_REGION},WORKFLOW_NAME=${WORKFLOW_NAME},THUMBNAILS_URL=${THUMBNAILS_URL},COLLAGE_URL=${COLLAGE_URL},VISION_DATA_TRANSFORM_URL=${VISION_DATA_TRANSFORM_URL}

Разверните вторую функцию, реагирующую на события удаления:

export SERVICE_NAME=trigger-workflow-on-delete
gcloud functions deploy ${SERVICE_NAME} \
  --source=. \
  --runtime nodejs10 \
  --entry-point=trigger_workflow \
  --trigger-resource=${BUCKET_PICTURES} \
  --trigger-event=google.storage.object.delete \
  --allow-unauthenticated \
  --set-env-vars GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT},WORKFLOW_REGION=${WORKFLOW_REGION},WORKFLOW_NAME=${WORKFLOW_NAME},THUMBNAILS_URL=${THUMBNAILS_URL},COLLAGE_URL=${COLLAGE_URL},VISION_DATA_TRANSFORM_URL=${VISION_DATA_TRANSFORM_URL}

Когда развертывание будет завершено, вы увидите обе функции в Cloud Console:

7d60c8b7851f39f5.png

14. Интерфейс (App Engine)

На этом этапе вы создаете веб-интерфейс в Google App Engine из Pic-a-daily. Лабораторная работа 4. Создайте веб-интерфейс , который позволит пользователям загружать изображения из веб-приложения, а также просматривать загруженные изображения и их миниатюры.

223fb2281614d053.png

Вы можете узнать больше о App Engine и прочитать описание кода в Pic-a-daily: Лабораторная работа 4 — Создание веб-интерфейса .

Изучите код

Приложение App Engine называется frontend . Вы можете проверить его полный код в index.js .

Развертывание в App Engine

Перейдите в папку:

cd frontend

Установите регион по вашему выбору, а также замените GOOGLE_CLOUD_PROJECT в app.yaml фактическим идентификатором проекта:

export REGION=europe-west1
gcloud config set compute/region ${REGION}
sed -i -e "s/GOOGLE_CLOUD_PROJECT/${GOOGLE_CLOUD_PROJECT}/" app.yaml

Развертывать:

gcloud app deploy app.yaml -q

Через минуту-две вам сообщат, что приложение обслуживает трафик:

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 8 files to Google Cloud Storage                ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://GOOGLE_CLOUD_PROJECT.appspot.com]
You can stream logs from the command line by running:
  $ gcloud app logs tail -s default
To view your application in the web browser run:
  $ gcloud app browse

Вы также можете посетить раздел App Engine в Cloud Console, чтобы увидеть, что приложение развернуто, и изучить такие функции App Engine, как управление версиями и разделение трафика:

f4bd5f4de028bd83.png

15. Проверьте рабочие процессы

Чтобы протестировать, перейдите по URL-адресу App Engine по умолчанию для приложения ( https://<YOUR_PROJECT_ID>.appspot.com/ ), и вы увидите работающий интерфейс интерфейса!

1649ac060441099.png

Загрузите изображение. Это должно активировать рабочие процессы, и вы сможете увидеть выполнение рабочего процесса в Active состоянии в Cloud Console:

b5a2a3d7a2bc094.png

После завершения рабочих процессов вы можете щелкнуть идентификатор выполнения и просмотреть результаты работы различных сервисов:

8959df5098c21548.png

Загрузите еще 3 фотографии. Вы также должны увидеть обновленные миниатюры и коллажи изображений в сегментах Cloud Storage и интерфейсе App Engine:

d90c786ff664a5dc.png

16. Очистка (необязательно)

Если вы не собираетесь сохранять приложение, вы можете очистить ресурсы, чтобы сэкономить средства и стать в целом хорошим гражданином облака, удалив весь проект:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT} 

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

Вы создали оркестрованную версию приложения, используя рабочие процессы для оркестрации и вызова служб.

Что мы рассмотрели

  • Механизм приложений
  • Облачный пожарный магазин
  • Облачные функции
  • Облачный бег
  • Рабочие процессы