スキップしてメイン コンテンツに移動

Moduleをdispach.yamlで振り分ける方法

Google App Engineには、アプリケーション内の機能をグループ化できる Modules というしくみがある。Moduleごとに、インスタンスのスペックやスケールのルールが設定できるため、フロントエンドとバックオフィス、バックグラウンドジョブといった用途別にModuleを作成すると良さそうだ。また、どのModuleが使われるかは、URL(パス)で振り分けることができる。今回はその方法のメモ。

Moduleのyamlファイルの作成

今回は、以下の3つのModuleを作ってみる。

・フロントエンド用(app.yaml) default
・バックオフィス用(back.yaml)
・JOB用(job.yaml)

まずは各Moduleのyamlファイルを作成する。
app.yaml
application: gcp-memo
module: default
version: 1
runtime: python27
api_version: 1
threadsafe: true
instance_class: F1
(以下省略)
admin.yaml
application: gcp-memo
module: admin
version: 1
runtime: python27
api_version: 1
threadsafe: true
instance_class: F1
(以下省略)
job.yaml
application: gcp-memo
module: job
version: 1
runtime: python27
api_version: 1
threadsafe: true
instance_class: B1
basic_scaling:
max_instances: 2
idle_timeout: 10m
(以下省略)

dispatch.yamlファイルの作成

続いて、これらのModuleを振り分けるdispatch.yamlを作成する。今回は、パスが/admin/に一致すればadminモジュールへ、/job/に一致すればjobモジュールが使用されるようにする。dispatch.yamlは、アプリケーションのルートディレクトリに配置する必要がある。Moduleのyamlファイルについては、ルートでも任意のディレクトリ配下でもOK。

dispatch.yaml
application: gcp-memo
dispatch:
- url: "*/job/*"
module: job
- url: "*/admin/*"
module: admin

ローカルサーバーでの起動

以下で実行できる。パラメータにdispatch.yamlとモジュールのyamlファイルを渡す。実行ディレクトリは、アプリケーションのルート。モジュールのyamlがサブディレクトリ配下にある場合は、ルートからの相対パスで指定する。

ローカルサーバーでの起動コマンド
dev_appserver.py dispatch.yaml app.yaml admin.yaml job.yaml
コンソールには以下が表示され、http://localhost:8080 にアクセスすれば、適宜ディスパッチされる。

コンソールの表示
Starting dispatcher running at: http://localhost:8080
Starting module "default" running at: http://localhost:8081
Starting module "admin" running at: http://localhost:8082
Starting module "job" running at: http://localhost:8083

デプロイとdispatch.yamlの更新

本番環境にデプロイするときは、各モジュールのデプロイとdispatch.yamlの更新とでコマンドが別。モジュールのデプロイは、複数のyamlファイルを指定できる。

デプロイ
appcfg.py update app.yaml job.yaml admin.yaml
dispatch.yamlの更新
appcfg.py update_dispatch ./
※update_dispatchは忘れがち。

app.yamlは必須か?

おまけ。フロントモジュールはapp.yamlという名前にしたが、app.yamlでなくてもOKみたい。ただ、Google App Engine Launcherでapp.yamlが無いと怒られたり、PyCharmでGAEプロジェクトと認識されなかったりするので、デフォルトのモジュールはapp.yamlにしたほうが無難だろう。

コメント

  1. Casino: Why is gambling the most dangerous of all
    A casino gambling addict is 출장마사지 simply gambling the most dangerous of all other https://deccasino.com/review/merit-casino/ people. A gambler's life 출장안마 is not worrione just about the outcome of an action, herzamanindir.com/

    返信削除

コメントを投稿

このブログの人気の投稿

Managed Virtual Machine に望むこと

先日2014年4月22日に行われた、Google Cloud Platformセッションの模様がYoutubeに公開されてた。 地方民はこういうイベントになかなか参加できないので、動画配信はほんとに助かる。ありがたや。。。 動画の中で語られている Managed VM は地味だけど、なにげにすごい機能だと思う。GAEでできなかったほとんどの事がこれで解決できるかもしれない。 ただ、個人的に Managed VMでは、(スケールアウトしなくていいので)固定IPも使えるようになってほしい。なぜなら、Google App Engineで外部のシステムと連携するとき、相手側でIPアドレス制限されている事がある。だから、連携前にあらかじめこちらのIPアドレスを教えておくのだけど、GAEはPaaSなのでその範囲も広いし、いつ変わるかわからない。まぁ、IPアドレス制限という方法自体がすでに時代遅れな感じではあるけど。 ともかく、GAEではそういうシステムと連携する時は、間にGAEでないサーバーを中継させておく必要がある。なので、このためだけにOSやApacheのメンテが発生する。これは、ほんとにアホらしいことだ。もし、Managed VMで固定IPが使えれば、対外部システムとの処理だけそのインスタンスで行えばいいし、中継サーバーも不要になるので、だいぶ楽になるのだ。 Googleさん、よろしくおねがいします。

Google App Engineでファイルを保存する方法3つ

Google App Engineでは、通常のWebアプリケーションのように、サーバー上のファイルシステムへアクセスすることができない。別の方法でファイルの読み書きをする事になるけど、方法はいくつかあるので、それぞれの方法と長所短所をまとめてみた。サンプルと全てのソースコードはこちら。( サンプル / ソースコード ) 方法1:BlobPropertyを使う ndb(db)のBlobProperty(https://developers.google.com/appengine/docs/python/ndb/properties)ではバイナリデータをそのまま格納できる。 まずは保存するModelの定義を実装する。 from google.appengine.ext import ndb class UserFileModel(ndb.Model):     """     ファイル格納モデル     """     file_data = ndb.BlobProperty()                  # ファイルデータ 続いて、アップロードフォーム。 <form> <div class="form-group"> <input id="exampleInputFile" name="file_data" type="file" />     </div> <button class="btn btn-default" type="submit">保存</button> </form> アップロードハンドラを実装。リクエストされたデータをそのまま突っ込むだけ。 def post(self):         file_data = self.request.get('file_data')         user_file = UserFileMod...