Cloud Functions の関数を実行させる方法として色々なトリガーが用意されていますが、決められた時間に定期実行させるトリガーは用意されていません。
ということは、他の Google Cloud サービスを使用して実現する必要があります。
目次
仕組み
Cloud Functions の関数を決められた時間に定期実行するには、Cloud Scheduler を使用します。
Cloud Scheduler では、作業単位のスケジュールを設定して、定義した回数または一定の間隔で以下のターゲットを実行できます。
- HTTP/S エンドポイント
- Pub/Sub トピック
- App Engine アプリケーション
つまり、Cloud Scheduler から定期的にメッセージを発行して、Cloud Pub/Sub からメッセージを Cloud Functions に通知することで、Python のプログラムを定期実行することができるという訳です。
Cloud Functions
プログラム
関数が実行されると現在時刻を出力するプログラムを書いてみます。
from datetime import datetime, timedelta, timezone
def main(event, context):
dt = datetime.now(tz=timezone(timedelta(hours=9), 'JST'))
print(f"起動時間: {dt.strftime('%FT%T')}")
デプロイ
$ gcloud functions deploy FUNCTION_NAME \
--trigger-topic=TOPIC_NAME \
--region=asia-northeast1 \
--runtime=python39 \
--source=. \
--entry-point=main
Cloud Scheduler
cron
Cloud Scheduler では cron 形式で実行タイミングを設定できます。
minute hour day month day_of_week
* * * * *
対象 | 範囲 |
---|---|
minute | [0, 59] |
hour | [0, 23] |
day | [1, 31] |
month | [1, 12] |
day_of_week | [0, 7] 、日曜スタート |
* * * * * # 毎分
0,10,20,30,40,50 * * * * # 10分ごと
*/10 * * * * # 10分ごと
0 9-18 * * * # 9時から18時の毎時0分ごと
ジョブを作成
例として、月曜から金曜の9時から18時の毎時0分でジョブを作成してみます。
$ gcloud scheduler jobs create pubsub JOB_NAME \
--schedule="0 9-18 * * 1-5" \
--time-zone=Asia/Tokyo \
--topic=TOPIC_NAME \
--message-body="{}" \
--description="ジョブの説明文"
動作確認
Cloud Functions のログを確認してみて、1時間に1回関数が実行されていれば正確に動作しています。
コメント
コメント一覧 (2件)
まさに最近こちらを実現したく、この記事がとても参考になりました。ありがとうございました。
筋Tech さん
お返事遅くなってしまい申し訳ありません。
記事がお役に立てて嬉しいです!
また、スタバのギフトカードもありがとうございました!
美味しくいただきました٩( ๑^ _^)۶