Durable Functions ストレージ プロバイダー
Durable Functions は、内部で Durable Task Framework (DTFx) によって支援される一連の Azure Functions トリガーおよびバインディングです。 DTFx では、Durable Functions によって使用される Azure Storage プロバイダーなど、さまざまなバックエンド ストレージ プロバイダーがサポートされています。 Durable Functions v2.5.0 より、ユーザーはその関数アプリを、Azure Storage プロバイダー以外の DTFx ストレージ プロバイダーを使用するように構成できます。
Note
多くの関数アプリでは、Durable Functions 用の既定の Azure Storage プロバイダーで十分である可能性が高く、追加の構成は必要ないため、最も簡単に使用できます。 しかし、コスト、スケーラビリティ、データ管理のトレードオフがあり、代替ストレージ プロバイダーの使用が有利になる可能性があります。
Durable Functions と Durable Task Frameworkでの使用のために、2 つの代替ストレージ プロバイダー、すなわち ( Netherite ストレージ プロバイダーと Microsoft SQL Server 〔MSSQL〕 ストレージ プロバイダー) が開発されました。 この記事では、サポートされる 3 つすべてのプロバイダーについて説明し、それらを比較します。また、それらの使用を開始する方法について基本的な情報を提供します。
注意
現在、データをあるストレージ プロバイダーから別のストレージ プロバイダーに移行することはできません。 新しいストレージ プロバイダーを使用する場合は、その新しいストレージ プロバイダーで構成された新しいアプリを作成する必要があります。
Azure Storage
Azure Storage は、Durable Functions の既定のストレージ プロバイダーです。 これにより、キュー、テーブル、BLOB が使用され、オーケストレーションとエンティティの状態が保持されます。 また、パーティション管理のために BLOB と BLOB のリースが使用されます。 多くの場合、Durable Functions のランタイム状態の保存に使用されるストレージ アカウントは、Azure Functions (AzureWebJobsStorage
) で使用される既定のストレージ アカウントと同じです。 ただし、別のストレージ アカウントを使用して Durable Functions を構成することもできます。 Azure Storage プロバイダーは、Durable Functions 拡張機能に組み込まれており、他の依存関係はありません。
Azure Storage プロバイダーの主な利点を次に示します。
- セットアップが不要 - 関数アプリのセットアップ エクスペリエンスによって作成されたストレージ アカウントを使用できます。
- 最もコストの低いサーバーレス課金モデル - Azure Storage には、使用量に完全に基づいた使用量ベースの価格モデルがあります (詳細情報)。
- 最適なツールのサポート - Azure Storage では、クロスプラットフォーム ローカル エミュレーションが提供され、Visual Studio、Visual Studio Code、Azure Functions Core Tools と統合されます。
- 最高の成熟度 - Azure Storage は、Durable Functions 用のオリジナルのストレージ バックエンドであり、最も厳しいテストを通過しています。
- ストレージ プロバイダーに接続する際にシークレットではなく ID を使用するためのサポート。
Azure Storage ストレージ プロバイダーの DTFx コンポーネントのソース コードは、Azure/durabletask GitHub リポジトリで確認できます。
Note
Azure Storage プロバイダーを使用する場合、標準の汎用 Azure Storage アカウントが必要です。 他のストレージ アカウント タイプはどれもサポートされていません。 従来の v1 汎用ストレージ アカウントを使用することを強くお勧めします。これは、新しい v2 ストレージ アカウントでは、Durable Functions のワークロードに対して料金が大幅に高額になる可能性があるためです。 Azure Storage アカウントの種類について詳しくは、「ストレージ アカウントの概要」ドキュメントを参照してください。
Netherite
Netherite ストレージ バックエンドは、Microsoft Research によって設計および開発されました。 これは、Azure ページ BLOB 上で Azure Event Hubs と FASTER データベース テクノロジを使用します。 Netherite の設計により、他のプロバイダーと比較して、オーケストレーションとエンティティのスループット処理を大幅に向上できます。 一部のベンチマーク シナリオでは、既定の Azure Storage プロバイダーと比較して、桁違いのスループットが記録されました。
Netherite ストレージ プロバイダーの主な利点を次に示します。
- 他のストレージ プロバイダーと比較して、スループットは大幅に高く、コストは低いです。
- 価格 - パフォーマンスの最適化がサポートされ、必要に応じてパフォーマンスをスケールアップできます。
- Event Hubs Basic と Standard SKU を使用した最大 32 のデータ パーティションがサポートされます。
- 高スループットのワークロードに対して、他のプロバイダーよりもコスト効率に優れています。
Netherite ストレージ プロバイダーの使用を開始する方法など、技術的な詳細については、Netherite のドキュメントを参照してください。 Netherite ストレージ プロバイダーのソース コードは、microsoft/durabletask-netherite GitHub リポジトリで確認できます。 Netherite ストレージ プロバイダーの詳細な評価については、研究論文「Serverless Workflows with Durable Functions and Netherite」を参照してください。
Note
Netherite という名前は、Minecraft の世界が元になっています。
Microsoft SQL Server (MSSQL)
Microsoft SQL Server (MSSQL) ストレージ プロバイダーは、すべての状態を Microsoft SQL Server データベースに保存します。 これは、SQL Server のオンプレミスとクラウドホステッドの両方のデプロイで、 Azure SQL Database を含むと互換性があります。
MSSQL ストレージ プロバイダーの主な利点を次に示します。
- 切断された環境をサポート - SQL Server インストールを使用する場合、Azure 接続は必要ありません。
- Azure ホステッド、オンプレミスなど、複数の環境およびクラウド間で移植可能です。
- 厳密なデータの整合性により、データ損失なしでバックアップ/復元およびフェイルオーバーを実行できます。
- カスタム データ暗号化 (SQL Server の機能) がネイティブ サポートされます。
- 組み込みストアド プロシージャを介して、既存のデータベース アプリケーションと統合されます。
MSSQL ストレージ プロバイダーの使用を開始する方法など、技術的な詳細については、Microsoft SQL プロバイダーのドキュメントを参照してください。 MSSQL ストレージ プロバイダーのソース コードは、microsoft/durabletask-mssql GitHub リポジトリで確認できます。
代替ストレージ プロバイダーの構成
代替ストレージ プロバイダーの構成は、通常、2 段階のプロセスです。
- 適切な NuGet パッケージを関数アプリに追加します (この要件は、拡張機能バンドルを使用するアプリでは一時的な要件です)。
- host.json ファイルを更新して、使用するストレージ プロバイダーを指定します。
host.json でストレージ プロバイダーが明示的に構成されていない場合、既定では Azure Storage プロバイダーが有効になります。
Azure Storage プロバイダーの構成
Azure Storageプロバイダーは既定のストレージ プロバイダーであるため、明示的な構成、NuGet パッケージ参照、または拡張機能バンドル参照は不要です。 こちらの extensions/durableTask/storageProvider
パスで、host.json 構成オプションの全セットを確認できます。
接続
host.json の connectionName
プロパティは、アプリを Azure Storage に接続する方法を指定する環境構成への参照です。 次が指定されている場合があります。
- 接続文字列を含むアプリケーション設定の名前。 接続文字列を取得するには、「ストレージ アカウント アクセス キーを管理する」の手順に従います。
- まとめて ID ベースの接続を定義する、複数のアプリケーション設定の共有プレフィックスの名前。
構成された値が、1 つの設定に完全一致し、プレフィックスがその他の設定とも一致する場合は、完全一致が使用されます。 host.json に値が指定されていない場合、既定値は "AzureWebJobsStorage" です。
ID ベースの接続
バージョン 2.7.0 以降の拡張機能と Azure Storage プロバイダーを使っている場合は、シークレットを含む接続文字列を使う代わりに、アプリで Microsoft Entra の ID を使用できます。 これを行うには、トリガーおよびバインド構成の connectionName
プロパティにマップされる共通のプレフィックスに設定を定義します。
Durable Functions で ID ベースの接続を使用するには、次のアプリ設定を構成します。
プロパティ | 環境変数テンプレート | 説明 | 値の例 |
---|---|---|---|
Blob service の URI | <CONNECTION_NAME_PREFIX>__blobServiceUri |
HTTPS スキームを使用する、ストレージ アカウントの BLOB サービスのデータ プレーン URI。 | https://<storage_account_name>.blob.core.windows.net |
Queue サービス の URI | <CONNECTION_NAME_PREFIX>__queueServiceUri |
HTTPS スキームを使用する、ストレージ アカウントのキュー サービスのデータ プレーン URI。 | https://<storage_account_name>.queue.core.windows.net |
テーブル サービスの URI | <CONNECTION_NAME_PREFIX>__tableServiceUri |
HTTPS スキームを使用する、ストレージ アカウントのテーブル サービスのデータ プレーン URI。 | https://<storage_account_name>.table.core.windows.net |
接続をカスタマイズするには、プロパティを追加設定します。 「ID ベース接続に共通のプロパティ」を参照してください。
Azure Functions サービスでホストされている場合、ID ベースの接続では、マネージド ID が使用されます。 ユーザー割り当て ID を credential
および clientID
プロパティで指定できますが、システム割り当て ID が既定で使用されます。 リソース ID を使用したユーザー割り当て ID の構成はサポートされていないことに注意してください。 ローカル開発などの他のコンテキストで実行する場合は、代わりに開発者 ID が使用されますが、カスタマイズすることもできます。 ID ベースの接続によるローカル開発に関するページをご覧ください。
ID にアクセス許可を付与する
使用されている ID が何であれ、目的のアクションを実行するためのアクセス許可が必要です。 ほとんどの Azure では、これはそれらのアクセス許可を提供する組み込みロールまたはカスタム ロールを使って、Azure RBAC でロールを割り当てる必要があることを意味します。
重要
すべてのコンテキストに必要ではない一部のアクセス許可がターゲット サービスによって公開される場合があります。 可能であれば、最小限の特権の原則に従い、必要な特権だけを ID に付与します。 たとえば、アプリがデータ ソースからの読み取りのみを行う必要がある場合は、読み取りアクセス許可のみを持つロールを使用します。 サービスへの書き込みも可能なロールを割り当てることは、読み取り操作に対するアクセス許可が過剰になるため、不適切です。 同様に、ロールの割り当てが、読み取る必要のあるリソースだけに限定されていることを確認する必要があります。
実行時に Azure ストレージへのアクセスを提供するロールの割り当てを作成する必要があります。 所有者のような管理ロールでは十分ではありません。 通常の操作で Durable Functions 拡張機能を使用する場合、次の組み込みロールが推奨されます。
アプリケーションでは、記述したコードに基づいて追加のアクセス許可が必要になる場合があります。 既定の動作を使用している場合、または明示的に "AzureWebJobsStorage" に connectionName
を設定 している場合は、その他のアクセス許可に関する考慮事項については、 ID を使用したホスト ストレージへの接続 に関するページを参照してください。
Netherite ストレージ プロバイダーの構成
Netherite ストレージ プロバイダーを有効にする際には、host.json
での構成変更が必要になります。 C# ユーザーの場合は、追加のインストール手順も必要になります。
host.json
構成
次の host.json の例は、Netherite ストレージ プロバイダーを有効にするために必要な最小構成を示しています。
{
"version": "2.0",
"extensions": {
"durableTask": {
"storageProvider": {
"type": "Netherite",
"storageConnectionName": "AzureWebJobsStorage",
"eventHubsConnectionName": "EventHubsConnection"
}
}
}
}
詳細なセットアップ手順については、Netherite の使用開始に関するドキュメントを参照してください。
Netherite 拡張機能をインストールする (.NET のみ)
Note
アプリで拡張機能バンドルを使用している場合は、拡張機能バンドルによって手動の拡張機能の管理が不要になるため、このセクションは無視してください。
Netherite 拡張機能の最新バージョンを NuGet にインストールする必要があります。 これは通常は、それに対する参照を .csproj
ファイルに含めて、プロジェクトをビルドすることを意味します。
インストールする拡張機能パッケージは、使用している .NET ワーカーによって異なります。
- "インプロセス" .NET ワーカーの場合は、
Microsoft.Azure.DurableTask.Netherite.AzureFunctions
をインストールします。 - "分離された" .NET ワーカーの場合は、
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.Netherite
をインストールします。
MSSQL ストレージ プロバイダーの構成
MSSQL ストレージ プロバイダーを有効にする際には、host.json
での構成変更が必要になります。 C# ユーザーの場合は、追加のインストール手順も必要になります。
host.json
構成
次の例は、MSSQL ストレージ プロバイダーを有効にするために必要な最小構成を示しています。
{
"version": "2.0",
"extensions": {
"durableTask": {
"storageProvider": {
"type": "mssql",
"connectionStringName": "SQLDB_Connection"
}
}
}
}
詳細なセットアップ手順については、MSSQL プロバイダーの使用開始に関するドキュメントを参照してください。
Durable Task MSSQL 拡張機能をインストールする (.NET のみ)
Note
アプリで拡張機能バンドルを使用している場合は、拡張機能バンドルによって手動の拡張機能の管理が不要になるため、このセクションは無視してください。
最新バージョンの MSSQL ストレージ プロバイダー拡張機能を NuGet にインストールする必要があります。 これは通常は、それに対する参照を .csproj
ファイルに含めて、プロジェクトをビルドすることを意味します。
インストールする拡張機能パッケージは、使用している .NET ワーカーによって異なります。
- "インプロセス" .NET ワーカーの場合は、
Microsoft.DurableTask.SqlServer.AzureFunctions
をインストールします。 - "分離された" .NET ワーカーの場合は、
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.SqlServer
をインストールします。
ストレージ プロバイダーの比較
サポートされている各種のストレージ プロバイダー間には、重要なトレードオフが多数あります。 次の表を使用すると、これらのトレードオフを理解でき、ニーズに最も合うストレージ プロバイダーを判別できます。
ストレージ プロバイダー | Azure Storage | Netherite | MSSQL |
---|---|---|---|
公式サポートの状況 | ✅ 一般提供 (GA) | ✅ 一般提供 (GA) | ✅ 一般提供 (GA) |
外部依存関係 | Azure Storage アカウント (汎用 v1) | Azure Event Hubs Azure Storage アカウント (汎用) |
SQL Server 2019 または Azure SQL Database |
ローカル開発とエミュレーションのオプション | Azurite v3.12+ (クロス プラットフォーム) | タスク ハブのメモリ内エミュレーションをサポートします (詳細情報) | SQL Server Developer エディション (Windows、Linux、Docker のコンテナーをサポート) |
タスク ハブの構成 | 明示 | 明示 | 既定で暗黙 (詳細情報) |
最大スループット | 中 | 非常に高 | 中 |
最大オーケストレーション/エンティティ スケールアウト (ノード数) | 16 | 32 | 該当なし |
最大アクティビティ スケールアウト (ノード数) | 該当なし | 32 | 該当なし |
Durable Entities のサポート | ✅ 完全サポート | ✅ 完全サポート | ⚠️ .NET Isolated を使用する場合を除き、サポート対象 |
KEDA 2.0 スケーリングのサポート (詳細情報) |
❌ サポート対象外 | ❌ サポート対象外 | ✅MSSQL スケーラーを使用する場合にサポート対象 (詳細情報) |
拡張機能バンドルのサポート (非 .NET アプリで推奨) | ✅ 完全サポート | ✅ 完全サポート | ✅ 完全サポート |
価格 - パフォーマンスを構成できるか? | ❌ いいえ | ✅ はい (Event Hubs TU と CU) | ✅ はい (SQL vCPU) |
切断された環境のサポート | ❌ Azure 接続が必要 | ❌ Azure 接続が必要 | ✅ 完全サポート |
ID ベースの接続 | ✅ 完全サポート | ❌ サポート対象外 | ⚠️ ランタイム駆動型スケーリングが必要 |
Flex 従量課金プラン | ✅ 完全にサポートされています (メモを参照) | ❌ サポート対象外 | ❌ サポート対象外 |