Развертывание веб-приложения Python Flask в гибкой среде App Engine

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

В этой практической работе вы научитесь разворачивать веб-приложение Python Flask в гибкой среде App Engine. Пример приложения позволяет пользователю загрузить фотографию лица человека и узнать, насколько вероятно, что он счастлив. Приложение использует API Google Cloud для Vision, Storage и Datastore.

О App Engine

Приложения Google App Engine легко создавать, поддерживать и масштабировать по мере изменения потребностей в трафике и хранении данных. С App Engine не нужно обслуживать серверы. Вы просто загружаете приложение, и оно готово к работе.

Приложения App Engine автоматически масштабируются в зависимости от входящего трафика. Балансировка нагрузки, микросервисы, авторизация, базы данных SQL и NoSQL, разделение трафика, ведение журнала, поиск, управление версиями, развёртывание и откат, а также сканирование безопасности — всё это поддерживается изначально и обладает широкими возможностями настройки.

Гибкая среда App Engine поддерживает все следующие языки программирования: C#, Go, Java, Node.js, PHP, Python и Ruby. Гибкая среда App Engine запускает ваше приложение в контейнерах Docker, работающих на виртуальных машинах Google Compute Engine. Стандартная среда App Engine — это альтернативный вариант для некоторых языков, включая Python. Стандартная среда App Engine запускает ваше приложение в более ограниченной среде-песочнице. Подробнее см. в статье «Выбор среды App Engine» .

Чему вы научитесь

  • Как развернуть простое веб-приложение в гибкой среде App Engine
  • Как получить доступ к клиентским библиотекам Google Cloud для Vision, Storage и Datastore
  • Как использовать Google Cloud Console и Google Cloud SDK для управления различными облачными ресурсами
  • Как использовать Cloud Shell

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

  • Знакомство с Python
  • Знакомство со стандартными текстовыми редакторами Linux, такими как Vim, Emacs или Nano

Создание проекта

Если у вас ещё нет учётной записи Google (Gmail или Google Apps), необходимо её создать . Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и создайте новый проект:

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

Биллинг

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

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

Новые пользователи Google Cloud Platform имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Хотя Google Cloud можно управлять удалённо с вашего ноутбука, в этой лабораторной работе мы будем использовать Google Cloud Shell — среду командной строки, работающую в облаке. Эта виртуальная машина на базе Debian содержит все необходимые инструменты разработки ( gcloud , python , virtualenv , pip и другие), предоставляет постоянный домашний каталог объёмом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Это означает, что для этой лабораторной работы вам понадобится только браузер (да, он работает на Chromebook).

Чтобы активировать Google Cloud Shell, в консоли разработчика просто нажмите кнопку в правом верхнем углу (подготовка и подключение к среде займет всего несколько минут):

После подключения к облачной оболочке вы должны увидеть, что вы уже аутентифицированы и что проекту уже присвоен ваш PROJECT_ID :

gcloud auth list
Credentialed accounts:
- <myaccount>@<mydomain>.com (active)
gcloud config list project
[core]
Project = <PROJECT_ID>

Если по какой-то причине проект не установлен, просто выполните следующую команду:

gcloud config set project <PROJECT_ID>

Ищете свой PROJECT_ID ? Проверьте, какой идентификатор проекта вы использовали при настройке, или найдите его на панели управления консоли:

В командной строке Cloud Shell выполните следующую команду, чтобы клонировать репозиторий Github:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

Измените каталог на python-docs-samples/codelabs/flex_and_vision :

cd python-docs-samples/codelabs/flex_and_vision

Прежде чем начать использовать API Vision, Storage и Datastore, необходимо включить API с помощью следующих команд:

gcloud services enable vision.googleapis.com
gcloud services enable storage-component.googleapis.com
gcloud services enable datastore.googleapis.com

Для отправки запросов к API Vision, Storage и Datastore вам потребуются учётные данные сервисной учётной записи. Учётные данные сервисной учётной записи вашего проекта можно сгенерировать с помощью инструмента gcloud .

Установите переменную среды для вашего PROJECT_ID , заменив [YOUR_PROJECT_ID] на ваш собственный идентификатор проекта:

export PROJECT_ID=[YOUR_PROJECT_ID]

Создайте учетную запись службы для доступа к API Google Cloud при локальном тестировании:

gcloud iam service-accounts create codelab \
  --display-name "My Codelab Service Account"

Предоставьте вашей новой учетной записи службы соответствующие разрешения:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:codelab@${PROJECT_ID}.iam.gserviceaccount.com \
--role roles/owner

После создания учетной записи службы создайте ключ учетной записи службы:

gcloud iam service-accounts keys create ~/key.json \
--iam-account codelab@${PROJECT_ID}.iam.gserviceaccount.com

Эта команда генерирует ключ учетной записи службы, сохраняемый в JSON-файле с именем key.json в вашем домашнем каталоге.

Используя абсолютный путь сгенерированного ключа, задайте переменную среды для ключа вашей учетной записи службы в Cloud Shell :

export GOOGLE_APPLICATION_CREDENTIALS="/home/${USER}/key.json"

Подробнее об аутентификации Vision API можно прочитать здесь.

Запуск виртуальной среды и установка зависимостей

Создайте изолированную среду Python 3 с именем env с помощью virtualenv :

virtualenv -p python3 env

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

source env/bin/activate

Используйте pip для установки зависимостей вашего проекта из файла requirements.txt :

pip install -r requirements.txt

Файл requirements.txt содержит список зависимостей пакетов, необходимых для вашего проекта. Приведённая выше команда загрузила все эти зависимости в virtualenv .

Создание приложения App Engine

Затем создайте экземпляр App Engine, используя:

gcloud app create

Создание контейнера хранения

Сначала задайте переменную окружения CLOUD_STORAGE_BUCKET, равную имени вашего PROJECT_ID . (Обычно рекомендуется называть контейнер так же, как ваш PROJECT_ID , для удобства).

export CLOUD_STORAGE_BUCKET=${PROJECT_ID}

Наше приложение использует контейнер Cloud Storage, который вам нужно создать в Cloud Shell с помощью инструмента gsutil . Выполните следующую команду, чтобы создать контейнер с тем же именем, что и ваш PROJECT_ID .

gsutil mb gs://${PROJECT_ID}

Запуск приложения

python main.py

После запуска приложения нажмите на значок «Веб-просмотр». на панели инструментов Cloud Shell выберите «Предварительный просмотр на порту 8080».

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

Скриншот 2017-02-23 в 19:22:50.png

Попробуйте загрузить фотографию с человеческим лицом. Нажмите кнопку «Выбрать файл» , выберите изображение на компьютере и нажмите «Отправить» .

После загрузки фотографии вы должны увидеть что-то вроде этого:

Скриншот 2017-02-23 в 7.32.08 PM.png

Пример макета кода

Образец имеет следующую компоновку:

templates/
  homepage.html   /* HTML template that uses Jinja2 */
app.yaml          /* App Engine application configuration file */
main.py           /* Python Flask web application */
requirements.txt  /* List of dependencies for the project */

main.py

Этот файл Python представляет собой веб-приложение Flask. Приложение позволяет пользователям отправлять фотографии (предпочтительно с лицами), которые хранятся в облачном хранилище и анализируются с помощью функции распознавания лиц API Cloud Vision. Ключевая информация о каждой фотографии хранится в Datastore, NoSQL-базе данных Google Cloud Platform, доступ к которой осуществляется при каждом посещении веб-сайта пользователем.

Это приложение использует клиентские библиотеки Google Cloud Platform для Storage, Datastore и Vision. Эти клиентские библиотеки упрощают доступ к облачным API из ваших любимых языков программирования.

Давайте рассмотрим некоторые ключевые фрагменты кода.

Раздел импорта вверху — это место, куда мы импортируем различные пакеты, необходимые для нашего кода. Вот как мы импортируем клиентские библиотеки Google Cloud для Datastore, Storage и Vision:

from google.cloud import datastore
from google.cloud import storage
from google.cloud import vision

Вот код, описывающий, что происходит, когда пользователь посещает корневой URL-адрес веб-сайта. Мы создаём клиентский объект Datastore, который используется для доступа к клиентской библиотеке Datastore. Затем мы выполняем запрос к Datastore на предмет сущностей типа Faces . Наконец, мы визуализируем наш HTML-шаблон, передавая ему image_entities, извлечённые из Datastore, в качестве переменной.

@app.route('/')
def homepage():
    # Create a Cloud Datastore client.
    datastore_client = datastore.Client()

    # Use the Cloud Datastore client to fetch information from Datastore about
    # each photo.
    query = datastore_client.query(kind='Faces')
    image_entities = list(query.fetch())

    # Return a Jinja2 HTML template and pass in image_entities as a parameter.
    return render_template('homepage.html', image_entities=image_entities)

Давайте рассмотрим, как сущности сохраняются в Datastore. Datastore — это решение Google Cloud для работы с базами данных NoSQL. Данные хранятся в объектах, называемых сущностями . Каждой сущности назначается уникальный идентификационный ключ , который можно создать с помощью типа и строки имени ключа . Тип — это организационный контейнер для типа сущности . Например, мы можем настроить типы для фотографий, людей и животных.

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

    # Create a Cloud Datastore client.
    datastore_client = datastore.Client()

    # Fetch the current date / time.
    current_datetime = datetime.now()

    # The kind for the new entity.
    kind = 'Faces'

    # The name/ID for the new entity.
    name = blob.name

    # Create the Cloud Datastore key for the new entity.
    key = datastore_client.key(kind, name)

    # Construct the new entity using the key. Set dictionary values for entity
    # keys blob_name, storage_public_url, timestamp, and joy.
    entity = datastore.Entity(key)
    entity['blob_name'] = blob.name
    entity['image_public_url'] = blob.public_url
    entity['timestamp'] = current_datetime
    entity['joy'] = face_joy

    # Save the new entity to Datastore.
    datastore_client.put(entity)

Доступ к клиентским библиотекам Storage и Vision осуществляется программно, аналогично Datastore. Вы можете самостоятельно открыть файл main.py с помощью vim , emacs или nano, чтобы изучить весь пример кода.

Узнайте больше о Flask на сайте http://flask.pocoo.org/ .

Подробнее о клиентских библиотеках можно узнать по адресу https://googlecloudplatform.github.io/google-cloud-python/ .

домашняя страница.html

Веб-фреймворк Flask использует Jinja2 в качестве шаблонизатора. Это позволяет передавать переменные и выражения из main.py в homepage.html , которые заменяются значениями после отрисовки страницы.

Узнайте больше о Jinja2 по адресу http://jinja.pocoo.org/docs/2.9/templates/ .

Этот HTML-шаблон Jinja2 отображает форму для отправки фотографий в базу данных. Он также отображает каждое ранее отправленное изображение вместе с именем файла, датой/временем загрузки и вероятностью того, что лицо, обнаруженное Vision API, является счастливым.

домашняя страница.html

<h1>Google Cloud Platform - Face Detection Sample</h1>

<p>This Python Flask application demonstrates App Engine Flexible, Google Cloud
Storage, Datastore, and the Cloud Vision API.</p>

<br>

<html>
  <body>
    <form action="upload_photo" method="POST" enctype="multipart/form-data">
      Upload File: <input type="file" name="file"><br>
      <input type="submit" name="submit" value="Submit">
    </form>
    
  </body>
</html>

App Engine Flexible использует файл app.yaml для описания конфигурации развёртывания приложения. Если этот файл отсутствует, App Engine попытается определить конфигурацию развёртывания автоматически. Тем не менее, рекомендуется предоставить этот файл.

Далее вам нужно будет отредактировать файл app.yaml в любом редакторе на ваш выбор: vim , nano или emacs . Мы будем использовать редактор nano :

nano app.yaml

app.yaml

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
    python_version: 3

env_variables:
    CLOUD_STORAGE_BUCKET: <your-cloud-storage-bucket>

Это базовая конфигурация, необходимая для развёртывания приложения Python 3 App Engine Flex. Подробнее о настройке App Engine можно узнать здесь .

Открыв файл app.yaml , замените < your-cloud-storage-bucket > на имя вашего контейнера Cloud Storage. (Если вы забыли имя контейнера Cloud Storage, скопируйте идентификатор проекта GCP из Qwiklabs, он совпадает.) В разделе env_variables настраиваются переменные среды, которые будут использоваться в файле main.py после развёртывания приложения.

Теперь вы можете закрыть сохранение и закрыть файл в nano с помощью сочетания клавиш ( Ctrl + x ), после чего появится запрос:

Скриншот 2017-02-17 в 16:47.12.png

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

Скриншот 2017-02-24 в 16:18:23.png

Разверните свое приложение в App Engine с помощью gcloud :

gcloud app deploy

После развертывания приложения вы можете посетить его, открыв URL-адрес https://<PROJECT_ID>.appspot.com в своем веб-браузере.

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

На этом этапе вы настроили веб-приложение Python и развернули его в гибкой среде App Engine.

Вы узнали, как написать и развернуть свое первое веб-приложение App Engine Flexible!

Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud Platform за ресурсы, используемые в этом кратком руководстве:

  • Перейдите в консоль облачной платформы .
  • Выберите проект, который вы хотите закрыть, затем нажмите «Удалить» вверху: это запланирует удаление проекта.

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

Лицензия

Данная работа распространяется по лицензии Creative Commons Attribution 2.0 Generic License.