Cloud Functionsをcron実行したい...。
誰もが思うこの機能ですが、しかしCloud Functions自体にはCron機能はなく、何かしら別のサービスを組み合わせる必要があります。
私はCloud FunctionsのトリガーにCloud PubSubを設定し、Azure FunctionからメッセージをPublishすることで定期実行をやっていました。
HTTPをトリガーとしていないのは、セキュリティの問題です。Cloud FunctionsのURLはリージョン/プロジェクトID/名前で決まるので、特定されやすいとか、コードで認証つけたとしても認証されるまではちょっと実行される等々細かいところを突っ込まれるので、pubsubを使っています。
なぜAzure Functionだけでやっていなのはというと、Azure Functionでは動作しないが、Cloud Functionsでは動作する、というものがあったからです(詳細は省略)。
前置きが長くなりましたが、11月にリリースされたCloud Schedulerを使うことでより簡単に定期実行ができるようになりした。
上記のAzure Functionの部分をCloud Schedulerに置き換えた方法をご紹介致します。
https://cloud.google.com/scheduler/docs/quickstart
https://cloud.google.com/scheduler/docs/tut-pub-sub
- Create Cloud PubSub
- Create Cloud Functions
- Create Cloud Scheduler
- Run Job
Cloud PubSub
Cloud PubSubを作ります。中継ポイントとなります。
$ gcloud pubsub topics create test-topic
Creater Cloud Functions
--trigger-topic=test-topic
というふうに先程作成したトピックを指定していきます。
$ gcloud functions deploy test --source='https://source.developers.google.com/projects/<project-id>/repos/tyarin/moveable-aliases/gcp' --runtime=nodejs8 --trigger-topic=test-topic
Create Cloud Scheduler Job
ポータルのCloud Scheduler => ジョブを作成
ここでペイロードに動的な値(例えば時刻など)を入力する方法がわかりませんでした。ご存知の方教えていただけると幸いです。
Run Job
ジョブ作成後、ジョブ一覧が見えるので「今すぐ実行」ボタンを押下。
下記のように結果が成功となればOKです。
まとめ
Cloud Schedulerをつかってcron形式でCloud Functionsを呼び出すことができました。
いままではAzure FunctionにGCPのクレデンシャルをもってきて...とやっていたのでそのへん楽になりました。