超小規模Webアプリこそ、Google App Engineを使え!
世の中にはWebアプリケーションを公開する手段はたくさんあります。
GCP、AWSなどのパブリッククラウド、自社サーバやレンタルサーバでの構築などなど……。
さらのGCP一つをとっても、
- Compute Engine
- App Engine
- Kubernetes Engine
- Cloud Run
など、たくさん挙げられます。
しかしこれらは用途、目的によって使い分けられます。
例えば今回紹介するApp Enigneは、PaaSです。
Google公式ドキュメントから引用すると、以下の特徴があります。
App Engine は、大規模なウェブ アプリケーションを開発およびホスティングするための、フルマネージド型のサーバーレス プラットフォームです。
出典: https://cloud.google.com/appengine/docs?hl=ja
GCPのようなクラウドサービスは、やはり大規模なWeb開発に適しているんですよね。
ということで本日のテーマはこちら!
今回は個人開発でも耐えうる超低コストで超小規模なWebアプリケーションを、Google App Engineで開発する手段についてご紹介します。
App Engineの基本
そもそもApp Engineって?
App Engineとは、GCPのプロダクトの一つです。
Python、PHP、Javaなどのプログラミング言語のランタイム、あるいはカスタムランタイムを利用して、プログラムを書いてデプロイするだけで、アプリケーションを構築することができるサービスです。
インフラはフルマネージド環境なので、開発者はコードを書くことに集中できます。
オートスケール、アプリケーションのバージョン管理、ファイアウォールルールなどの設定もできます。
でもお高いんでしょ?
2022年1月執筆時点、App Engineには無料枠があります。
28 時間分の「F」インスタンス(1 日あたり) 9 時間分の「B」インスタンス(1 日あたり) 下り(外向き)1 GB(1 日あたり) Google Cloud の無料枠はスタンダード環境でのみ使用できます。
ざっくりいうと、スタンダード環境で、デフォルトインスタンスで最小数構成をすれば、1日24時間稼働でも無料枠で運用が可能です。
スタンダード環境って?
App Engineには、スタンダード環境と、フレキシブル環境の2種類があります。
スタンダード環境は、予め用意された、Python、PHPなどのランタイムを利用し、それに自分のアプリケーションをデプロイして動かすことができる環境です。
一方でフレキシブル環境は、ランタイムをカスタマイズして利用できたりと、制限が少ない分、無料枠がなかったりします。
具体的な2環境の違いは公式ドキュメントにもまとめられています。
今回は無料枠で試してみたいため、スタンダード環境を選択します。
簡単なPythonWebアプリケーションをデプロイしてみる
今回はPython37ランタイムを用いて、Flaskの簡単なWebアプリケーションをApp Engineにデプロイしてみようと思います。
※前提として、自分の作業PCにgcloud SDKをインストールして、自分のGCPプロジェクトに接続できるようにしておく必要があります。
App Engineの有効化
まずは以下のURLから、自分のGCPプロジェクトのApp Engineの初期設定を行います。
以下の作業は、プロジェクトごとに最初に1回やればOKです。
https://console.cloud.google.com/appengine/
[アプリケーションを作成]をクリックします。
リージョンと、サービスアカウントを選択します。特にこだわりが無ければ、
リージョンはasia-northeast1(東京)
、
サービスアカウントは、App Engineデフォルトサービスアカウント
を選択しましょう。
これで準備は完了、いつでもアプリケーションをデプロイすることができます。
デプロイするファイルの準備
まずはローカルにデプロイするファイルを準備していきましょう。
今回のディレクトリ構成は以下の通りです。
. ├── app │ ├── server.py │ ├── templates │ │ └── index.html │ └── views │ └── index.py ├── app.yaml └── requirements.txt
- app/template/index.html
今回表示するHTMLファイルです。jinja2テンプレートでPythonで値を置換して表示させます。
※[[ name ]]
の箇所ですが、正しくは中括弧({{
と}}
)で囲う必要があります。はてなブログで記述できないようで、置換しています、すみません……。
<html> <head> <title>App Engine Sample</title> </head> <body> <h2>App Engine </h2> Hello [[ name ]] !! </body> </html>
- app/views/index.py
GET / リクエストを受け取り、HTMLを返すPythonプログラム
from flask import Blueprint, render_template view = Blueprint('index', __name__, url_prefix='/') @view.route('/', methods=['GET']) def show(): return render_template('index.html', name='truefly')
- app/server.py
Flaskインスタンスを作成するPythonプログラム
from flask import Flask from app.views import index app = Flask(__name__) app.register_blueprint(index.view)
- requirements.txt
Flaskアプリケーションに必要なライブラリ
flask==1.1.2 gunicorn==19.9.0 Jinja2==2.11.1
- app.yaml
App Engineのデプロイ設定ファイル
runtime: python37 env: standard instance_class: F1 service: truefly-demo entrypoint: gunicorn --workers 1 --threads 8 app.server:app automatic_scaling: max_instances: 1 max_idle_instances: 1 min_instances: 0 min_idle_instances: 0 min_pending_latency: 3000ms max_pending_latency: automatic
このapp.yaml
が今回の肝となるファイルです。
app.yamlを見てみよう
app.yaml
とは、App Engineのアプリケーションの設定を記述したファイルです。
https://cloud.google.com/appengine/docs/standard/python3/config/appref?hl=ja
runtime: python37
アプリケーションを動かすランタイムを指定します。今回はPython3.7を利用します。
env: standard
App Engineの環境です。今回はスタンダード環境を利用します。
instance_class: F1
インスタンスクラスを指定します。F1が最小サイズなのでこちらを利用します。
service: truefly-demo
App Engineのサービス名を指定します。アプリケーションの名前をつけましょう。
entrypoint: gunicorn --workers 1 --threads 8 app.server:app
アプリケーションのエントリーポイントです。今回はgunicornでFlaskアプリケーションを起動するため、このコマンドをエントリーポイントとします。
automatic_scaling: max_instances: 1 max_idle_instances: 1 min_instances: 0 min_idle_instances: 0 min_pending_latency: 3000ms max_pending_latency: automatic
オートスケール設定です。最大インスタンス数を1、最小インスタンス数を0にすることで、最小限でのコストで運用することが可能です。
App Engineを1つのサービスのみで運用しているのであれば、この設定で1日28時間の無料枠を超えることなく運用することが可能です!
デプロイしてみよう
デプロイするにはgcloudコマンドを利用します。
gcloud app deploy
しばらくするとApp Engineにデプロイされます。コマンドでブラウザを起動してアクセスすることができます。「truefly-demo」はapp.yaml
に記述したサービス名です。
gcloud app browse -s truefly-demo
以下の画面が表示されたら成功です!!
まとめ
以上、今回はGoogle App Engineを使ってPythonのWebアプリケーションを公開する手順についてまとめました。
この1記事だけで説明できる程度にはお手軽にWebアプリケーションを公開することができます。
他にもファイアウォールルールの設定だったり、Identity-Aware Proxyという、Googleアカウントを用いたアクセス制御もできるため、社内だったり仲間内で利用する超小規模アプリケーションの運用にももってこいです。
今回は1サービスだけを無料枠で運用する想定でしたが、非公開でたまにしか稼働しないアプリケーションであれば、複数サービスの無料枠での運用が実現可能です。
大規模アプリケーションの構築によく使われるGoogle App Engineですが、今回のように小規模アプリケーションでの利用もお手軽にできる、便利なPaaSでした。