App Engine から Cloud Datastore を使ってみました

*Cloud Datastore とは

GCPで提供されている Key-Value 型の NoSQL データベースで、Google App Engine ではデフォルトのデータベースとして使われています。
RDBMSでのTableを表すものを Kind 、行を表すものを Entity と呼びます。Entityは識別子となるKey と自身が持つデータであるPropertyから成り立っています。

インデックスは全て自動生成され、検索はそのインデックスに基づいて行われるため効率的に処理を実行することができます。非同期による書込・読込や、キャッシュの自動化、トランザクション処理をサポートしているため、スケーラブルなアプリケーション開発が可能になります。また、暗号化して保存されるため、セキュリティにも優れています。

Cloud Datastore を利用するためには、データベース環境として利用する方法と、App Engine からAPIを使って利用する方法があります。App Engine からAPIを使う方法は認証が不要ですが、他の方法ではコンソール画面から認証の設定をしておく必要があります。今回は App Engine からPythonのDatastore API(NDB)を使って利用する方法を試してみました。
  • Datastore API(NDB)
    データベースモデルの作成やクエリの実行などを行うためのAPIです。


*今回やったこと

下記サイトを参考に、Datastore API を使って画面からデータを登録する方法と、管理ページの「Interactive Console」からデータを操作する方法を試してみました。


*参考



*準備〜サーバの起動

App Engine でインスタンスを作成しておきます。
今回は以前に作成した環境を利用しました。(下記記事を参照)

main.pyに、画面からの入力を Datastore にPOSTするための処理を追加します。
import logging
from flask import Flask, render_template, request, redirect
from google.appengine.ext import ndb


class Message(ndb.Model):
    body = ndb.StringProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)
app = Flask(__name__)

@app.route('/')
def hello():
    messages = Message.query().fetch()
    return render_template('hello.html', messages=messages)

@app.route('/add', methods=['POST'])
def add_message():
    message_body = request.form.get('message', '')
    message = Message(body=message_body)
    message.put()
    return redirect('/')


@app.errorhandler(500)
def server_error(e):
    logging.exception('error a request!')
    return 'error!', 500

テキスト入力を送信するための画面を追加します。
templates/hello.htmlを新規作成して下記内容を実装します。
<head>
    <title>Message Board</title>
</head>
<body>
    <form action="/add" method="post">
        <textarea name="message" id="message_area"></textarea>
        <input type="submit">
    </form>
    <ul>
        {% for message in messages %}
        <li>{{ message['body'] }} at {{ message['created'] }}</li>
        {% endfor %}
    </ul>
</body>

実装ができたら開発サーバーを起動します。
オプションを指定しないとinteractive consoleが使えません。
$ dev_appserver.py --enable_console --skip_sdk_update_check true app.yaml

下記にアクセスすると実装した画面が表示されます。
http://localhost:8080/










下記にアクセスすると管理ページが表示されます。
http://localhost:8000/datastore









  • 補足
    本番環境をローカルでテストするための、エミュレータという機能が提供されています。
    起動する場合は下記コマンドを実行します。環境変数なども指定可能です。
$ gcloud beta emulators datastore start

起動後に下記にアクセスするとOKと表示されます。
http://localhost:8081/













*画面から登録

画面のテキストエリアに入力して送信ボタンを押すと、Datastore にデータが登録されます。




登録されたデータは、管理ページのDatastore Viewerから参照することができます。












登録されたデータの確認を、Interactive Consoleを使って行うことも可能です。
下記Pythonコードを入力してExecuteボタンを実行します。
from google.appengine.ext import ndb


class Message(ndb.Model):
    body = ndb.StringProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)

models = Message.query().fetch()
for model in models:
   print(model)

実行結果に下記が表示されます。
Message(key=Key('Message', 5733953138851840), body=u'This is test.', created=datetime.datetime(2018, 10, 7, 1, 53, 7, 43196))













*Interactive Consoleから登録

管理ページのInteractive ConsoleからDatastore APIを使ってデータの登録をします。
下記コードを実行します。
from google.appengine.ext import ndb


class Message(ndb.Model):
    body = ndb.StringProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)

m = Message(body='Add message!')
m.put()
print('OK')


処理が正常終了した場合は、実行結果にOKと出力されます。




Datastore Viewerから登録されていることを確認します。














*所感

今まで私は MySQL や Oracle といったRDBMSを使っていたため、テーブルでなくて Kind と呼ぶなどといった概念の理解が必要でした。
自動でスケーリングしてくれる、モデルの変更を簡単にできる、SQLを使わなくても管理ページから確認できる点などは非常に便利でしたので、GCP を使う場合は Datastore も一緒に使うと開発効率が上がりそうです。