GCPPythonTech Blog 

GAEでサクッとAPIサーバ構築

はじめに


Google App Engine(GAE)とは

GAEはGoogle Cloud Platform(GCP)で利用できるアプリケーション/サービスの一つです。

サービス分類はPaaSとなり、インフラの管理をプラットフォーム側が担ってくれますのでアプリケーション開発に集中することができます。本稿では、GAE上にPythonを利用して簡単なAPIサーバーを構築していきます。

 

 

補足情報


GAEにはスタンダード版とフレキシブル版が存在しますが、今回は「スタンダード版」を利用していきます。

無料枠で利用できる範囲での実装を想定しておりますが、何らかの事情により課金がされる場合があります。

 

 

必要な知識、準備


  1. GCPのアカウント
  2. Cloud SDKのインストールと準備
  3. Python2.7
  4. Flask
  5. virtualenv(必要に応じて)

 

作業の流れ


  1. CloudSDKの設定確認
  2. 権限の確認
  3. GAEの立ち上げ
  4. ディレクトリ構造
  5. hello, world
  6. ローカル環境でのテスト
  7. デプロイ
  8. アプリの拡張
  9. 関連サービス

 

CloudSDKの設定確認


GCPへのアクセス権限を確認します。下記コマンドを実行し権限が正しいか確認します。

ご自身のアカウントが表示されればOKです。

gcloud auth list

このステップが済んでいない場合は下記ドキュメントよりセットアップを行っていただく必要があります。

https://cloud.google.com/sdk/downloads?hl=ja

 

権限の確認


利用しているアカウントが「オーナー権限」であるかを確認します。左のスライドにある「IAMと管理」をクリックし、自身のアカウントがオーナー権限かを確認してください。(ご自身で作成されたアカウントであればデフォルトでオーナー)

コンソール画面

 

コンソール画面からIAMを選択

 

IAMに入りオーナー権限が付与されているか確認

 

 ディレクトリ構造


開発環境の準備ができましたので必要なものを揃えていきます。

まずは下記ディレクトリ構造でファイル、ディレクトリを作成してください。

sample_app/ カレントディレクトリ
 ┗ main.py 実行スクリプト
 ┗ app.yaml GAEの挙動が記載されている指示書
 ┗ lib/ 実行時に呼ばれるライブラリ群(GAEで3rdライブラリを利用したい場合は必要)
 ┗ appengine_config.py libをバインドするスクリプト
 ┗ requirements.txt ライブラリ情報

 

hello, worldの実装


それでは、GAEの挙動を掴むために「hello, world」アプリの実装を行っていきます。

app.yaml

runtime: python27
api_version: 1
threadsafe: yes

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

libraries:
- name: flask
  version: 0.12

main.py

from flask import Flask 

app = Flask(__name__)

@app.route('/')
def hello():
    return 'hello, world', 200

appengine_config.pyに下記コードを記述

from google.appengine.ext import vendor
vendor.add('lib')

requirements.txt にライブラリ情報をロード

pip freeze  > requirements.txt

libディレクトリを作成しrequirements.txtに記載されてるライブラリをインポートする

mkdir lib
pip install -r requirements.txt -t lib

デプロイする準備が整いました。

正しくコードの記述がされていれば、デプロイ後に指定のURLにアクセスすると「hello,world」と記載されます。

 

ローカル環境でのテスト


デプロイする前にローカルテストを行います。テスト環境が用意されているのでそちらを利用していきます。

Cloud SDKをインストールした時点でテストができるスクリプトが用意されており、パスはこちらとなります。

/<your>/<path-to>/google-cloud-sdk/bin/dev_appserver.py

ローカル環境の立ち上げには下記コマンドを実行します。

dev_appserver.py app.yaml

http://localhost:8000/にアクセスし管理画面を確認

http://localhost:8080/ hello, world   が表示されることを確認します。

 

デプロイ


ローカルで正しく動くことが確認できたので、デプロイしていきます。

下記コマンドで簡単にデプロイが可能です。

gcloud app deploy app.yaml

しばらくするとデプロイが完了し、アクセスできる状態になります。(軽いアプリでも1 – 2分程度時間がかかります)

 

アプリの拡張


GAEの利用方法自体はこれまでのステップ通りですが、hello,worldを拡張し実践に即したアプリに拡張していきます。

まずは、apps ディレクトリを作成し、処理周りのこの中にまとめていきます。

sample_app/  カレントディレクトリ
 ┗ apps / 
  ┗  model.py CRUD関連の処理をまとめる
    ┗  view.py   コントローラ
 ┗ main.py Blueprintを呼びだす
 ┗ app.yaml GAEの挙動が記載されている指示書
 ┗ lib/ 実行時に呼ばれるライブラリ群(GAEで3rdライブラリを利用したい場合は必要)
 ┗ appengine_config.py libをバインド
 ┗ requirements.txt ライブラリ情報

model.py

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

class Hash(object):
    def __init__(self,key):
        self.key = key

    def get_hash(self):
        return hashlib.sha256(self.key).hexdigest()

view.py 

# -*- coding: utf-8 -*-

from flask import Blueprint, request, jsonify
from .model import Hash

app = Blueprint('hello', __name__)


@app.route('/', methods=['GET'])
def hello():
    return 'hello, world', 200


@app.route('/arg', methods=['GET'])
def arg():
    key = request.args.get("key", type=str)
    hash_obj = Hash(key)
    val = hash_obj.get_hash()
    return val, 200


@app.route('/form', methods=['POST'])
def form():
    req = request.form
    val = req.get('key')
    return jsonify(data=val), 200

main.py

# -*- coding: utf-8 -*-
from flask import Flask
from apps.view import app as hello_app

app = Flask(__name__)

modules_define = [hello_app]
for _app in modules_define:
    app.register_blueprint(_app)

ローカルテストで問題なく結果が表示されていることを確認し、問題なければ先ほどと同様の手順でデプロイを行います。

 

関連サービス


これまでのステップでは実装とデプロイのみ行ってきましたが、デプロイした結果やGAEの便利機能を少しだけ紹介していきます。

要件次第ではGAEと関連アプリだけでバックエンド開発が済んでしまうほど多機能となりますので、詳細は個別でお調べいただければと思います。

 

バージョン管理とトラフィックのマイグレーション


デプロイの状況をコンソールから確認することが可能です。

また、(個人的には)GAEの機能の中でもTOP3に入るおすすめ機能が「トラフィックのマイグレーション」です。

一言で言うと、バージョン管理が「1クリックで行える機能になります。

バックエンドでバグが見つかった際にはすぐにバージョンを戻せるので障害の影響を限定的にすることが可能です。

フロントエンドにおいては、どんどんリリースしていき、バグ・修正点が見つかり次第ロールバックすると言う手法も取ることも可能です。

 

cron


cronもマネージドで提供されています。

利用方法は下記のドキュメントを見ていただければと思いますが、これまでのステップで利用した「app.yaml」に似た記法なので学習コストも少なく実装できます。

こちらも非常に便利ですので利用してみてはいかがでしょうか。

https://cloud.google.com/appengine/docs/standard/python/config/cronref?hl=ja

*仕様が一般的なcronとは異なり、発火タイミングで「URL」を叩く仕様となっていますので、処理したい内容はコントローラーに記載しておく必要があります。

 

Taskqueue


自身で実装すると大変なQueueサービスですが、こちらもマネージドで提供されています。

利用方法はcron同様とてもシンプルなので学習コストも少なく実装可能です。

https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/

https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/creating-push-queues

 

logging


ログの取得は非常にシンプルで、Pythonの場合は、トレースバックや標準出力がそのままログに出力されます。

GCP上でのloggingはStackDriverというサービスに統一されており設定をしなくても自動でロッギングしてくれます。

GCEでは自身で実装しないとならない機能もGAEではマネージド?的な振る舞いで処理してくれます。

https://cloud.google.com/logging/docs/view/service/appengine-logs?hl=ja

 

まとめ


GAEを利用し簡単にAPIサーバーを実装する方法を紹介いたしました。

今回は基本的な設定のみで構築しましたが、設定・アプリの拡張を行うことで本番環境でも十分に利用可能です。

スナップチャットや国内のゲーム会社などでも利用実績がありwebアプリを開発するのであれば選択肢の一つとして入ってくるサービスだと思います。(トラフィックが多い場合はGOでの実装がおすすめ)

 

最後に


GCPは他サービスに比べ料金的メリットや様々なサービスが提供されていますので要件が合えば一度利用してみてはいかがでしょうか。

このページをシェアする:



DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。