色んな事を書く

シンプルさを極めたエンジニアになりたい

Azure Function の Timer Trigger の色々

TimerTrigger Attribute で指定出来る事

ここにまとまってます。

learn.microsoft.com

Schedule には CRON 式か TimeSpan を指定出来る

Schedule は Function の実行間隔を定義できるものです。その定義の仕方として CRON 式と TimeSpan が使えるよという事ですな。

CRON 式は苦手なので覚書をせんとなぁと思っています。毎回 Chat GPT に作ってもらってるので、それでいいかなぁという気持ちにもなっていますが。

秒 分 時 日 月 曜日 という順番で定義するとだけ覚えておこう。複雑なのが書けなくても最低限読めるように。

TimeSpan は正確に言うと TimeSpan 値を指定出来る、です。なので TimeSpan.FromMinutes(1) とかではなく、00:01:00 のようにせねばいけません。TimerTrigger Attributestring しか受け付けないようになっています。

1 年に一回の起動をさせたければ、365.00:00:00 のような感じになりますね。これはこれでわかりにくい。

ちなみにですが、設定名を % で囲んでおくと Schedule に設定できます。例えば、

[Function("TimerTriggerSample")]
public void Run([TimerTrigger("%SampleTimerSchedule%")] TimerInfo myTimer)
{
    _logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

    if (myTimer.ScheduleStatus is not null)
    {
        _logger.LogInformation($"Next timer schedule at: {myTimer.ScheduleStatus.Next}");
    }
}

のように定義すると、%SampleTimerSchedule% の設定値をそのまま使えます。AppService 上から簡単に起動間隔を修正できます。

参考:

https://github.com/Azure/azure-webjobs-sdk-extensions/blob/030eb3966f2f8569abf010c9b5ac0b5130205b53/src/WebJobs.Extensions/Extensions/Timers/TimerTriggerAttribute.cs#L25

RunOnStartup を true に指定すると、Function Runtime の起動時に Function を実行できる

なので開発環境では true にしておくのが便利かと思います。1h に一度起動するみたいな Function の動作確認がだるいですからね。

Function Runtime の起動時という事なので、Azure にデプロイすると例えば Function App 自体の再起動時やインスタンスのスケールアウト時に Function が実行できるということになります。本番環境で true にするのは推奨されていないみたいですね。

ま、Timer Trigger の場合はスケールアウトしても単一のインスタンスのみでの実行になるみたいですけどね。

UseMonitor で Blob にスケジュールを記録するか切り替える

規定では true となっていて Timer Trigger Atrbute では false にすることが出来ません。ただドキュメントには実行間隔が 1 分以上の場合は true と書かれているので、未満にすると記録されないのかもしれません。

以下に答えが書いてありましたが、1 分未満の場合は false になるようです。つまり 1 分未満の場合は Blob に実行履歴が記録されません。前回の実行状態を把握できなくなるため、推奨されていません。

https://github.com/Azure/azure-webjobs-sdk-extensions/blob/030eb3966f2f8569abf010c9b5ac0b5130205b53/src/WebJobs.Extensions/Extensions/Timers/Scheduling/TimerSchedule.cs#L68-L87

このコードはどんな順番で呼び出されるのか?

https://github.com/Azure/azure-webjobs-sdk-extensions/blob/030eb3966f2f8569abf010c9b5ac0b5130205b53/src/WebJobs.Extensions/Extensions/Timers/Bindings/TimerTriggerAttributeBindingProvider.cs#L47

Blob に記録する実行状態

Blob に以下のような json を記録して実行状態を管理しています。

{
  "Last": "2023-03-01T16:00:35.0115543+09:00",
  "Next": "2023-03-01T16:01:35+09:00",
  "LastUpdated": "2023-03-01T16:00:35.0115543+09:00"
}

それぞれ

  • Last: 前回メソッド実行日時
  • Next: 前回 ScheduleStatus 更新した時点での、次のスケジュール実行予定日時
  • LastUpdated: 前回 ScheduleStatus 更新した日時

という値になってます。この json が TimerTrigger Function に Bind される TimerInfo.SchedleStatusマッピングされます。

と書いてもあんまりよくわからないので、実際にどのタイミングで値が決まり更新されるのかコードを追っていきます。

何故スケールアウトされても単一のインスタんで実行されるのか

Blob lease の話。