F#とAzure Functions

Azure Functionsがなかなか便利で、すでに仕事で何度か利用しています。
ご紹介も兼ねて簡単なサンプルを載せておきたいと思います。
ここではHTTPリクエストに対して自分自身を送り返すQuine的な関数を作ってみます。

前提知識やメモ

  • run.fsxに処理を記述する
  • Azureポータル上のエディタが意外と高機能なので簡単な関数ならブラウザだけで書けちゃう
  • run関数のシグネチャは変更できない(引数名を変えただけで怒られた)
  • Azure Functionsが参照しているFSharp.Coreのバージョンがちょっと古いんじゃないか疑惑
  • グローバル変数を定義すると実行時に例外が発生(原因がよく分かっていない)
  • 初回アクセス時は反応が遅い
  • cron的なタイマー付き関数も簡単に実装できる
  • Async.Parallelが使えた(検証は不十分だが結構うれしい)

関数の下準備

Azureポータル上で、[HTTP trigger][F#][Name:Quine][Authorization level:Anonymous]という設定で関数を作成します。

実装

次のようなスクリプトを書きます。
__SOURCE_DIRECTORY__以下にあるrun.fsxファイル(自身)を読み込んでレスポンスとして返しています。


#r "System.Net.Http"

open System.IO
open System.Text
open System.Net

let run (req:HttpRequestMessage, log:TraceWriter) =
async {
let code =
Path.Combine(__SOURCE_DIRECTORY__, "run.fsx")
|> File.ReadAllText

let response = req.CreateResponse(HttpStatusCode.OK)
response.Content <- new StringContent(code, Encoding.UTF8, "text/plain")
return response
}
|> Async.RunSynchronously

動作確認

Azureポータル上でも動作テストが行えますが、関数のURLを取得すると実際にアクセスすることができます。
今回作成した関数のサンプルがこちら。
https://hellofsharp.azurewebsites.net/api/Quine