かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Azure Functions の Durable Functions を使って恋人を作ろう

Firebase って使うと色々な効能があるというのを見かけたんです。

じゃぁ Azure Functions を使ってこれらのメリットのどれか実現できないか!?と思ったので作ってみました。とりあえずモテるというやつを実現してみましょう!

恋人を作るには告白して返事をもらわないといけない

そういうワークフローを回せば OK ですね! Azure Functions の中でも特にイケてる機能に Durable Functions というのがあります。

docs.microsoft.com

この Durable Functions には人の承認が入るワークフローを処理するための機能があります。 外部イベントがそれです。

docs.microsoft.com

以下のようにコードを書くだけで、Approval という外部イベントが来るまで、そこで処理が止まったような動きになります。 実際には処理が止まるわけではなく、賢く何度も再実行されてイベントが来てなかったらそこで終わるみたいな動きになってるみたいなので、外部イベント待ってる間コンピューターを占有して課金対象になるということはありません。

// Approval というイベントが来るまで待つみたいな動きをする
var approved = await context.WaitForExternalEvent<bool>("Approval");

そして、別のところでこんな風にイベントを発火できます。

await client.RaiseEventAsync(instanceId, "Approval", approved);

ということで、チャットで告白したい相手のメールアドレスを伝えるとラブレターをメールで送信して相手から OK/NG の返事がきたら返答をくれるチャットボットを作ってみました。 告白のワークフローは Azure Functions の Durable Functions を使ってチャットボットは Azure Functions で Bot Builder SDK を使って作ってみました。

Slack に繋いで動かしてみるとこんな感じです。

f:id:okazuki:20180707001247p:plain

ここまでやると、入力したメールアドレスの先にこんなメールが飛びます。

f:id:okazuki:20180707001403p:plain

このメールのリンクをクリックすることで Azure Functions の関数が呼ばれて、その中で RaiseEventAsync が呼び出されて WaitForExternalEvent で待ってたところの処理が先に進むようにしています。

Slack 側にこんな風に通知が来ます!!

f:id:okazuki:20180707011358p:plain

f:id:okazuki:20180707012445p:plain

やったね!これで Slack や Skype とかのチャットからメアドを知ってる人相手にラブレターが送れますね!

まとめ

Azure Functions の Durable Functions を使うと人の承認が必要なワークフローのような処理を簡単に直感的に書くことが出来ますね!凄い。

コードはここにあげておきました。

github.com