Google APP Engineの活用方法–定期ジョブ管理

皆さん

こんにちは、GMOアドマーケティングのS.Rです。

GCP(Google Cloud Platform)を使ってる時に定期ジョブ管理をどうやって実現していますか。今回はGCPでよく使われてる定期ジョブ管理方法を紹介します。※この記事を理解するには、Python、Http、Linuxのshellコマンドの基本知識が必要です。本記事中の図説は、筆者が自らの環境で作成したものを含みます。

すぐに思いつく定期ジョブ管理方法

定期ジョブ管理というとすぐ思いつくツールがCronです。図1は誰でも思いつく定期ジョブの解決方法です。一つGCE(Google Compute Engine)を立ち上げて、 CronサーバーとしてCron Scriptを登録し、24時間動かし続けます。 指定された時間にGCPのSDKと連携して、定期ジョブを動かします。

 

図1:Google Compute EngineでCron Jobを管理する

この方法は下記3つの大きな欠点があります:

  1. Logが管理しづらい:GoogleSSHでCompute Engineへ連携しなければLogを確認できません。
  2. 無駄な料金がかかります:定期ジョブを実行してない時間にも料金がかかります。
  3. スケーリングできない:定期ジョブの計算量が変わってもCronサーバーの計算力を調整できません。

この3つ欠点に対して今回は改良できる管理方法を紹介します

Google APP Engineで定期ジョブを管理する

Google App Engineは公式のサードに説明は下記です。

Google App Engine は、Google のインフラの上でアプリケーションを作り、実行できるようにする PaaS ( Platform as a Service : サービスとしてのプラットフォーム)です。App Engine アプリケーションは、作るのもメンテナンスするのも簡単で、トラフィックやデータストレージのニーズの増減にあわせてスケーリングするのも簡単です。App Engine を使えば、自分でメンテナンスしなければならないサーバーはなくなります。単純にアプリケーションをアップロードすれば、それだけで実行できます。

GAEは定期ジョブを管理する機能があります。今回はGAEで定期ジョブを管理する方法を紹介します。今回の例として、GAEの定期ジョブで一日毎にDataprocのインスタンスを立ち上げ、タスクを実行した後、インスタンスを削除するタスクを管理します

図2:Google APP Engineで定期ジョブを管理する

環境設定

  1. GAEを利用するにあたり、Google SDKの設定をします。設定方法はGoogle Cloudの公式サイトを参考にしてください。
  2. Pythonのか仮想的な環境ツールvirtualenvをインストールします。コマンドは下記の通りです
  3. GAE SDKにGCPのユーザーにログインしてKeyファイルを作りましょう。

    図3:GAE SDKにGCPのユーザーにログインしてKeyファイルを作りましょう

    作成されたKeyファイルは~/.bashrcに追加します。

    設定を再読込します。

  4. Pythonの仮想環境を作成します。

ソースコードを作成

例のソースコードを下記のsetpで作成します。

  1. 図4ようなソースコードツリーを作ります。

    図4:ソースコードツリー
  2. appengine_config.pyの中身は下記のコードを入ります。

  3. requirements.txtの中身は下記のコードを記述します

  4. 定期ジョブが依存しているLibrary をインストールします。

  5. cron.yamlの中身は下書き方は簡単な説明は下記です。

    詳しくcron.yamlの書き方を知りたい方はGoogle公式サイトに参考してください。今回の例のCron.yamlの中身は下記です。

  6. 定期ジョブの本体を作成します。定期ジョブは3つの部分があります。
    1. DataprocのInstanceを立ち上げます。DataprocのPython ApiはGoogle公式サイトを参考にしてください。

    2. DataprocのInstanceを削除します。

    3. 定期ジョブのGet requestのHandler関数:GAEのCronサーバーからきたrequestであれば、requestのheaderに項目の’X-AppEngine-Cron’はTrueとなってます。

      最後は作成したWSGIApplication Classを返却します。

  7. 定期ジョブの本体を作成します。

  8. Firewall rulesを設定します。GAEでCron サーバーのIP Address以外を拒否します
    1. 図5: Firewall rulesを設定します
  9. 環境設定するScript .bashrcを実行します

Local環境で例を試す

本番のサーバーへDepolyする前にまずLocal環境で作成したコードを試します。まず下記のコマンドよってLocal環境でコードを起動します。

ブラウザでlocalhost:8000へ訪問し、 Local環境の管理画面を見えます。「Cron Jobs」を選択して「Run now」buttonを押してコードを起動できます。

図6:Local環境の管理画面

GAEで例を試す

Local環境で定期ジョブのテストが完成したら 、下記のコマンドよってGAEでコードをDeployします。

GAEの管理画面から、Cron Jobsを選択して「Run now」buttonを押しコードを起動します。

図7:GAEの管理画面

GAEで定期ジョブを削除する

GAEで定期ジョブを停止したい時は下記ようなCron.yamlに一行目以外のコードを削除してもう一度GAEへDeployします。

Deployするコマンドは下記です。

3まとめ

今回はGAEで定期ジョブの一例を紹介しました。いかがだったでしょうか。GCPでプロダクトを開発する時に定期ジョブの開発が多いと思います。機会があれば皆さんぜひ試してみてください。