Разверните базовую версию "Google Translate" приложение на облачных функциях Python 3

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 Google. Для нашего примера приложения вы включите Cloud Translation API и службу Cloud Functions .

Введение

Независимо от того, какие API Google вы хотите использовать в своем приложении, они должны быть включены . В следующем примере показаны два способа включения API Cloud Vision . После того, как вы узнаете, как включить один 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

Если вы хотите включить API Cloud Vision, начните вводить слово «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 Functions (если вы еще этого не сделали), последнее, потому что наше приложение будет использовать его, а также первый, потому что вы развертываете облачную функцию. Если вы предпочитаете делать это из командной строки, введите вместо этого следующую команду:

gcloud services enable cloudfunctions.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 или облачными функциями, поскольку это платформы на основе исходных кодов, то есть 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 . 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. Разверните сервис

Чтобы развернуть службу перевода в облачных функциях (Python 3), выполните следующую команду:

gcloud functions deploy translate --runtime python37 --trigger-http --allow-unauthenticated

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

$ gcloud functions deploy translate --runtime python37 --trigger-http --allow-unauthenticated
Deploying function (may take a while - up to 2 minutes)...⠹
For Cloud Build Stackdriver Logs, visit: https://console.cloud.google.com/logs/viewer?project=PROJECT_ID&advancedFilter=resource.type%3Dbuild%0Aresource.labels.build_id%3D7e32429d-ec36-422c-8a8b-43c4d661a15c%0AlogName%3Dprojects%2FPROJECT_ID%2Flogs%2Fcloudbuild
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
buildId: 7e32429d-ec36-422c-8a8b-43c4d661a15
entryPoint: translate
httpsTrigger:
  securityLevel: SECURE_OPTIONAL
  url: https://REGION-PROJECT_ID.cloudfunctions.net/translate
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/PROJECT_ID/locations/REGION/functions/translate
runtime: python37
serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/gcf-upload-REGION-873f8448-838f-4eb2-beda-3e200a1420d/cb1cbdca-34eb-41d0-88d6-c276d5205fb.zip?GoogleAccessId=service-104690130103@gcf-admin-robot.iam.gserviceaccount.com&Expires=1619139674
status: ACTIVE
timeout: 60s
updateTime: '2021-04-23T00:32:58.065Z'
versionId: '3'

Теперь, когда ваше приложение доступно по всему миру, вы сможете получить к нему доступ по URL-адресу, содержащему идентификатор вашего проекта, как показано в результатах развертывания. URL-адрес должен выглядеть примерно так: https:// REGION - PROJECT_ID .cloudfunctions.net/translate , который зависит от выбранного вами региона, а также идентификатора вашего облачного проекта.

518f1c3165f2096d.png

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

539b52bd25377888.png

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

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

Очистить

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

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

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

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

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

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

Теперь, когда у вас есть некоторый опыт работы с 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.