公開日:2024年8月15日最終更新日:
クラウド環境ではサーバーレスの選択肢が増えており、より柔軟な構成が採れるようになっています。特にコード実行サービスは、サーバーリソースの利用効率が高く、さらにコストを抑えることが可能になりました。
今回ご紹介するAzureのDurable Functionsは、複数の処理を同期/非同期に連結できるサーバーレスのコード実行サービスです。類似サービスであるAzure Functionsとの違いや、Durable Functionsの特徴や利用シーンを解説していきます。
目次 <Contents>
Durable Functionsとは
Durable Functionsは、複数の処理を同調させて1つのワークフローを構成できるコード実行サービスです。サーバーレス環境上に関数と呼ばれるプログラムコードをデプロイし、それらを直列や並列につなげることでひとつの大きなタスクを任せることができます。
Durable Functionsでは全体の流れを定義する関数の中で、個々の関数の処理順序を同期させたり、タイマーなどで非同期に実行したりでき、柔軟なワークフローを実現できます。
なお、多様なプログラミング言語に対応しており、サーバーサイドでなじみのある言語などで処理を実装可能です。
- JavaScript/TypeScript
- C#
- Python
- Java
- Powershell
Durable Functionsの特徴
Durable Functionsには次の3つの特徴があります。
複雑なワークフローの実現
Durable Functionsでは、複数の関数が絡み合った複雑なワークフローを実行できます。例えば、実務で生じるようなワークフローは、単純な関数をつなぎ合わせるだけでは難しく、実行タイミングを図る必要があります。
ワークフローの構成は、全体を統制するオーケストレーター関数と、同期/非同期的などのイベントによって連携できる個々のアクティビティ関数に分かれています。アクティビティ関数には起動条件となるトリガーを設定することができ、タイマーでの時間設定や外部イベントとの連携、HTTP APIでのリクエストなどで起動させることが可能です。
また、Durable Functionsではワークフロー全体を管理できるように、状態を保存できる仕組みを備えています。データベースのような実データを保存する形式ではなく、状態の積み重ねでデータを表現する仕組みのため、データの履歴がわかるようになっています。
高いコストパフォーマンス
Durable Functionsはサーバーレスで関数の処理中のみ料金が発生する仕組みのため、常時稼働しているよりも運用コストが抑えられます。仮想サーバーでは最も負担のかかる処理やピーク時間帯の要求に耐えうるサーバーリソースを用意しなければなりませんが、Durable Functionsでは不要です。
また、関数の実行時には必要に応じてサーバーリソースの確保と開放が自動的に行われる仕組みです。最低限の稼働時間で済むため、規模の大小や拡張を気にしなくてよくなります。
負荷のあるロジックを分離できる
Durable Functionsはバックエンドの負担の多い処理をサーバーレスで任せることが可能です。負担が重い処理では、平常時よりも余計なサーバーリソースを確保しなければなりませんが、バックエンドを切り離すことでその必要性が薄くなります。
1台のサーバーですべての処理を担当する必要がなくなり、Webアプリケーションの中でサーバーリソースの負担が少ないフロントエンド部分と切り離すと効率的な運用が可能です。
他にも、負荷の多いバッチ処理やワークフローのような待ち状態が発生する処理に適しています。
Durable FunctionsとAzure Functionsの違い
Durable Functionsは、同じコード実行サービスであるAzure Functionsから拡張された仕組みです。そのため、Azure FunctionsでできることはDurable Functionsでも実現可能です。
ただし、Durable Functionsにしかできないこともあります。特にAzure Functionsだけでは実現が難しい、個々のタスクをつなげた複雑なワークフローに適しています。
得意なタスク | Durable Functions | Azure Functions |
---|---|---|
得意なタスク | 複雑なフロー | 単純なタスク |
状態管理 | ○ステートフル | ×ステートレス |
料金体系 | 従量または月額課金 | 従量または月額課金 |
Durable Functionsの利用パターン
Durable Functionsでは、オーケストレータ―関数を中心に個々のタスクをつなぎ合わせることで、様々なワークフローを実現できます。例えば、ワークフローの一部として次のようなパターンが挙げられます。
関数を順番につなげるパターン
関数を順番に並べて、出力と入力を同期的に数珠つなぎにすると、一連の処理の流れを作ることができます。直前の関数からの出力がない限りは次に進まないため、APIなど外部サービスと同期を取る場合に利用できます。
関数の分岐を合流させるパターン
複数の関数を一度にスタートさせて、すべての出力が揃った時点で次の処理に移るパターンです。すべての関数の出力を待つため、結果を集約をしたり、並列実行して処理時間を短縮したりするのに利用できます。
Durable Functionsのチュートリアル
Durable Functionsのサンプルプロジェクトの作成手順を紹介します。作成には下記のツールやアカウントが必要になります。
- Visual Studio Code
- Azureアカウント(サブスクリプション)
- Azure Storageアカウント
なお、ご紹介するサンプルプロジェクトは従量課金の料金が発生しますので、チュートリアル確認後には削除ください。
プロジェクトの作成
まずは、ローカル環境でDurable Functionsプロジェクトの作成に向けて必要なものをインストールしましょう。
拡張機能のインストール
Visual Studio Codeで、次の3つの拡張機能をインストールします。
- Azure Functions
- C#
- Azurite
プロジェクトの新規作成
続けて、コマンドバレットから「azure functions create
」と入力し、「Azure Functions:Create New Project…
」を選択しましょう。フォルダー選択画面が開くので、プロジェクトを作成するフォルダを指定します。
その後コマンドバレットで指示が出るので、下記の順番に入力していきましょう。
- Select a language: C#
- Select a .NET runtime: .NET 8.0 Isolated LTS
- Select a template for your project’s first function: Durable Functions Orchestration
- Choose a durable storage type.: Azure Storage
- Provide a function name: HelloOrchestration
- Provide a namespace: Company.Function
- Select how you would like to open your project: Open in current window
ローカル環境でのテスト
入力が完了するとプロジェクトが作成されているので、フォルダ直下にあるlocal.settings.json
を変更します。
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
}
}
コマンドパレットを開き、「azureite
」を入力し、「Azureite: Start
」を選びましょう。
続いて、F5キーを押してデバッグを開始します。出力コンソールにURLが表示されたらブラウザで開きましょう。
下記のようなJSONデータが表示されれば成功です。
sendEventpostUri
のURLを開くとJSONが出力され、関数の出力結果が取得できていることを確認できます。
{
"name": "HelloOrchestration",
"instanceId": "xxxxxxxxxxxxxxxxxxxxxxxx",
"runtimeStatus": "Completed",
"input": null,
"customStatus": null,
"output": [
"Hello Tokyo!",
"Hello Seattle!",
"Hello London!"
],
"createdTime": "2024-07-30T01:56:32Z",
"lastUpdatedTime": "2024-07-30T01:56:38Z"
}
Durable Functionsの作成とデプロイ
Visual Studio CodeからAzureアカウントにログインします。コマンドパレットに「azure functions
」と入力し、「Azure Functions: Create new Function App in Azure
」を選択しましょう。
- Enter a globally unique name for the new function app.: アプリの名前
- Select a runtime stack.: .NET 8 Isolated
- Select a location for new resources.: Japan East
コマンドパレットに「azure functions
」と入力し、「Azure Functions: Deploy to Azure
」を選択するとデプロイが開始されるのでしばらく待ちましょう。Azureへのデプロイが完了すると、出力タブにURLが表示されるのでアクセスしてみましょう。
ローカル環境でテストしたときと同じようなJSONデータが表示されれば成功です。
まとめ
Durable Functionsは、複雑なワークフローを柔軟に実装できるサーバーレスのコード実行サービスです。多彩なトリガーを起点に動く関数をつなぎ合わせることで、1つのワークフローを実現できます。また、Azure Functionsを拡張した仕組みでもあり、元の特徴を引き継ぎつつ、より複雑でステートフルな処理を実現するのに適しています。
特に、時間のかかるバックエンド処理やバッチ処理をDurable Functionsに移行することで、より低コストで運用が可能です。Webアプリケーションの最適化やコストの見直しの際に、導入を検討してみてください。