---
title: Azure Durable Functions に入門してみる
tags: 
author: [t_shinnosuke](https://www.docswell.com/user/shinnosuke)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/Y79N615R73.jpg?width=480
description: Azure Durable Functions に入門してみる by t_shinnosuke
published: November 15, 23
canonical: https://www.docswell.com/s/shinnosuke/5RXJ3W-2023-11-15-205338
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/Y79N615R73.jpg)

Azure Durable Functions
に入門してみる☺


# Page. 2

![Page Image](https://bcdn.docswell.com/page/G78KZ4YGJD.jpg)

#自己紹介
name: いけだしんのすけ
like:
-
バイク
読書
映画
アニメ
ゲーム
myboom:
- アーマードコア6 楽しい
- 泣けるアニメを一気見したい
work:
- インフラ ・ SRE 🐣
- 副業でスタートアップ企業の開発手伝わせてもらってたり
- 昔はテレビドラマとか映画のADさんやってた
Azure SAE
- AWS SAA


# Page. 3

![Page Image](https://bcdn.docswell.com/page/L7LZD64XER.jpg)

Durable (耐久性) Functions (関数) って...？


# Page. 4

![Page Image](https://bcdn.docswell.com/page/4EMVP5K3EW.jpg)

Durable Functions 概要
Durable Functions は、サーバーレス コンピューティング環境でステートフル関数を記述できる Azure
Functions の拡張機能です。 この拡張機能では、Azure Functions プログラミング モデルを使用して、オ
ーケストレーター関数を記述することでステートフル ワークフローを定義でき、エンティティ関数を記
述することでステートフル エンティティを定義できます。 拡張機能によって状態、チェックポイント、
再起動がバックグラウンドで管理されるため、ユーザーはビジネス ロジックに専念できます。
https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3%2Cv1-model&amp;pivots=python
つまり
1. Azure Functions の拡張機能
2. 関数チェーンや並列処理などを短いコードで書ける


# Page. 5

![Page Image](https://bcdn.docswell.com/page/PER213XR79.jpg)

関数チェーン
一連の関数が特定の順序で実行。 各関数間でキューを使用する事でシステムの永続的で
スケーラブルな状態を維持。
https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3%2Cv1-model&amp;pivots=python


# Page. 6

![Page Image](https://bcdn.docswell.com/page/P7XDY46YJX.jpg)

並列実行
複数の関数を並列で実行し、すべての関数が完了するまで待機。
https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3%2Cv1-model&amp;pivots=python


# Page. 7

![Page Image](https://bcdn.docswell.com/page/37KX3Z14JD.jpg)

非同期 HTTP API
HTTPエンドポイントを通じて長い処理を開始。
処理が始まると、クライアントは特定のエンド
ポイントを定期的にポーリングして、その操作
が終了したかどうかをチェック。
https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3%2Cv1-model&amp;pivots=python


# Page. 8

![Page Image](https://bcdn.docswell.com/page/LJ35GDQD75.jpg)

状態監視用のエンドポイント
が払い出されるので、アクセ
スして状態を監視できる。


# Page. 9

![Page Image](https://bcdn.docswell.com/page/8JDD1P92JG.jpg)

Durable Functionsの主な構成
Durable Functions
HTTPやタイマーなどで、
オーケストレーションを起動する。
個々の実行する関数。
アクティビティ関数を取りまとめ役。
個々の関数の入力と出力を制御する。
アクティビティ関数1
クライアント関数
オーケストレーター関数
アクティビティ関数2


# Page. 10

![Page Image](https://bcdn.docswell.com/page/VEPXQNZLJ8.jpg)

やってみる
Durable Functions
関数チェーンパターン
HTTPトリガー
オーケストレーター
アクティビティ1
アクティビティ2
アクティビティ3


# Page. 11

![Page Image](https://bcdn.docswell.com/page/27VL5KW6EQ.jpg)

VS Code 拡張で簡単に環境構築できる
■ 環境構築 前提条件
1.
2.
3.
4.
5.
VS Code
拡張機能 Azure Tools
Azure サブスクリプション
Azure ストレージアカウント
ローカルで実行するにはAzure
Functions Core Toolsが必要
詳細はドキュメントを確認
(以下のリンクはpythonの場合)
https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/quickstart-python-vscode?tabs=linux%2Cvs-code-set-indexingflag&amp;pivots=python-mode-decorators


# Page. 12

![Page Image](https://bcdn.docswell.com/page/5JGX6QD27L.jpg)

コードサンプル (Python - プログラミングモデルV2)
Python
import azure.functions as func
import azure.durable_functions as df
クライアント関数
オーケストレーター関数
myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@myApp.route(route=&quot;orchestrators/{functionName}&quot;)
@myApp.durable_client_input(client_name=&quot;client&quot;)
async def http_start(req: func.HttpRequest, client):
function_name = req.route_params.get(&#039;functionName&#039;)
instance_id = await client.start_new(function_name)
response = client.create_check_status_response(req, instance_id)
return response
@myApp.orchestration_trigger(context_name=&quot;context&quot;)
def hello_orchestrator(context):
result1 = yield context.call_activity(&quot;hello&quot;, &quot;Seattle&quot;)
result2 = yield context.call_activity(&quot;hello&quot;, &quot;Tokyo&quot;)
result3 = yield context.call_activity(&quot;hello&quot;, &quot;London&quot;)
アクティビティ関数
return [result1, result2, result3]
@myApp.activity_trigger(input_name=&quot;city&quot;)
def hello(city: str):
return &quot;Hello &quot; + city


# Page. 13

![Page Image](https://bcdn.docswell.com/page/47Q84K19EP.jpg)

プログラミングモデルの違い (Pythonの場合)
V1の場合は役割がフォルダ毎で分かれていく
イメージ
webhook
__init__.py
__fuction
.json.
orchestator
__init__.py
__fuction
.json.
V2の場合はデコレーターの記述でコントロールできる。
@myApp.route(route=&quot;orchestrators/{functionName}&quot;)
@myApp.durable_client_input(client_name=&quot;client&quot;)
async def http_start(req: func.HttpRequest, client):
function_name = req.route_params.get(&#039;functionName&#039;)
instance_id = await client.start_new(function_name)
response = client.create_check_status_response(req, instance_id)
return response
@myApp.orchestration_trigger(context_name=&quot;context&quot;)
def hello_orchestrator(context):
result1 = yield context.call_activity(&quot;hello&quot;, &quot;Seattle&quot;)
result2 = yield context.call_activity(&quot;hello&quot;, &quot;Tokyo&quot;)
result3 = yield context.call_activity(&quot;hello&quot;, &quot;London&quot;)
return [result1, result2, result3]
activity
__init__.py
__fuction
.json.
@myApp.activity_trigger(input_name=&quot;city&quot;)
def hello(city: str):
return &quot;Hello &quot; + city


# Page. 14

![Page Image](https://bcdn.docswell.com/page/KE42QP6R71.jpg)

触れて分かったDurable Functionsの動き
オーケストレーション関数
終わったら起
こして
1つめのアクティビティ関数を呼び出す。
非同期処理が実行されるとスリープ状態になる。
@myApp.orchestration_trigger(context_name=&quot;context&quot;)
def hello_orchestrator(context):
result1 = yield context.call_activity(&quot;hello&quot;, &quot;Seattle&quot;)
!
終わったよー
履歴を確認
するでー
1つ目のアクティビティ関数が完了すると、再起動。
最初から処理を実行。その際にアクティビティ関数の処理履歴を
確認して、1つ目の処理が完了していたら2つ目のアクティビティ
関数を実行する。
result2 = yield context.call_activity(&quot;hello&quot;, &quot;Tokyo&quot;)
result3 = yield context.call_activity(&quot;hello&quot;, &quot;London&quot;)
1つめ完了してるから
スキップして2つめか
ら実行するでー
return [result1, result2, result3]
https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-orchestrations?tabs=csharp-inproc


# Page. 15

![Page Image](https://bcdn.docswell.com/page/L71MP9VVJG.jpg)

今回、最終的に作ってみたもの
愚痴をつぶやくと、その愚痴から連想されるアイド
ル画像と音声を生成してくれるLINEボット🙄
アクティビティ関数 1
Azure Cognitive Serviceで文章から感情分析
ネガティブが検出できたら
アクティビティ関数 2
OpenAI DALL E3
画像生成できたら
アクティビティ関数 3
OpenAI Text to speech


# Page. 16

![Page Image](https://bcdn.docswell.com/page/G7W32QL372.jpg)

以前こんなものも (既視感 w )
ネガティブなメッセージだったら、
真逆の答えを返す映画好きなアイドルボット
関数A
お勧めの泣けるアニメ
映画教えろ。全く嫌な
気分だぜ。
映画のレビューDB
メッセージから類似度の
高い情報をクエリ
Vector Search
関数B
あなたへのお勧めは
プレデターよ☺
メッセージから乖離度の
高い情報をクエリ
https://qiita.com/orc_jj/items/eb0dc19d87121f795eff


# Page. 17

![Page Image](https://bcdn.docswell.com/page/4JZVDWMG73.jpg)

最後に
Durable Functionsで作る前にAWS CDK × Lambda × SQS で同じ事をやっていたので、その際の感想
と比較すると... 「慣れると使いやすい！」という風に感じました😀
以下は、個人的に感じた纏めポイントです。
●
オーケストレーター関数にはタイムアウトの制約がないが、アクティビティ関数は通常のAzure Functions
同様5~10分 (従量課金の場合）の制約がある。
●
DurableFunctionsのリプレイ動作の特徴は最初に抑えておかないと「？」ってなる事もしばしば。
●
Durable Functionsに限った話では無いけど、Visual Studio Code (Visual Studioも) からボタンポチ！
でデプロイできるのでこの辺りはやっぱり凄く便利。


# Page. 18

![Page Image](https://bcdn.docswell.com/page/YE651GNQJV.jpg)

参考
● https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functionsoverview?tabs=in-process%2Cnodejs-v3%2Cv1-model&amp;pivots=python
● https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/quickstart-pythonvscode?tabs=linux%2Cvs-code-set-indexing-flag&amp;pivots=python-mode-decorators
● https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functionsorchestrations?tabs=csharp-inproc
● https://tech-lab.sios.jp/archives/14249


# Page. 19

![Page Image](https://bcdn.docswell.com/page/GE5Y4V52E4.jpg)

このアイコン好きです
ご清聴有難うございました。


