前回は Python で Azure Functions をローカルで開発するときの環境セットアップと、HTTP トリガーの Function App を作りました。
今回はタイマートリガー、つまり一定の時間間隔で起動するような Function App を作ってみます。
時間指定とか特定の間隔で動くバッチ的なものは、クラウドを使う中ではレガシーなアーキテクチャーを使っている際のイケてないパターンなことが多いと個人的に思ってます。
アーキテクチャーの議論は本題ではないので書く気はないですが、イベントドリブンでガンガン動かしてしていく方がいろんな意味でよいということだけは雑に書いておきます。バッチ処理という概念を持ってる時点でレガシー、そして多くの場合何も考えてない。もちろん必要なケースもあるんでしょうけど(知らんけど。
とさんざんディスってる空気がある中、必要に駆られることもありそうだなーと思い続けていきます。
Azure ポータルから作成を...
Azure ポータルから作成もできますが、ここではしません。ローカルデバッグしたいし。
VS Code から Function App を作成
準備
前提として、前回のブログ でやったような開発環境の準備は終わっていることが前提です。
プロジェクトの作成
VS Code のターミナルで適当なディレクトリを開き以下のコマンドで Function App のプロジェクトを作ります。
func init HelloTimerProject --python
作成されたプロジェクトのフォルダ HelloTimerProject
をVS Code のルートとして開きなおします。
code HelloTimerProject -r
仮想環境のアクティベート
必要に応じてやっておきます。私の今の環境だと python を動かすコマンドが python
なので
python -m venv .venv
からの
.venv\scripts\activate
でアクティベートされていることを確認します。
タイマートリガーの Function を追加
このプロジェクトにタイマートリガーの function を追加します。追加するコマンドは、テンプレートを指定せずに function の名前だけ指定してみましょう。以下図のようにテンプレートを選択できます。ほかのトリガーの function を作りたいならここから選ぶだけです。今回は Timer trigger を選び、Enter キーを押します。
スケジュールの設定
作成されたフォルダの中を開き、トリガーの定義が書かれている functions.json を見てみます。
9行目がスケジュールを定義している部分です。NCRONTAB 式で表現します。ほかの形式でも書けますが制約があるので基本的には NCRONTAB でよいかなと思ってます。
NCRONTAB 式は、迷ったら以下のドキュメントを参考に書けばばっちりです。
function.json の構成
function.json で設定できるプロパティは以下のドキュメントに記載があります。
よく使いそうなのは runOnStartup
でしょうか。これを true
に設定すると、function のホスト起動時にもエントリーポイントが実行されます。ローカルでデバッグする際、起動後一定時間待つのはつらいので true
にセットすることで便利に扱えます。今回は上図の9行目で設定しています。
エントリーポイントである init.py を開くと、ログをはいてるだけのプログラムとなります。これをデバッグで実行して runOnStartup
の設定により起動時にも main
メソッドが起動してログがはかれるか確認してみます。
デバッグ実行
以下のコマンドでデバッグ実行してみましょう。
func start
ログをみてわかる通り、Function ホストの起動時に main
メソッドが起動してログが出ています。その後は 1分おきに main
メソッドが動いてログが表示されています。
開発における補足
Function App をタイマートリガーでバッチ起動したところで、従量課金プランだとデフォルト5分、最大10分でタイムアウトしま。タイムアウトは host.json で設定しできます。
10分あれば十分だと思いますが、実行時間の長いバッチなんだよーと悩む方は、function をわけて Queue などを使ってチェーンさせましょう。ワークフローの管理が大変になりそうだったら Durable Functionsという選択肢もあります。
デプロイ
これは前回のブログの後半VS Code からデプロイとさほどかわらないのでここでは触れません。
まとめ
以下2つのドキュメントを参考に開発すればばっちりです。