今回はGCPのCloud Functionsを定期実行する方法を紹介します。
Cloud Functionsを定期実行する方法
まず、Cloud Functions単体ではCloud Functionsで作成した関数を定期実行することはできません。
Cloud Functionsを定期実行するためにはGCPの別サービスであるCloud SchedulerとCloud Pub/Subと組み合わせる必要があります。
3つのサービスを使うと思うと難しく感じるかもしれませんが、やってみると簡単なのでご安心ください。
それぞれの概要は後ほどお伝えするとして、最初に大まかな流れを紹介します。
- Cloud Schedulerで定期実行タスク(ジョブ)を生成する
- Pub/Subが定期実行タスクを受け取りトリガーを生成する
- FunctionsがPub/SubをトリガーにFunctionsを実行する
ここからは利用される3つのサービスについて紹介します。
Cloud Schedulerとは定期的にcronタスク(ジョブ)を作成するサービスです。
cronとは「何を」「いつ」実行するかというルールを記載したもので、定期的なメールマガジンの配信などに利用されています。
記載ルールは後ほどの実行手順で紹介します。
Cloud Pub/Subとは、メッセージを送る人とメッセージを受け取る人をつなぐメッセージングと呼ばれるサービスです。
メッセージを送る人をPublisher, メッセージを受け取る人をSubscriberと呼びます。
今回だとメッセージを送る人であるCloud Schedulerとメッセージを受け取る人であるCloud Functionsをつなぐ役割を担っています。
Cloud Functionsとは指定されたトリガーをきっかけに作成した関数を実行するサービスです。
関数はPython, Node.js, .NETなど様々な言語で記述することができます。
Cloud Functionsの定期実行手順
ここからはCloud Functionsの定期実行手順について説明します。
まずは以下ボタンからCloud Functionsのページを開きます。
上部にある関数の作成ボタンを押します。
もしも以下画面が表示されたら有効にするを選択します。関連するGCPサービスのAPIが有効になります。
以下画面が表示されたら環境を第2世代を選択します。
上記画面でEVENTARCトリガーを追加ボタンを押します。
以下画面が表示されたらEVENTARC APIを有効にするボタンを押します。
以下画面が表示されたらCloud Pub/Subトピックを選択してくださいを選択します。
トピックを作成するを押します。
適当なトピックID(ex. schedule)を入力してトピックを作成ボタンを押します。
Cloud Pub/SubでIDトークン~という画面が出ているはずなので、付与ボタンを押し、トリガーを保存ボタンを押します。
次へボタンを押します。
もしも以下画面が表示されたら有効にするを選択します。
ランタイムはお好みですが、今回はPython 3.10を選択して、デプロイボタンを押します。
エラーがなければ、3分程度待つと関数が作成されているはずです。
以下のように関数名(function-1)の左に緑のチェックマークが表示されていれば成功です。
以上で関数の準備は完了です。
以下ボタンからCloud Schedulerのページを開きます。
以下画面が表示されるので、上部にあるジョブを作成ボタンを押します。
以下画面のように設定します。
頻度についてはcron形式と呼ばれる五桁の*****で指定します。
「*」の位置 | 頻度 | 指定できる数字 |
---|---|---|
1番目 | 分 | 0-59 |
2番目 | 時 | 0-23 |
3番目 | 日 | 1-31 |
4番目 | 月 | 1-12 |
5番目 | 曜日 | 0-7(0が日曜) |
以下にいくつか例を載せます。
- 毎月1日の午前9時30分にコマンドを実行する場合:
30 09 01 * * - 毎時0分で5分おきにコマンドを実行する場合(今回のケース):
*/5 * * * *
設定が完了して続行ボタンを押し、実行内容を構成するで以下のように設定します。
作成ボタンを押すとジョブが作成され、以下の画面が表示されます。
次の実行が次回の実行予定時刻です。
該当時刻になると以下のように前回の実行結果に成功と表示されるはずです。
それでは実行結果を確認していきましょう。
Cloud Functionsに戻り、作成した関数(function-1)を選択します。
ログタブを表示することで、関数の実行ログを確認できます。
うまく成功していれば、上記のように5min_schedulerとCloud Schedulerで設定したメッセージが表示されているはずです。
Cloud Functionsでログを眺めるだけでは物足りないので、定期的にLINE通知するテストをしてみます。
Cloud Functionを開き、ソースコードを記載していきます。
import base64
import functions_framework
import requests
@functions_framework.cloud_event
def line_notify(cloud_event):
message = base64.b64decode(cloud_event.data["message"]["data"])
# params
LINE_TOKEN = "YOUR LINE TOKEN"
headers = {
"Authorization": f"Bearer {LINE_TOKEN}",
}
files = {"message": (None, message)}
# send
requests.post("https://notify-api.line.me/api/notify", headers=headers, files=files)
functions-framework==3.*
requests==2.28.1
requests-file==1.5.1
requests-oauthlib==1.3.1
requests-toolbelt==0.9.1
メッセージを5min_schedulerからschedule_testに変えていますが、無事以下のように受信できました。
まとめ
今回はGCPのCloud Functionsを定期実行する方法について紹介しました。
簡単な定期実行を行うためにも3つのサービスを理解しないといけないのは少し難しく感じますが、実際にやってみると簡単だったと思います。
ご意見やご質問がありましたらお気軽によろしくお願いします。コメントお待ちしております!