Разверните базовую версию "Google Translate" приложение на Python 2 Cloud Run (Docker)

1. Обзор

Эта серия практических занятий (самостоятельное обучение) призвана помочь разработчикам понять различные варианты развертывания своих приложений. В этом практическом занятии вы узнаете, как использовать API Google Cloud Translation с Python и запускать приложения локально или развертывать их на облачной платформе бессерверных вычислений (App Engine, Cloud Functions или Cloud Run). Пример приложения, представленный в репозитории этого руководства , можно развернуть (как минимум) восемью различными способами с минимальными изменениями конфигурации:

  1. Локальный Flask-сервер (Python 2)
  2. Локальный Flask-сервер (Python 3)
  3. App Engine (Python 2)
  4. App Engine (Python 3)
  5. Облачные функции (Python 3)
  6. Cloud Run (Python 2 через Docker)
  7. Cloud Run (Python 3 через Docker)
  8. Cloud Run (Python 3 через Cloud Buildpacks)

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

Вы узнаете, как

Что вам понадобится

  • Проект Google Cloud с активной учетной записью Cloud Billing.
  • Для локального запуска требуется установленный Flask, либо облачная бессерверная вычислительная платформа с поддержкой облачных развертываний.
  • Базовые навыки работы с Python.
  • Практические навыки работы с основными командами операционной системы.

Опрос

Как вы будете использовать этот учебный материал?

Прочитайте текст и выполните упражнения. Читайте только это

Как бы вы оценили свой опыт работы с Python?

Новичок Средний Профессионал

Как бы вы оценили свой опыт использования сервисов Google Cloud?

Новичок Средний Профессионал

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

Настройка среды для самостоятельного обучения

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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

3. Включите API перевода.

Включение облачных API

В этом разделе вы узнаете, как включить API Google в целом. Для нашего примера приложения вам потребуется включить Cloud Translation API , Cloud Run и Cloud Artifact Registry .

Введение

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

Вариант 1: Через Cloud Shell или интерфейс командной строки.

Хотя включение API из Cloud Console более распространено, некоторые разработчики предпочитают делать все из командной строки. Для этого необходимо найти «имя сервиса» API. Оно выглядит как URL: SERVICE_NAME . Эти .googleapis.com можно найти в таблице поддерживаемых продуктов , или же их можно получить программным путем с помощью Google Discovery API .

Вооружившись этой информацией, с помощью Cloud Shell (или вашей локальной среды разработки с установленным инструментом командной строки gcloud ) вы можете включить API следующим образом:

gcloud services enable SERVICE_NAME.googleapis.com

Например, эта команда включает API Cloud Vision:

gcloud services enable vision.googleapis.com

Эта команда включает App Engine:

gcloud services enable appengine.googleapis.com

Вы также можете включить несколько API одним запросом. Например, эта команда в командной строке включает Cloud Run, Cloud Artifact Registry и Cloud Translation API:

gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

Вариант 2: Из облачной консоли

Вы также можете включить Vision API в API Manager. В консоли Cloud перейдите в API Manager и выберите Library .

fb0f1d315f122d4a.png

Если вы хотите включить API Cloud Vision, начните вводить "vision" в строку поиска, и появятся все, что соответствует вашему предыдущему вводу:

2275786a24f8f204.png

Выберите API, который хотите включить, и нажмите «Включить» :

2556f923b628e31.png

Расходы

Хотя многие API Google можно использовать бесплатно, использование продуктов и API Google Cloud не является бесплатным. При включении API Cloud вас могут попросить указать активный платежный аккаунт. Однако важно отметить, что некоторые продукты Google Cloud имеют тарифный план «Всегда бесплатно» (ежедневно/ежемесячно), превышение которого необходимо для начисления платы; в противном случае с вашей кредитной карты (или указанного платежного инструмента) плата списываться не будет.

Перед включением любого API пользователям следует ознакомиться с информацией о ценах, особенно с наличием бесплатного тарифа и, если таковой имеется, то с его условиями. Если вы включаете API Cloud Vision, вам следует проверить страницу с информацией о ценах . У Cloud Vision есть бесплатная квота, и пока вы в целом не превышаете ее лимиты (в течение каждого месяца), с вас не должно взиматься никакая плата.

Цены и бесплатные тарифные планы различаются в зависимости от используемого API Google. Примеры:

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

Краткое содержание

Теперь, когда вы знаете, как включить API Google в целом, перейдите в Менеджер API и включите Cloud Translation API, Cloud Run и Cloud Artifact Registry (если вы еще этого не сделали). Первый необходимо включить, потому что наше приложение его использует. Второй необходимо включить, потому что именно там хранятся образы контейнеров перед развертыванием для запуска службы Cloud Run, поэтому его и нужно включить. Если вы предпочитаете включить все API с помощью инструмента gcloud , выполните следующую команду в терминале:

gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

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

4. Получите пример кода приложения.

Клонируйте код из репозитория локально или в Cloud Shell (используя команду git clone ), либо загрузите ZIP-файл, нажав на зеленую кнопку «Код» , как показано на следующем скриншоте:

5cd6110c4414cf65.png

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

5. Обзор демонстрационного приложения

Пример приложения — это простая версия Google Translate , которая предлагает пользователям ввести текст на английском языке и получить его эквивалентный перевод на испанский. Теперь откройте файл main.py , чтобы увидеть, как он работает. Если опустить закомментированные строки о лицензировании, он выглядит так вверху и внизу:

from flask import Flask, render_template, request
import google.auth
from google.cloud import translate

app = Flask(__name__)
_, PROJECT_ID = google.auth.default()
TRANSLATE = translate.TranslationServiceClient()
PARENT = 'projects/{}'.format(PROJECT_ID)
SOURCE, TARGET = ('en', 'English'), ('es', 'Spanish')

# . . . [translate() function definition] . . .

if __name__ == '__main__':
    import os
    app.run(debug=True, threaded=True, host='0.0.0.0',
            port=int(os.environ.get('PORT', 8080)))
  1. Импортированные модули добавляют функциональность Flask, модуль google.auth и клиентскую библиотеку Cloud Translation API.
  2. Глобальные переменные представляют собой приложение Flask, идентификатор проекта Cloud, клиент API перевода, родительский «путь» для вызовов API перевода, а также исходный и целевой языки. В данном случае это английский ( en ) и испанский ( es ), но вы можете изменить эти значения на другие коды языков, поддерживаемые API перевода Cloud .
  3. Большой блок if внизу используется в руководстве по локальному запуску этого приложения — он использует сервер разработки Flask для обслуживания нашего приложения. Этот раздел также присутствует в руководствах по развертыванию в Cloud Run на случай, если веб-сервер не включен в контейнер. Вам будет предложено включить включение сервера в контейнер, но если вы это пропустите, код приложения будет использовать сервер разработки Flask. (Это не проблема для App Engine или Cloud Functions, поскольку это платформы с исходным кодом, то есть Google Cloud предоставляет и запускает веб-сервер по умолчанию.)

Наконец, в середине файла main.py находится сердце приложения — функция translate() :

@app.route('/', methods=['GET', 'POST'])
def translate(gcf_request=None):
    """
    main handler - show form and possibly previous translation
    """

    # Flask Request object passed in for Cloud Functions
    # (use gcf_request for GCF but flask.request otherwise)
    local_request = gcf_request if gcf_request else request

    # reset all variables (GET)
    text = translated = None

    # if there is data to process (POST)
    if local_request.method == 'POST':
        text = local_request.form['text']
        data = {
            'contents': [text],
            'parent': PARENT,
            'target_language_code': TARGET[0],
        }
        # handle older call for backwards-compatibility
        try:
            rsp = TRANSLATE.translate_text(request=data)
        except TypeError:
            rsp = TRANSLATE.translate_text(**data)
        translated = rsp.translations[0].translated_text

    # create context & render template
    context = {
        'orig':  {'text': text, 'lc': SOURCE},
        'trans': {'text': translated, 'lc': TARGET},
    }
    return render_template('index.html', **context)

Основная функция принимает ввод пользователя и вызывает API перевода для выполнения основной работы. Давайте разберем это подробнее:

  1. Проверьте, поступают ли запросы от Cloud Functions, используя переменную local_request . Cloud Functions отправляет собственный объект запроса Flask, тогда как все остальные (работающие локально или развертываемые в App Engine или Cloud Run) получают объект запроса непосредственно от Flask.
  2. Сбросьте основные переменные формы. Это в первую очередь касается GET-запросов, поскольку в POST-запросах эти переменные будут заменены другими данными.
  3. Если это POST-запрос, получите текст для перевода и создайте JSON-структуру, представляющую требования к метаданным API. Затем вызовите API, используя в случае, если пользователь использует более старую библиотеку, предыдущую версию API.
  4. В любом случае, отформатируйте фактические результаты (POST) или отключите данные (GET) в контексте шаблона и выполните отрисовку.

Визуальная часть приложения находится в шаблоне файла index.html . Она отображает результаты предыдущего перевода (в противном случае — пустое поле), после чего следует форма с запросом на перевод:

<!doctype html>
<html><head><title>My Google Translate 1990s</title><body>
<h2>My Google Translate (1990s edition)</h2>

{% if trans['text'] %}
    <h4>Previous translation</h4>
    <li><b>Original</b>:   {{ orig['text'] }}  (<i>{{ orig['lc'][0] }}</i>)</li>
    <li><b>Translated</b>: {{ trans['text'] }} (<i>{{ trans['lc'][0] }}</i>)</li>
{% endif %}

<h4>Enter <i>{{ orig['lc'][1] }}</i> text to translate to <i>{{ trans['lc'][1] }}</i>:</h4>
<form method="POST"><input name="text"><input type="submit"></form>
</body></html>

6. Разверните сервис

Теперь вы готовы развернуть свою службу перевода в Cloud Run, выполнив следующую команду:

gcloud run deploy translate --source . --allow-unauthenticated --platform managed

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

$ gcloud run deploy translate --source . --allow-unauthenticated --platform managed
Please specify a region:
 [1] asia-east1
 [2] asia-east2
. . . (other regions) . . .
 [28] us-west4
 [29] cancel
Please enter your numeric choice:  REGION_CHOICE

To make this the default region, run `gcloud config set run/region REGION`.

Deploying from source requires an Artifact Registry repository to
store build artifacts. A repository named [cloud-run-source-deploy] in
 region [REGION] will be created.

Do you want to continue (Y/n)?

This command is equivalent to running "gcloud builds submit --pack image=[IMAGE] ." and "gcloud run deploy translate --image [IMAGE]"

Building . . . and deploying container to Cloud Run service [translate] in project [PROJECT_ID] region [REGION]
✓ Building and deploying... Done.
  ✓ Creating Container Repository...
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/60e1b
  9bb-b991-4b4e-8d8a-HASH?project=PROJECT_NUMBER].
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [translate] revision [translate-00001-xyz] has been deployed and is serving 100 percent of traffic.
Service URL: https://SVC_NAME-HASH-REG_ABBR.a.run.app

Теперь, когда ваше приложение доступно по всему миру, вы сможете получить к нему доступ по URL-адресу, содержащему идентификатор вашего проекта, как показано в результатах развертывания:

169f6edf5f7d2068.png

Переведите что-нибудь, чтобы увидеть, как это работает!

31554e71cb80f1b4.png

7. Заключение

Поздравляем! Вы научились включать API облачного перевода, получать необходимые учетные данные и развертывать простое веб-приложение в Python 2 Cloud Run! Подробнее об этом развертывании можно узнать из таблицы в репозитории .

Уборка

API облачного перевода позволяет бесплатно переводить фиксированное количество символов в месяц . App Engine также имеет бесплатную квоту , как и Cloud Functions и Cloud Run . За превышение квоты взимается плата. Если вы планируете перейти к следующему практическому занятию, вам не нужно закрывать приложение.

Однако, если вы пока не готовы перейти к следующему уроку или опасаетесь, что интернет обнаружит только что развернутое вами приложение, отключите приложение App Engine , удалите облачную функцию или отключите службу Cloud Run , чтобы избежать дополнительных расходов. Когда вы будете готовы перейти к следующему практическому занятию, вы можете снова включить её. С другой стороны, если вы не собираетесь продолжать работу над этим приложением или другими практическими занятиями и хотите полностью удалить всё, вы можете закрыть свой проект .

Кроме того, развертывание на бессерверной вычислительной платформе Google Cloud влечет за собой незначительные затраты на сборку и хранение . Cloud Build, как и Cloud Storage , имеет собственную бесплатную квоту. Для большей прозрачности Cloud Build создает образ вашего приложения, который затем хранится либо в Cloud Container Registry , либо в Artifact Registry , его преемнике. Хранение этого образа расходует часть этой квоты, как и исходящий трафик сети при передаче этого образа в сервис. Однако вы можете проживать в регионе, где нет такого бесплатного уровня, поэтому следите за использованием хранилища, чтобы минимизировать потенциальные затраты.

8. Дополнительные ресурсы

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

Дополнительное исследование

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

  1. Выполните все остальные задания этого практического руководства для локального запуска или развертывания на бессерверных вычислительных платформах Google Cloud (см. README репозитория ).
  2. Выполните это руководство, используя другой язык программирования.
  3. Измените это приложение, чтобы оно поддерживало другие исходные или целевые языки.
  4. Обновите это приложение, чтобы оно могло переводить текст на несколько языков; измените файл шаблона, чтобы в нем был выпадающий список поддерживаемых целевых языков.

Узнать больше

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpacks, Container Registry, Artifact Registry

Google Cloud Translation и Google ML Kit

Другие продукты/страницы Google Cloud

Python и Flask

Лицензия

Данный учебный материал распространяется под лицензией Creative Commons Attribution 2.0 Generic License, а исходный код в репозитории распространяется под лицензией Apache 2.0.