Опубликовано: 08 дек 2019
Данная статья предлагает простой пример, на котором можно легко ознакомиться с Google Cloud Platform и процессом развертывания своих приложений в App Engine. В качестве примера мы создадим в нем простейший одностраничный сайт на Python 2.7 - под эту версию питона вы можете найти достаточно большое количество примеров кода для GAE, чтобы потренироваться.
Чем интересен App Engine в принципе? Это в первую очередь несколько ключевых фитч:
Для начала работы с Google Cloud Platform нужно сделать две простые вещи:
При инициализии 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:
Обновление кода проекта после его локального редактирования можно выполнить с помощью команды:
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 и в предложенном окне добавляем необходимую запись. Рекомендуемый способ верификации домена для App Engine - это CNAME
запись.
Как только домен верифицируется, мы можем продолжить процесс добавления его к сайту нашего приложения на странице его настроек Settings > Custom Domains. Перейдем к пункту два и нажмем Save Mappings.
В пункте три нужно добавить предложенные записи в настройки нашего DNS, что опять же можно сделать в разделе Network services > Cloud DNS.
Поскольку по умолчанию финансовые списания на App Engine с вашего добавленного биллинг аккаунта не ограничены, имеет смысл изменить эту дефолтную установку. Это можно сделать на основном дашборде App Engine в секции Billing status, или перейдя в раздел Settings из левого меню.
.py
файлов вы можете загружать в облако .pyc
файлы. Поскольку по дефолту они игнорируются при выгрузке, нужно будет явно указать в файле app.yaml
, что их не надо пропускать, изменив одну строчку в стандартных настройках:skip_files:
- ^(.*/)?#.*#$
- ^(.*/)?.*~$
- ^(.*/)?.*\.pyo$
- ^(.*/)?.*/RCS/.*$
- ^(.*/)?\..*$
- ^(.*/)?.*\.bak$
Подробнее о Sandboxing in Python
app.yaml
можно указать, что тарфик на http
всегда должен перенаправляться на https
:- url: /.*
script: main.app
secure: always
redirect_http_response_code: 301
Как было сказано в начале, описанное выше - это некий минимум, который предлагает попробовать возможности облака на простом примере. Надеюсь пример был интересен, и вы легко сможете усложнить его под свои нужды.