websitelytics

Menu

Google Cloud Platform 101 - простейший сайт на Python в App Engine

Опубликовано: 08 дек 2019

Данная статья предлагает простой пример, на котором можно легко ознакомиться с Google Cloud Platform и процессом развертывания своих приложений в App Engine. В качестве примера мы создадим в нем простейший одностраничный сайт на Python 2.7 - под эту версию питона вы можете найти достаточно большое количество примеров кода для GAE, чтобы потренироваться.

Чем интересен App Engine в принципе? Это в первую очередь несколько ключевых фитч:

Подготовка к созданию приложения

Для начала работы с Google Cloud Platform нужно сделать две простые вещи:

  1. Создать в консоли облака новый проект для данного примера.
  2. Установить на свой компьютер и инициализировать Google Cloud SDK, чтобы работать с облаком через командный интерфейс (CLI).

При инициализии SDK (команда gcloud init) на соответствующем шаге указываем созданный нами проект.

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

gcloud config list

Выбор другого аккаунта:

gcloud auth list
gcloud config set account ACCOUNT

Если вы не залогинены:

gcloud auth login

Выбор другого проекта:

gcloud config set project PROJECT


Создаем локально файлы проекта

Вспомогательные файлы приложения

Создадим папку для нашего проекта, например mysite. Для статических файлов создадим подпапку static (название выбрано произвольно).

Добавим в папку static два файла, необходимые практически каждому сайту - robots.txt и favicon.ico

Для нашего примера содержание robots.txt жет быть следующим. Если вы не хотите индексации (часто применяется на стадии разработки):

User-agent: *
Disallow: /

Если хотите индексации:

User-agent: *
Allow: /

Файл favicon.ico можно сделать из букв.

Основные файлы приложения

По аналогии с примером hello_world из официальных доков создадим два основных файла нашего приложения.

1. Файл конфигурации:

runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /robots.txt
  static_files: static/robots.txt
  upload: static/robots.txt

- url: /favicon.ico
  static_files: static/favicon.ico
  upload: static/favicon.ico

- url: /.*
  script: main.app
  secure: always
  redirect_http_response_code: 301

Данный файл задает базовые конфигурации программной среды: движок (Python 2.7, standard environment), разрешение на параллельные запросы к сайту.

2. Файл с кодом-логикой нашего прилоения:

# -*- coding: utf-8 -*-
import webapp2


class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/html; charset=UTF-8'
        self.response.write('''
            <!DOCTYPE html>
            <head>
                <meta charset="UTF-8">
                <title>Простейший сайт на Python</title>
                <style>* {font-family: Arial, Helvetica, sans-serif;}</style>
            </head>
            <body>
                <div style="text-align: center; margin-top:70px">
                    <h2>Простейший сайт на Python</h2>
                    <p style="margin-top:100px">Сайт реализован на платформе Google App Engine</p>
                    <p>Движок - Python 2.7, standard environment.</p>
                </div>
            </body>
            </html>
        ''')


app = webapp2.WSGIApplication([
    ('/', MainPage),
], debug=True)

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

|_ static
      |_ robots.txt
      |_ favicon.ico
|_ app.yaml
|_ main.py


Загрузка приложения в облако

Мы создали файлы нашего приложения и в принципе можем теперь выгрузить его в облако. Открыв терминал в папке нашего приложения, воспользуемся командой:

gcloud app deploy

При выгрузке первый раз будет предложено выбрать физическое местоположение сервера проекта, которое будет определять IP нашего вебсайта. Местоположение потом нельзя будет поменять.
Выберем, к примеру, europe-west. Затем будет предложено еще раз подтвердить параметры проекта, после чего проект будет выгружен в облако. В окне терминала мы увидим соответствующее сообщение:

╔════════════════════════════════════════════════════════════╗
╠═ Uploading 4 files to Google Cloud Storage                ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.                                           
Setting traffic split for service [default]...done.                          
Deployed service [default] to [https://yourpeoject.appspot.com]

Если все сделано правильно, то перейдя по ссылке указанной в сообщении вы увидите страницу своего сайта. Вот, что получилось у меня: простейший сайт на Python . А в самом облаке в разделе App Engine вы увидете дашборд своего приложения.

Если же вы допустили ошибку, то скорее всего вы увидите в браузере сообщение о 500-й ошибке. Посмотреть подробную информацию об ошибках можно в разделе облака Logging > Logs Viewer, выбрав среди списка приложений GAE application:

App Engine Logging

Обновление кода проекта после его локального редактирования можно выполнить с помощью команды:

gcloud app deploy --promote --stop-previous-version

В облаке проект обновляется посредством создания новой версии. Чтобы GCP не разделяла трафик между старой и новой версией приложения, мы указали дополнительные опции.

Отладка приложения

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

Запускаем его командой:

dev_appserver.py app.yaml

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

sudo apt-get install google-cloud-sdk-app-engine-python google-cloud-sdk-datastore-emulator

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

Добавление доменного имени

Настоящий сайт не может использоваться без доменного имени. Давайте прикрутим домен и к нашему простому сайту.

App Engine позволяет это сделать. Для этого заходим в раздел App Engine > Settings > Custom Domains и нажимаем Add a custom domain. На странице добавления доменного имени нам нужно будет верифицировать наш домен в Webmaster Central, для этого на первом шаге (Select the domain you want to use) выбираем Verify a new domain, указываем название нашего домена и жмем Verify. Мы будем перенаправлены в Webmaster Central.

На странице нам будет предложено выбрать регистратора. Если вашего нет в списке, выбираем Other. Нам предлагается верифицировать домен, добавив запись в конфигурацию DNS. Если у вас есть такая возможность, добавьте указанную запись и верифицируйте домен.

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

В разделе Network services > Cloud DNS жмем Create Zone. В качестве Zone Name можно указать произвольное имя, характеризующее группу ваших доменов. В качестве DNS name указываем имя вашего домена, напрмиер example.com и жмем Create.

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

Поскольку у нас теперь есть своя собственная DNS конфигурация в облаке, мы можем добавить необходимую запись для верификации нашего домена. На странице Cloud DNS жмем Add record set и в предложенном окне добавляем необходимую запись.

Как только домен верифицируется, мы можем продолжить процесс добавления его к сайту нашего приложения на странице его настроек Settings > Custom Domains. Перейдем к пункту два и нажмем Save Mappings.

В пункте три нужно добавить предложенные записи в настройки нашего DNS, что опять же можно сделать в разделе Network services > Cloud DNS.


Ограничение затрат

Поскольку по умолчанию финансовые списания на App Engine с вашего добавленного биллинг аккаунта не ограничены, имеет смысл изменить эту дефолтную установку. Это можно сделать на основном дашборде App Engine в секции Billing status, или перейдя в раздел Settings из левого меню.

Дополнительные возможности конфигурации приложения

  1. Вместо .py файлов вы можете загружать в облако .pyc файлы. Поскольку по дефолту они игнорируются при выгрузке, нужно будет явно указать в файле app.yaml, что их не надо пропускать, изменив одну строчку в стандартных настройках:
skip_files:
- ^(.*/)?#.*#$
- ^(.*/)?.*~$
- ^(.*/)?.*\.pyo$
- ^(.*/)?.*/RCS/.*$
- ^(.*/)?\..*$
- ^(.*/)?.*\.bak$

Подробнее о Sandboxing in Python

  1. В настройках приложения в в файле app.yaml можно указать, что тарфик на http всегда должен перенаправляться на https:
- url: /.*
  script: main.app
  secure: always
  redirect_http_response_code: 301

Как было сказано в начале, описанное выше - это некий минимум, который предлагает попробовать возможности облака на простом примере. Надеюсь пример был интересен, и вы легко сможете усложнить его под свои нужды.