とりゅふの森

GCPデータエンジニアとして生きる

【GCP超入門】超小規模Webアプリこそ、Google App Engineを使え!

f:id:true-fly:20220121223830p:plain

超小規模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を使うべきなのです!

ということで本日のテーマはこちら!

Google App Engineで超小規模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 の無料枠はスタンダード環境でのみ使用できます。

出典: Google Cloud Free Program

ざっくりいうと、スタンダード環境で、デフォルトインスタンスで最小数構成をすれば、1日24時間稼働でも無料枠で運用が可能です。

スタンダード環境って?

App Engineには、スタンダード環境と、フレキシブル環境の2種類があります。
スタンダード環境は、予め用意された、Python、PHPなどのランタイムを利用し、それに自分のアプリケーションをデプロイして動かすことができる環境です。
一方でフレキシブル環境は、ランタイムをカスタマイズして利用できたりと、制限が少ない分、無料枠がなかったりします。
具体的な2環境の違いは公式ドキュメントにもまとめられています。

cloud.google.com

今回は無料枠で試してみたいため、スタンダード環境を選択します。

簡単なPythonWebアプリケーションをデプロイしてみる

今回はPython37ランタイムを用いて、Flaskの簡単なWebアプリケーションをApp Engineにデプロイしてみようと思います。

※前提として、自分の作業PCにgcloud SDKをインストールして、自分のGCPプロジェクトに接続できるようにしておく必要があります。

App Engineの有効化

まずは以下のURLから、自分のGCPプロジェクトのApp Engineの初期設定を行います。
以下の作業は、プロジェクトごとに最初に1回やればOKです。
https://console.cloud.google.com/appengine/

[アプリケーションを作成]をクリックします。

f:id:true-fly:20220120000407p:plain:w480

リージョンと、サービスアカウントを選択します。特にこだわりが無ければ、
リージョンはasia-northeast1(東京)
サービスアカウントは、App Engineデフォルトサービスアカウント
を選択しましょう。

f:id:true-fly:20220120000501p:plain

これで準備は完了、いつでもアプリケーションをデプロイすることができます。

デプロイするファイルの準備

まずはローカルにデプロイするファイルを準備していきましょう。
今回のディレクトリ構成は以下の通りです。

.
├── 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

以下の画面が表示されたら成功です!!

f:id:true-fly:20220120234357p:plain

まとめ

以上、今回はGoogle App Engineを使ってPythonのWebアプリケーションを公開する手順についてまとめました。

この1記事だけで説明できる程度にはお手軽にWebアプリケーションを公開することができます。
他にもファイアウォールルールの設定だったり、Identity-Aware Proxyという、Googleアカウントを用いたアクセス制御もできるため、社内だったり仲間内で利用する超小規模アプリケーションの運用にももってこいです。

今回は1サービスだけを無料枠で運用する想定でしたが、非公開でたまにしか稼働しないアプリケーションであれば、複数サービスの無料枠での運用が実現可能です。

大規模アプリケーションの構築によく使われるGoogle App Engineですが、今回のように小規模アプリケーションでの利用もお手軽にできる、便利なPaaSでした。