BEACHSIDE BLOG

Azure とか C# 好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

Python + Azure Functions 入門: タイマートリガー 編

前回は Python で Azure Functions をローカルで開発するときの環境セットアップと、HTTP トリガーの Function App を作りました。

blog.beachside.dev

今回はタイマートリガー、つまり一定の時間間隔で起動するような Function App を作ってみます。

時間指定とか特定の間隔で動くバッチ的なものは、クラウドを使う中ではレガシーなアーキテクチャーを使っている際のイケてないパターンなことが多いと個人的に思ってます。

アーキテクチャーの議論は本題ではないので書く気はないですが、イベントドリブンでガンガン動かしてしていく方がいろんな意味でよいということだけは雑に書いておきます。バッチ処理という概念を持ってる時点でレガシー、そして多くの場合何も考えてない。もちろん必要なケースもあるんでしょうけど(知らんけど。

とさんざんディスってる空気がある中、必要に駆られることもありそうだなーと思い続けていきます。

Azure ポータルから作成を...

Azure ポータルから作成もできますが、ここではしません。ローカルデバッグしたいし。

VS Code から Function App を作成

準備

前提として、前回のブログ でやったような開発環境の準備は終わっていることが前提です。

プロジェクトの作成

VS Code のターミナルで適当なディレクトリを開き以下のコマンドで Function App のプロジェクトを作ります。

func init HelloTimerProject --python

f:id:beachside:20200908120021p:plain

作成されたプロジェクトのフォルダ HelloTimerProject をVS Code のルートとして開きなおします。

code HelloTimerProject -r

仮想環境のアクティベート

必要に応じてやっておきます。私の今の環境だと python を動かすコマンドが python なので

python -m venv .venv

からの

.venv\scripts\activate

でアクティベートされていることを確認します。

f:id:beachside:20200908130129p:plain

タイマートリガーの Function を追加

このプロジェクトにタイマートリガーの function を追加します。追加するコマンドは、テンプレートを指定せずに function の名前だけ指定してみましょう。以下図のようにテンプレートを選択できます。ほかのトリガーの function を作りたいならここから選ぶだけです。今回は Timer trigger を選び、Enter キーを押します。

f:id:beachside:20200908123332p:plain

スケジュールの設定

作成されたフォルダの中を開き、トリガーの定義が書かれている functions.json を見てみます。

f:id:beachside:20200908130504p:plain

9行目がスケジュールを定義している部分です。NCRONTAB 式で表現します。ほかの形式でも書けますが制約があるので基本的には NCRONTAB でよいかなと思ってます。

NCRONTAB 式は、迷ったら以下のドキュメントを参考に書けばばっちりです。

function.json の構成

function.json で設定できるプロパティは以下のドキュメントに記載があります。

よく使いそうなのは runOnStartup でしょうか。これを true に設定すると、function のホスト起動時にもエントリーポイントが実行されます。ローカルでデバッグする際、起動後一定時間待つのはつらいので true にセットすることで便利に扱えます。今回は上図の9行目で設定しています。

エントリーポイントである init.py を開くと、ログをはいてるだけのプログラムとなります。これをデバッグで実行して runOnStartup の設定により起動時にも main メソッドが起動してログがはかれるか確認してみます。

デバッグ実行

以下のコマンドでデバッグ実行してみましょう。

func start

ログをみてわかる通り、Function ホストの起動時に main メソッドが起動してログが出ています。その後は 1分おきに main メソッドが動いてログが表示されています。

f:id:beachside:20200908132325p:plain

開発における補足

Function App をタイマートリガーでバッチ起動したところで、従量課金プランだとデフォルト5分、最大10分でタイムアウトしま。タイムアウトは host.json で設定しできます。

10分あれば十分だと思いますが、実行時間の長いバッチなんだよーと悩む方は、function をわけて Queue などを使ってチェーンさせましょう。ワークフローの管理が大変になりそうだったら Durable Functionsという選択肢もあります。

デプロイ

これは前回のブログの後半VS Code からデプロイとさほどかわらないのでここでは触れません。

まとめ

以下2つのドキュメントを参考に開発すればばっちりです。

docs.microsoft.com

docs.microsoft.com