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

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

Введение

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

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, идентификатор проекта 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 Functions (на 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'

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

518f1c3165f2096d.png

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

539b52bd25377888.png

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

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

Уборка

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.