GAEのCron・TaskQueueから別サービス(モジュール)のインスタンスを起動する方法

  • このエントリーをはてなブックマークに追加

apps-gcpでは以前「GAEのautomatic scalingとbasic scalingを徹底比較!」という記事を公開しました。要約すると、automatic scalingは大量リクエストの処理に向いたスケーリング設定で、basic scalingは大量データのバッチ処理に向いたスケーリング設定となります(表1参照)。

 

特徴  
automatic scalin ・自動スケールする
 →大量リクエストの処理に向いている
・リクエストは60秒がデッドライン
basic scaling ・リクエストは24時間がデッドライン
 →大量データの処理に向いている

表1. automatic/basic scalingの違い

 

同一プロジェクト内でそれぞれのスケーリング設定を利用したい場合は別々のサービス(モジュール)で定義する必要があるのですが、この2つの設定のインスタンスはそれぞれお互いを呼び出すことが可能です。

 

今回のapps-gcpでは、デフォルトサービス(=サービス名を未指定でデプロイした場合のサービス)から別サービスのインスタンス(=任意のサービス名でデプロイした場合のサービス)をCronとTaskQueueから呼び出す方法について説明します(※2)。

 

尚、本記事はGAEのCronとTaskQueueを触れたことがあるユーザを対象としています。Cron・TaskQueueの基礎についてはそれぞれ以下のページを参考にしてください。

 

※2 以下の説明はGAEのStandard Environmentを前提とした説明になります。

 

Cronから任意サービスをキックする

Cronサービスは、特定時刻または一定周期で定期的なスケジュールタスクを実行するための機能です。この機能によって、「1時間に1回」「毎週月曜日0:00」といった頻度・日時に任意のプログラムを実行することができます。

cron設定で任意のサービスを指定する

cronから特定サービスをキックするための設定は非常に簡単です。cron.yamlという設定ファイルにタスクのURLとスケジューリング、サービスを定義するだけです。

・cron.yaml(※3)

cron:
- description: new daily summary job
 url: /hello
 schedule: every 1 mins
 target: cron

※3 上記は1分毎に「cron」サービスのURL「/hello」にGETリクエストを発行するための設定です。descriptionには定義したスケジューリング設定についての分かりやすい説明を書いておくと良いでしょう。

 

ただし、以下の表の通り任意のサービスを指定する「target」は必須項目ではありません。「target」を指定しない場合は、デフォルト(※3)のサービスのURLがキックされます。

 

設定項目 必須 説明
description タスクの概要を記載する。
url 定義したスケジューリングで起動するURLを定義する。
schedule 実行するスケジュールを定義する(※4)。
target 起動対象のサービス(モジュール)を定義する。

表1. cron.yaml設定項目

※3 サービスを未設定でデプロイした場合は「デフォルト」サービスとなります。

※4 スケジュールのフォーマットについては以下を参考にしてください。

https://cloud.google.com/appengine/docs/standard/python/config/cronref#schedule_format

 

 

動作検証をおこなう

一定時間毎にメールやバッチ処理を行いたいというのはシステム開発においてよくあるケースだと思います。前述した通り、cronを使えば定期的なスケジュールでタスクを実行することができます。今回行う検証は、cronを使って1分毎に任意のサービスのURLを呼び出しその内容をログに出力する、というシンプルな内容です。ただ、この検証で利用するコードは、そのまま前述した要件で再利用可能なコードになります。

この検証で利用するプログラム(main.go)とGAEの設定ファイル(app.yaml)は以下の通りです。あとは前章で説明したcron.yamlを含めた3つのファイルで検証をおこないます(そのまま利用します)。GAEのスケーリング設定はbasic scalingとします。basic scalingの設定項目についてはGAEのautomatic scalingとbasic scalingを徹底比較!!を参考にしてください。

GAEのautomatic scalingとbasic scalingを徹底比較!!



尚、本検証を実際に試すためにはGCPプロジェクトの作成が必要です。GCPプロジェクトの作成方法については初心者のためのGCPプロジェクト始め方入門を参考にしてください。

初心者のためのGCPプロジェクト始め方入門

・main.go

package cron

import (
 "net/http"
 "google.golang.org/appengine"
 "google.golang.org/appengine/log"
)

func init() {
 http.HandleFunc("/hello", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
 c := appengine.NewContext(r)
 log.Infof(c, "%s", "hello, world")
}

 
・app.yaml

runtime: go
api_version: go1.8
instance_class: B1
basic_scaling:
max_instances: 1
idle_timeout: 10m

handlers:
- url: /.*
  script: _go_app

 
(1)ソースフォルダの作成
任意のフォルダを作成し「main.go」「app.yaml」「cron.yaml」を作成したフォルダ直下に移動します。

 

$ mkdir cron

 
(2)サービスのデプロイ
以下のコマンド(※4)を実行しGAEアプリ(サービス)のデプロイをおこないます。以下のコマンドに対して任意のパラメータを指定してください。本記事ではサービス名を「cron」としてデプロイします。尚、最後のコマンド引数「cron/」は1で作成したフォルダです。

$ appcfg.py -A <プロジェクトID> -V <バージョン> -M <サービス名> update cron/

 

※4 appcfgはGoogle Cloud SDKに同梱されているコマンドです。Cloud SDKのインストール手順については以下をご確認ください。
http://www.apps-gcp.com/cloud-sdkinstall-commentary/

(3)タスクの実行待ち
Cloudコンソールの左メニューから[App Engine]-[タスクキュー]を選択し、画面から「cronジョブ」を選択します。選択すると、デプロイしたcron設定が表示されます。「ステータス」はcronの実行状況を表し、これが「成功しました」になるとcronの実行が成功したことになります。cronが成功したことを確認したら次は4に進みます。

(4)ログの確認
Cloudコンソールにアクセスし左メニューから「ロギング」を選択します。ロギング画面に遷移後、プルダウンメニューから[GAEアプリケーション]-[<サービス名>]-[<バージョン>]を選択します。

ログを見てみると、cronの設定通り、1分毎にログが出力されていることがわかります。

このログの一覧からいずれかのログを開いてみましょう。開いてみると、以下のように「hello, world」(main.goから出力した文字列)が正常に出力されていることがわかります。

以上でcronからサービスを呼び出す手順の説明は終了です。次はタスクキューからサービスをキックする方法について説明します。

TaskQueueから任意サービスをキックする

TaskQueueとは、ユーザリクエスト外部でタスクを非同期で実行するためのサービスです(※6)。このタスクキューを利用すればautomatic scalingのfrontendインスタンスからbasic scalingのbackendインスタンスを非同期で起動することができます。

※6 TaskQueueではPullとPushの2種類のQueueを選択することができます。本検証で利用するのはPush Queueの方ですが、この2つのQueueの違いを知りたい場合は以下のリンクを参考にしてください。
http://www.apps-gcp.com/task-queue-rest-api-gce-pullqueue/

queueの設定をおこなう

TaskQueueの設定もcronと同様に非常に簡単です。queue.yamlという設定ファイルに実行するキューの名前とrate、サービスを定義するだけです。今回の検証で利用するqueueの名前は「myqueue」とします。targetには、前章でデプロイした「cron」サービスを指定します。

・queue.yaml

queue:
- name: myqueue
 rate: 1/s
 target: cron

 

ただし、cron.yamlの場合と同様に「target」は必須項目ではありません。「target」を指定しない場合は、デフォルト(※2)のサービスがターゲットになります。

 

設定項目 必須 説明
name キューの名前を定義する。プログラムからTaskQueueを実行するときに指定するキューの名前となる。
rate queueの速度を定義する(※6)。
target 起動対象のサービス(モジュール)を定義する。

表1. queue.yaml設定項目

※6 タスクキューの処理速度の定義については以下を参考にしてください。

https://cloud.google.com/appengine/docs/standard/java/taskqueue/push/creating-push-queueshl=ja

 

動作検証をおこなう

それでは実際に検証してみます。今回の検証では、cronの章で作成したサービス(basic scaling)をデフォルトサービス(automatic scaling)からキックしてみます。キックするサービスは既にデプロイ済みなので、今回デプロイするのはqueueを発行するためのデフォルトサービスのみです。app.yamlで定義されているautomatic scalingの設定項目についてはコチラを参考にしてください。

今回デプロイするのは「main.go」「app.yaml」「queue.yaml」です。

main.goでは「myqueue」(queue.yamlで定義したキュー)という名前のqueueを利用してタスクの発行を行っています。プログラム中の「/hello」は実際に実行されるURLです(cronの章でデプロイしたプログラムです)。

・main.go

package queue

import (
 "net/http"
 "google.golang.org/appengine"
 "google.golang.org/appengine/log"
 "google.golang.org/appengine/taskqueue"
)

func init() {
 http.HandleFunc("/queue", queue)
}

func queue(w http.ResponseWriter, r *http.Request) {
 c := appengine.NewContext(r)
 tq := taskqueue.NewPOSTTask("/hello", map[string][]string{})
 if _, err := taskqueue.Add(c, tq, "myqueue"); err != nil {
 http.Error(w, err.Error(), http.StatusInternalServerError)
 return
 }
}

 
・app.yaml

runtime: go
api_version: go1.8
instance_class: F1
automatic_scaling:
   min_idle_instances: 1
   max_idle_instances: automatic
   min_pending_latency: 30ms
   max_pending_latency: automatic
   max_concurrent_requests: 50

handlers:
- url: /.*
  script: _go_app

 
(1)ソースフォルダの作成
任意のフォルダを作成し「main.go」「app.yaml」「queue.yaml」を作成したフォルダ直下に移動します。

 

$ mkdir queue

 
(2)デフォルトサービスのデプロイ
以下のコマンドを実行しGAEアプリ(デフォルトサービス)のデプロイをおこないます。以下のコマンドに対して任意のパラメータを指定してください。「-M」オプションを利用せずにデプロイすれば、デフォルトサービスとしてデプロイされます。尚、最後のコマンド引数「queue/」は1で作成したフォルダです。

$ appcfg.py -A <プロジェクトID> -V <バージョン> update queue/

 
(3)curlからqueueを発行するURLにアクセス

$ curl http://<GCPプロジェクトID>.appspot.com/queue

 
(4)ログの確認
プログラム実行後、Cloudコンソールのロギング画面からログの確認を行います。以下の通り、ログからもqueueが正常に実行されていることがわかります。

※7 一つ目の赤枠がqueueの発行元のURLで、2つ目の赤枠が実行されたqueueが出力したログとなります。

以上でTaskQueueからサービスを呼び出す手順の説明は終了です。

まとめ

CronやTaskQueueによってGAEのサービスを用途によって実行できることが理解できたと思います。シンプルにデフォルトサービス上でcronからTaskQueueを利用する方法もありますが、1プロセスでバッチ処理を行いたい場合はcronからbasic scaling設定のサービスを実行することもできますし、TaskQueueの1タスク10分の制限を回避したい場合はタスク処理を実行するインスタンスを別サービス(basic scaling)にすることも可能です。CronやTaskQueueを利用すれば、要件に応じて柔軟にサービスを組み合わせることができます。

2008年のサービス開始直後はいろいろな制限があったGAEですが、現在は多くの面で制限が緩和されより使いやすいサービスになっていると言えます。
GAE、GCPにご興味もしくはご相談のある方は吉積情報、またはクラウドエースまでお問い合わせください。GAEに限らず、あらゆるGCPサービスのサポートが可能です。

  • このエントリーをはてなブックマークに追加

Google のクラウドサービスについてもっと詳しく知りたい、直接話が聞いてみたいという方のために、クラウドエースでは無料相談会を実施しております。お申し込みは下記ボタンより承っておりますので、この機会にぜひ弊社をご利用いただければと思います。

無料相談会のお申込みはこちら