Расширение поддержки встроенных служб App Engine: часть 1 (модуль 17)

1. Обзор

Серия обучающих материалов Serverless Migration Station (самостоятельные практические уроки) и сопутствующих видеороликов призвана помочь разработчикам бессерверных приложений Google Cloud модернизировать свои приложения, проведя их через одну или несколько миграций, в первую очередь, через отказ от устаревших сервисов. Это делает ваши приложения более портативными, предоставляет больше возможностей и гибкости, позволяя интегрироваться с более широким спектром облачных продуктов и получать к ним доступ, а также упрощает обновление до более новых версий языков программирования. Хотя изначально серия ориентирована на самых первых пользователей облачных сервисов, в первую очередь разработчиков App Engine (стандартная среда), она достаточно широка, чтобы охватить и другие бессерверные платформы, такие как Cloud Functions и Cloud Run , или другие, если это применимо.

Ранее разработчикам приходилось переходить с устаревших «встроенных сервисов» App Engine, таких как Datastore и Memcache, прежде чем они могли обновить версии языка, что представляло собой две потенциально сложные задачи, выполняемые одна за другой. Благодаря тому, что многие ключевые встроенные сервисы стали доступны во втором поколении сервисов App Engine, разработчики теперь могут переносить свои приложения на новейшие среды выполнения, продолжая использовать (большинство) встроенных сервисов. В этом практическом занятии показано, как обновить пример приложения с Python 2 на Python 3, сохранив при этом использование встроенного сервиса Datastore (через библиотеку App Engine NDB). Использование большинства встроенных сервисов требует лишь незначительного обновления кода, как будет рассмотрено в этом руководстве, но есть и другие, требующие более существенных изменений; они будут рассмотрены во «Части 2», последующем модуле и практическом занятии.

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

  • Перенос примера приложения App Engine с Python 2 на Python 3.
  • Обновите конфигурацию приложения, чтобы включить SDK App Engine.
  • Добавьте в приложение код SDK, поддерживающий встроенные сервисы во средах выполнения второго поколения, таких как Python 3.

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

Опрос

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

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

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

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

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

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

2. Предыстория

Первоначальный сервис App Engine был запущен в 2008 году и поставлялся с набором устаревших API (теперь известных как встроенные сервисы ), чтобы разработчикам было удобно создавать и развертывать приложения по всему миру. К этим сервисам относятся Datastore, Memcache и Task Queue. Несмотря на удобство, пользователи стали беспокоиться о переносимости своих приложений при использовании проприетарных API, привязывающих их к App Engine, и хотели, чтобы их приложения были более портативными. Это, в сочетании с тем фактом, что многие из этих встроенных сервисов со временем превратились в самостоятельные облачные продукты, побудило команду App Engine запустить платформу следующего поколения в 2018 году без них.

Перенесёмся в наши дни, когда разработчики на Python 2 стремятся перейти на Python 3. Приложениям на Python 2.x, использующим встроенные сервисы, требовалось отказаться от этих сервисов, прежде чем их можно было портировать на Python 3.x. Это представляло собой две вынужденные миграции подряд, потенциально сложные. Чтобы облегчить этот переход, команда App Engine осенью 2021 года представила «червоточину» в прошлое, позволяющую приложениям, работающим на средах выполнения следующего поколения, получать доступ ко многим из этих встроенных сервисов. Хотя этот релиз не включает все сервисы, доступные в оригинальных средах выполнения, такие основные, как Datastore, Task Queue и Memcache, доступны .

В этом практическом занятии показаны необходимые изменения для обновления вашего приложения до Python 3 с сохранением использования встроенных сервисов. Цель — обеспечить работу ваших приложений на новейших средах выполнения, что позволит вам в дальнейшем перейти от встроенных сервисов к автономным облачным аналогам или сторонним альтернативам в удобное для вас время, а не делать это препятствием для обновления до версии 3.x. Хотя отказ от встроенных сервисов больше не является обязательным, он обеспечивает большую портативность и гибкость в плане размещения ваших приложений, включая переход на платформы, которые лучше подходят для ваших рабочих нагрузок, или просто сохранение использования App Engine при обновлении до более современной версии языка, как описано выше.

В примере приложения Python 2 из модуля 1 используется встроенный сервис Datastore через App Engine NDB. Приложение уже перенесло фреймворки с webapp2 на Flask — это было сделано в рамках практического занятия по модулю 1 — но при этом использование Datastore осталось неизменным.

В этом руководстве описаны следующие шаги:

  1. Подготовка/Настройка
  2. Обновить конфигурацию
  3. Измените код приложения

3. Подготовка/Предварительные работы

В этом разделе объясняется, как:

  1. Настройте свой облачный проект
  2. Получите базовый образец приложения
  3. (Повторное) развертывание и проверка базового приложения.

Эти шаги гарантируют, что вы начнете работу с работоспособным кодом.

1. Настройка проекта

Если вы завершили практическое занятие по модулю 1, мы рекомендуем использовать тот же проект (и код). В качестве альтернативы создайте совершенно новый проект в облаке или используйте другой существующий проект. Убедитесь, что у проекта есть активный платежный аккаунт, в котором включена служба App Engine.

2. Получите базовый образец приложения.

Одно из предварительных условий для этого практического занятия — наличие работающего приложения App Engine из Модуля 1: выполните практическое занятие по Модулю 1 (рекомендуется) или скопируйте приложение Модуля 1 из репозитория. Независимо от того, используете ли вы свой или наш код, мы начнём именно с кода Модуля 1. Это практическое занятие шаг за шагом проведёт вас через каждый этап, завершившись кодом, похожим на тот, что находится в папке «FINISH» репозитория Модуля 7.

Независимо от того, какое приложение из Модуля 1 вы используете, папка должна выглядеть примерно так, как показано ниже, возможно, с дополнительной папкой lib :

$ ls
README.md               appengine_config.py     requirements.txt
app.yaml                main.py                 templates

3. (Повторное) развертывание базового приложения

Выполните следующие шаги для (повторного) развертывания приложения Модуля 1:

  1. Удалите папку lib , если она есть, и выполните команду: pip install -t lib -r requirements.txt , чтобы заново заполнить lib . Возможно, вам потребуется использовать команду pip2 , если у вас установлены Python 2 и 3.
  2. Убедитесь, что вы установили и инициализировали инструмент командной строки gcloud и ознакомились с его использованием.
  3. Укажите свой облачный проект с помощью gcloud config set project PROJECT_ID , если вы не хотите вводить свой PROJECT_ID при каждой команде gcloud .
  4. Разверните демонстрационное приложение с помощью gcloud app deploy
  5. Убедитесь, что приложение «Модуль 1» работает должным образом и без проблем отображает последние посещения (иллюстрация ниже).

a7a9d2b80d706a2b.png

4. Обновите конфигурацию

После успешного выполнения этих шагов и проверки работоспособности вашего веб-приложения, вы готовы перенести его на Python 3, начиная с настройки.

Добавьте SDK в файл requirements.txt

Среда выполнения App Engine Python 3 значительно снижает накладные расходы на использование сторонних библиотек. Все, что необходимо, — это перечислить их в файле requirements.txt . Чтобы использовать встроенные сервисы в Python 3, добавьте в него пакет SDK App Engine, appengine-python-standard . Этот пакет SDK присоединяется к Flask из модуля 1:

flask
appengine-python-standard

Обновите файл app.yaml

Выполните следующие действия, чтобы применить изменения конфигурации к файлу app.yaml :

  1. Замените директиву runtime на поддерживаемую версию Python 3; например, укажите python310 для Python 3.10.
  2. Удалите директивы threadsafe и api_version , поскольку ни одна из них не используется в Python 3.
  3. Удалите раздел handlers полностью, поскольку в этом приложении используются только обработчики скриптов . Если в вашем приложении есть обработчики статических файлов , оставьте их в handlers без изменений.
  4. В отличие от среды выполнения Python 2, среда выполнения Python 2 не поддерживает встроенные сторонние библиотеки . Если в файле app.yaml вашего приложения есть раздел libraries , удалите его целиком. (Необходимые пакеты, как и не встроенные библиотеки, нужно указывать только в requirements.txt .) В нашем примере приложения раздел libraries отсутствует, поэтому переходите к следующему шагу.
  5. Для его использования создайте директиву app_engine_apis со значением true — это соответствует добавлению пакета SDK App Engine в requirements.txt описанному выше.

Краткое описание необходимых изменений в файле app.yaml :

ДО:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

ПОСЛЕ:

runtime: python310
app_engine_apis: true

Другие конфигурационные файлы

Поскольку все сторонние пакеты достаточно указать в requirements.txt , если в appengine_config.py нет ничего особенного, его можно удалить. Аналогично, поскольку все сторонние библиотеки автоматически устанавливаются в процессе сборки, нет необходимости их копировать или добавлять в vendoring, а значит, больше не нужно использовать команду pip install и папку lib , поэтому удалите её. Подводя итог:

  • Удалите файл appengine_config.py
  • Удалите папку lib

На этом завершается внесение всех необходимых изменений в конфигурацию.

5. Измените код приложения.

Для доступа к большинству доступных встроенных сервисов в среде выполнения Python 3 требуется небольшой фрагмент кода, оборачивающий объект приложения Web Server Gateway Interface (WSGI) в main.py Функция-обертка называется google.appengine.api.wrap_wsgi_app() , и вы используете ее, импортировав и обернув ею свой объект WSGI. Внесите следующие изменения, чтобы отразить необходимое обновление для Flask в main.py :

ДО:

from flask import Flask, render_template, request
from google.appengine.ext import ndb

app = Flask(__name__)

ПОСЛЕ:

from flask import Flask, render_template, request
from google.appengine.api import wrap_wsgi_app
from google.appengine.ext import ndb

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)

Примеры использования WSGI-оберток в других Python-фреймворках см. в документации .

Хотя этот пример позволяет вашему приложению получить доступ к большинству встроенных сервисов Python 3, для других, таких как Blobstore и Mail, требуется дополнительный код. Мы рассмотрим эти примеры в другом модуле миграции.

На этом завершаются все необходимые изменения для добавления использования встроенных сервисов App Engine в пример приложения Модуля 1. Приложение уже совместимо с Python 2 и 3, поэтому никаких дополнительных изменений для его переноса на Python 3, кроме тех, что вы уже внесли в конфигурацию, не требуется. Последний шаг: разверните это модифицированное приложение в среде выполнения App Engine Python 3 следующего поколения и подтвердите успешность обновлений.

6. Подведение итогов/Завершение

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

Разверните и проверьте приложение.

Разверните приложение Python 3 с помощью gcloud app deploy и убедитесь, что приложение работает так же, как и в Python 2. Функциональность не меняется, поэтому результат должен быть идентичен приложению из модуля 1:

a7a9d2b80d706a2b.png

Заключительные замечания

Поздравляем вас с первым шагом к переносу ваших приложений, созданных на Python 2 App Engine, на Python 3 с сохранением возможности использования встроенных сервисов.

Уборка

Общий

Если на этом пока всё, мы рекомендуем отключить ваше приложение App Engine, чтобы избежать дополнительных расходов. Однако, если вы хотите продолжить тестирование или эксперименты, платформа App Engine предоставляет бесплатную квоту , поэтому, пока вы не превысите этот лимит, с вас не должны взиматься дополнительные платежи. Это касается вычислительных ресурсов, но за соответствующие услуги App Engine также может взиматься плата, поэтому проверьте страницу с ценами для получения более подробной информации. Если эта миграция включает другие облачные сервисы, они оплачиваются отдельно. В любом случае, если применимо, см. раздел «Информация, относящаяся к этому практическому занятию» ниже.

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

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • Приведенные выше ссылки на хранилища зависят от вашего PROJECT_ID и * LOC *, например, " us ", если ваше приложение размещено в США.

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

Это относится именно к данному практическому занятию.

Перечисленные ниже услуги являются уникальными для данной учебной лаборатории. Для получения более подробной информации обратитесь к документации по каждому продукту:

Следующие шаги

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

  1. Обновление кода с использованием встроенных сервисов, требующее дополнительных изменений в коде.
  2. Переход от пакетных сервисов к автономным облачным продуктам.
  3. Переход с App Engine на другую облачную бессерверную платформу.

Для доступа к другим встроенным сервисам, таким как Blobstore , Mail и Deferred, требуются дополнительные изменения в коде. К модулям миграции, ориентированным на отказ от устаревших встроенных сервисов App Engine, следует отнести следующие:

  • Модуль 2 : Преобразование NDB App Engine в облачную NDB
  • Модули 7-9 : Очередь задач App Engine (передача задач) в облачные задачи
  • Модули 12-13 : От кэша App Engine к облачному хранилищу памяти
  • Модули 15-16 : App Engine Blobstore в облачное хранилище
  • Модули 18-19 : Очередь задач App Engine (запросы на выгрузку) в Cloud Pub/Sub

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

  • Переход с App Engine на Cloud Functions: см. Модуль 11
  • Переход с App Engine на Cloud Run: см. Модуль 4 , чтобы контейнеризировать ваше приложение с помощью Docker, или Модуль 5 , чтобы сделать это без контейнеров, знаний Docker или файлов Dockerfile .

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

Независимо от того, какой модуль миграции вы выберете следующим, весь контент Serverless Migration Station (практические занятия, видео, исходный код [при наличии]) доступен в его репозитории с открытым исходным кодом . README репозитория также содержится информация о том, какие миграции следует рассмотреть и в каком порядке следует выбирать модули миграции.

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

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

Вопросы/отзывы по Codelab

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

Миграционные ресурсы

Ссылки на папки репозитория для Модуля 1 (НАЧАЛО) и Модуля 1b (ЗАВЕРШЕНИЕ) можно найти в таблице ниже. Доступ к ним также можно получить из репозитория для всех миграций кода App Engine .

Кодлаб

Python 2

Python 3

Модуль 1

код

Н/Д

Модуль 17 (данная практическая работа)

Н/Д

код (mod1b-flask)

Онлайн-ресурсы

Ниже приведены онлайн-ресурсы, которые могут быть полезны для данного урока:

пакетные сервисы App Engine

Общая документация App Engine

Прочая информация об облачных сервисах

Видео

Лицензия

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