外部API呼び出しを定期実行する処理をAzure Functionsで実装する(C#)

タイトルの通りです。サーバがあれば実行ファイルを置いてcronで実行させるのが手っ取り早いですが、クラウドのサービスを使って手軽にできないか試したら意外と簡単だったのでその時の備忘録です。1時間に1回の時報をslackに通知する、というケースで書いています。

必要なもの

  • Azureアカウント
  • Visual Studio
    • 今回は Visual Studio 2022を使いました。

1. Azureポータルで関数アプリを作成する

  • Azureポータルにアクセス
  • Azureサービスの一覧から [関数アプリ] を選択
  • [+作成] をクリック
  • 以下の画像の通りに必要な情報を入力
    • 今回のケースでは関数アプリ名は [jihou] とした
  • [作成] をクリック

2. Visual Studioでコードを書く

  • 新しいプロジェクトを作成
  • プロジェクト名を入力
  • [Timer trigger] を選択
    • 各時間の0分に通知してほしいので [Schedule] には「0 0 * * * *」と書く(記法について
  • コードを書く。
    • 17行目の変数 [url] にAPIのURLを代入
    • 18行目の変数 [payload] にPOSTするデータを代入
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;

namespace Jihou
{
    public class JihouHour
    {
        [FunctionName("JihouHour")]
        public void Run([TimerTrigger("0 0 * * * *")]TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

            var url = "https://hooks.slack.com/services/*******************************";
            var payload = new Payload
            {
                text = DateTime.Now.ToString("yyyy/MM/dd HH") + "時です。"
            };

            var json = JsonSerializer.Serialize(payload);

            var client = new HttpClient();
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            var res = client.PostAsync(url, content).Result;
            log.LogInformation(res.ToString());
        }
    }

    public class Payload
    {
        public string text { get; set; }
    }
}

尚、その場で動作を確認したい場合はVisual Studioのデバッグ([F5]キー)機能が使えます。その際は実行間隔を短く設定すればすぐに動作を確認できます。例えば [TimerTrigger("0 */1 * * * *")] とすれば1分ごとに実行してくれます。

3. コードをAzureにアップロードする

  • Visual Studio のプロジェクト名を右クリックして [発行] をクリック
  • ターゲットとして [Azure] を選択
  • [Azure Funciton App (Windows)] を選択
  • 冒頭で作成した関数アプリ [jihou] を選択
  • 公開の準備が完了
  • [発行] を押すとAzureにデプロイされる

確認

1時間に1回slackに通知が来ます。

参考