Azure FunctionsのC#でPrecompiledを利用する場合、Azure Portalでの有効・無効がTriggerによっては効かないことがあります。
わかっている範囲でいうとHTTPTriggerは効くみたいなのですがそれ以外のTriggerはPortaで無効にしても有効のままになります。
PrecompiledはDLLを読むのでCSXと違って制御できないぽいです。この場合ソースに[disable]アノテーションを追加してAppSettingで有効・無効を管理するという方法で回避できます。
※この情報は2018年4月15日時点の情報となります。
検証
挙動について確認する場合はTimerTriggerのFunctionsを作成してFunctionsNameの下に[Disable("設定名")]を追加してみましょう。サンプルソースを載せておきます。
public static class SampleFunctions { [FunctionName("SampleFunctions01")] [Disable("DisableFlag01")] public static void Run01([TimerTrigger("10 * * * * *")]TimerInfo myTimer, TraceWriter log) { log.Info($"RUN01 C# Timer trigger function executed at: {DateTime.Now}"); } [FunctionName("SampleFunctions02")] [Disable("DisableFlag02")] public static void Run02([TimerTrigger("10 * * * * *")]TimerInfo myTimer, TraceWriter log) { log.Info($"RUN02 C# Timer trigger function executed at: {DateTime.Now}"); } }
Disableの設定名はAppSettingから取得するためのKEY名を設定しておきましょう。またTirggerのCron式は10秒にしてありますので任意に変更してください。
ローカルで確認するためにはlocal.settings.jsonにAppSettingの情報を設定しておきます。
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "AzureWebJobsDashboard": "UseDevelopmentStorage=true", "DisableFlag01": "false", "DisableFlag02": "true" } }
Disableは無効という意味なのでtrueを設定しまうと無効になってしまいます。有効にする場合は必ずfalseを設定しましょう。
この設定でローカル実行するとSampleFunctions02が無効になっているというメッセージが出力されSampleFunctions02は実行されません。
サンプルソースを実行してSampleFunctions02のログが出力されないことを確認してみてください。
Azure環境での検証
次にAzureにデプロイして環境を確認してみましょう。※ここではデプロイの方法は割愛します。
デプロイしたらアプリケーション設定にDisableアノテーションのKEY名を追加しておきます。
デプロイ直後のFunctionsを見てみるとポータル上で無効と表記されていますが、これはポータル上での仕様でそうなっているだけで稼働はしています。またPrecompiledでデプロイするとFunctionsの設定周りがReadOnlyになるため設定の変更ができなくなります。
モニターをクリックしてFunctionsが実行されているのか確認をします。DisableをTrueにしているSampleFunctions02の方はモニターを見てもログが出力されていないはずです。AppSettingのDisableをFlaseにすると有効になりログが出力されるようになるので確認してみましょう。
上記の画像で無効と表示されている理由としてはfunction.jsonのdisabledプロパティがtrueまたfalseになっていないからです。もともdisabledのプロパティはfunctions自体が持っておりjsonファイルの設定で有効無効を維持しています。PrecompiledではないFunctionsでポータルから有効・無効を切り替えるとfunction.jsonのdisagbledプロパティがtrueかfalseに上書きされます。ここではAppSettingのKEYを指定しているためポータルで認識できなくて無効と表示されているようです。今後ポータルの改修で改善される点かもしれません。
注意が必要なのがPrecompiled版のReadOnlyをoffにしてポータルの有効・無効を実施してしまうと上記のdisabledの値をtrueかfalseで上書きしてしまうのでAppSettingから設定を読むことができなくなります。Precompiledで利用する場合はReadOnlyのまま利用するようにしましょう。