Cloud Functions & Pub/Sub & Cloud Scheduler でクローラーを動かす
2019.10.15
Cloud Functions、Pub/SubとCloud Schedulerを利用して、タスクを自動化してみました。
弊社では、 qrop docs という農業キュレーションメディアをやっているのですが、その農業に関わるニュース記事を収集するクローラーをサーバーレスでタスクを自動化したいなと思い、今回Cloud Functions、Pub/SubとCloud Schedulerを使いやってみました。
(App Engineでもいいのではないか?と思われる方もいらっしゃるかと思いますが、試しにという気持ちでやってみました)
1. ファイルの作成とfunctionsへのDeploy, Pub/Subの作成
今回はクローラーを実行する main.py
を下記のように作成しました。request['data']
には、Cloud Schedulerのペイロードに設定した内容が入ってきます。
Cloud Functionsは現在最大の実行時間が9分となっているため、Schedulerからそのタイミングで実行するIDを渡して、タスクを処理するようにしました。
./app/main.py
import argparse
import base64
from batch import crawler
import os
# for google cloud functions
def crawl(request, callback):
id = int(base64.b64decode(request['data']))
crawler.runForRss(id)
そして、このファイルをdeployするコマンドは下記のようになります。--set-env-vars
で functionsで利用する環境変数を設定できたり、--timeout
でfunctionsの最大実行時間を設定できます。--trigger-resource
には、作成したいPub/SubのトピックIDを設定します。--entry-point
は、実行したいmain.pyのmethod名を指定します。今回でいうと上で書いた crawl
です。
$ gcloud functions deploy ${FUNCTION_NAME} \
--source ./app --runtime python37 \
--region asia-northeast1 --timeout 540 \
--trigger-resource ${TRIGGER_NAME} \
--trigger-event google.pubsub.topic.publish \
--entry-point ${ENTRY_POINT_NAME} \
--project $(PROD_PROJECT_ID)\
--set-env-vars="API_URL"="$(PROD_API_URL)","BASIC_USER"="${BASIC_USER}","BASIC_PASSWORD"="$(BASIC_PASSWORD)"
上記を実行するとGCPのコンソールで Pub/Sub のページより、作成されたトピック名が確認可能です。
2. Cloud Schedulerの作成
次は、functionsを定期実行するためのスケジューラーを作成します。
Cloud Scheduler のページより、作成します。
ジョブの作成から下記画面に遷移し、登録します。
頻度は、cronと同じように書けるので、 3時間ごとに X時15分
に実行したいとすると15 */3 * * *
とかけます。
ターゲットはPub/Subに設定して、トピックには先ほど作成したPub/Subの名前を設定します。
ペイロードには今回は実行時にIDを設定しているため、intで数値を入れていますが、開発者の設定したい値を設定すればいいかと思います。(使い方違っていたら指摘してください!)
まとめ
これらを設定するだけで、Cloud Functionsを定期実行することが出来ました!
App Engineとかを使うほどでもないなーというタスクにはCloud Functionsを利用するというのも一つの手かと思います。
また何かいい使い方があれば、ブログにしたいと思います。