657 Views
November 15, 23
スライド概要
name: - いけだしんのすけ work: - インフラ・情シス like: - バイク - 読書 - 映画 - アニメ - ゲーム
Azure Durable Functions に入門してみる☺
#自己紹介 name: いけだしんのすけ like: - バイク 読書 映画 アニメ ゲーム myboom: - アーマードコア6 楽しい - 泣けるアニメを一気見したい work: - インフラ ・ SRE 🐣 - 副業でスタートアップ企業の開発手伝わせてもらってたり - 昔はテレビドラマとか映画のADさんやってた Azure SAE - AWS SAA
Durable (耐久性) Functions (関数) って...?
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&pivots=python つまり 1. Azure Functions の拡張機能 2. 関数チェーンや並列処理などを短いコードで書ける
関数チェーン 一連の関数が特定の順序で実行。 各関数間でキューを使用する事でシステムの永続的で スケーラブルな状態を維持。 https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3%2Cv1-model&pivots=python
並列実行 複数の関数を並列で実行し、すべての関数が完了するまで待機。 https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3%2Cv1-model&pivots=python
非同期 HTTP API HTTPエンドポイントを通じて長い処理を開始。 処理が始まると、クライアントは特定のエンド ポイントを定期的にポーリングして、その操作 が終了したかどうかをチェック。 https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3%2Cv1-model&pivots=python
状態監視用のエンドポイント が払い出されるので、アクセ スして状態を監視できる。
Durable Functionsの主な構成 Durable Functions HTTPやタイマーなどで、 オーケストレーションを起動する。 個々の実行する関数。 アクティビティ関数を取りまとめ役。 個々の関数の入力と出力を制御する。 アクティビティ関数1 クライアント関数 オーケストレーター関数 アクティビティ関数2
やってみる Durable Functions 関数チェーンパターン HTTPトリガー オーケストレーター アクティビティ1 アクティビティ2 アクティビティ3
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&pivots=python-mode-decorators
コードサンプル (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="orchestrators/{functionName}")
@myApp.durable_client_input(client_name="client")
async def http_start(req: func.HttpRequest, client):
function_name = req.route_params.get('functionName')
instance_id = await client.start_new(function_name)
response = client.create_check_status_response(req, instance_id)
return response
@myApp.orchestration_trigger(context_name="context")
def hello_orchestrator(context):
result1 = yield context.call_activity("hello", "Seattle")
result2 = yield context.call_activity("hello", "Tokyo")
result3 = yield context.call_activity("hello", "London")
アクティビティ関数
return [result1, result2, result3]
@myApp.activity_trigger(input_name="city")
def hello(city: str):
return "Hello " + city
プログラミングモデルの違い (Pythonの場合)
V1の場合は役割がフォルダ毎で分かれていく
イメージ
webhook
__init__.py
__fuction
.json.
orchestator
__init__.py
__fuction
.json.
V2の場合はデコレーターの記述でコントロールできる。
@myApp.route(route="orchestrators/{functionName}")
@myApp.durable_client_input(client_name="client")
async def http_start(req: func.HttpRequest, client):
function_name = req.route_params.get('functionName')
instance_id = await client.start_new(function_name)
response = client.create_check_status_response(req, instance_id)
return response
@myApp.orchestration_trigger(context_name="context")
def hello_orchestrator(context):
result1 = yield context.call_activity("hello", "Seattle")
result2 = yield context.call_activity("hello", "Tokyo")
result3 = yield context.call_activity("hello", "London")
return [result1, result2, result3]
activity
__init__.py
__fuction
.json.
@myApp.activity_trigger(input_name="city")
def hello(city: str):
return "Hello " + city
触れて分かったDurable Functionsの動き オーケストレーション関数 終わったら起 こして 1つめのアクティビティ関数を呼び出す。 非同期処理が実行されるとスリープ状態になる。 @myApp.orchestration_trigger(context_name="context") def hello_orchestrator(context): result1 = yield context.call_activity("hello", "Seattle") ! 終わったよー 履歴を確認 するでー 1つ目のアクティビティ関数が完了すると、再起動。 最初から処理を実行。その際にアクティビティ関数の処理履歴を 確認して、1つ目の処理が完了していたら2つ目のアクティビティ 関数を実行する。 result2 = yield context.call_activity("hello", "Tokyo") result3 = yield context.call_activity("hello", "London") 1つめ完了してるから スキップして2つめか ら実行するでー return [result1, result2, result3] https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-orchestrations?tabs=csharp-inproc
今回、最終的に作ってみたもの 愚痴をつぶやくと、その愚痴から連想されるアイド ル画像と音声を生成してくれるLINEボット🙄 アクティビティ関数 1 Azure Cognitive Serviceで文章から感情分析 ネガティブが検出できたら アクティビティ関数 2 OpenAI DALL E3 画像生成できたら アクティビティ関数 3 OpenAI Text to speech
以前こんなものも (既視感 w ) ネガティブなメッセージだったら、 真逆の答えを返す映画好きなアイドルボット 関数A お勧めの泣けるアニメ 映画教えろ。全く嫌な 気分だぜ。 映画のレビューDB メッセージから類似度の 高い情報をクエリ Vector Search 関数B あなたへのお勧めは プレデターよ☺ メッセージから乖離度の 高い情報をクエリ https://qiita.com/orc_jj/items/eb0dc19d87121f795eff
最後に Durable Functionsで作る前にAWS CDK × Lambda × SQS で同じ事をやっていたので、その際の感想 と比較すると... 「慣れると使いやすい!」という風に感じました😀 以下は、個人的に感じた纏めポイントです。 ● オーケストレーター関数にはタイムアウトの制約がないが、アクティビティ関数は通常のAzure Functions 同様5~10分 (従量課金の場合)の制約がある。 ● DurableFunctionsのリプレイ動作の特徴は最初に抑えておかないと「?」ってなる事もしばしば。 ● Durable Functionsに限った話では無いけど、Visual Studio Code (Visual Studioも) からボタンポチ! でデプロイできるのでこの辺りはやっぱり凄く便利。
参考 ● https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functionsoverview?tabs=in-process%2Cnodejs-v3%2Cv1-model&pivots=python ● https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/quickstart-pythonvscode?tabs=linux%2Cvs-code-set-indexing-flag&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
このアイコン好きです ご清聴有難うございました。