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

1. Обзор

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

  1. Локальный сервер Flask (Python 2)
  2. Локальный сервер Flask (Python 3)
  3. Механизм приложений (Python 2)
  4. Механизм приложений (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 Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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

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

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

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

Введение

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

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

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

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

gcloud services enable SERVICE_NAME.googleapis.com

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

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. В Cloud Console перейдите в API Manager и выберите Library .

fb0f1d315f122d4a.png

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

2275786a24f8f204.png

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

2556f923b628e31.png

Расходы

Хотя многие API Google можно использовать бесплатно, использование продуктов и API Google Cloud не является бесплатным. При включении Cloud API вас могут попросить указать активную учетную запись для выставления счетов. Однако важно отметить, что некоторые продукты 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, поэтому вам необходимо его включить. Если вы предпочитаете включить их все с помощью инструмента 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, идентификатор облачного проекта, клиент API перевода, родительский «путь к местоположению» для вызовов API перевода, а также исходный и целевой языки. В данном случае это английский ( en ) и испанский ( es ), но вы можете изменить эти значения на другие языковые коды , поддерживаемые Cloud Translation API .
  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. Проверьте, поступают ли запросы от облачных функций, используя переменную local_request . Облачные функции отправляют собственный объект запроса 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. Настройте Docker для создания образа Python 3.

Теперь откройте файл Dockerfile , который без информации о лицензии выглядит так:

#FROM python:3-slim
FROM python:2-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
ENTRYPOINT ["python", "main.py"]

Как вы можете заметить, по умолчанию он настроен для Python 2, поэтому давайте изменим это, отредактировав строку FROM с python:2-slim на python:3-slim или раскомментировав верхнюю строку и удалив старую строку FROM . Когда вы закончите, Dockerfile должен выглядеть так:

FROM python:3-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
ENTRYPOINT ["python", "main.py"]

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

Теперь вы готовы развернуть службу перевода в 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

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

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

Очистить

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

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

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

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

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

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

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

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

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

Google App Engine

Облачные функции Google

Google Cloud Run

Пакеты сборки Google Cloud, реестр контейнеров, реестр артефактов

Google Cloud Translation и Google ML Kit

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

Питон и колба

Лицензия

Это руководство доступно под лицензией Creative Commons Attribution 2.0 Generic License, а исходный код в репозитории — под лицензией Apache 2.