Azure Functions 用の Dapr 拡張機能

Azure Functions 用 Dapr 拡張機能の一連のツールとサービスを使うことで、開発者は Azure Functions と Distributed Application Runtime (Dapr) プラットフォームを簡単に統合できます。

Azure Functions は、他の Azure サービスと簡単に接続するための一連のトリガーとバインドを提供するイベントドリブンのコンピューティング サービスです。 Dapr には、マイクロサービス、状態管理、パブリッシュ/サブスクライブ メッセージングなど、分散アプリケーションを構築するための一連の構成要素とベスト プラクティスが用意されています。

Dapr と Functions を統合すると、Dapr または外部システムからのイベントに反応する関数を構築できます。

アクション Direction Type
Dapr 入力バインドでトリガーする 該当なし daprBindingTrigger
Dapr サービス呼び出しでトリガーする 該当なし daprServiceInvocationTrigger
Dapr トピック サブスクリプションでトリガーする 該当なし daprTopicTrigger
実行に対する Dapr の状態をプルする 含まれる daprState
実行のために Dapr シークレットをプルする 含まれる daprSecret
値を Dapr の状態に保存する Out daprState
別の Dapr アプリを呼び出す Out daprInvoke
Dapr トピックにメッセージを発行する Out daprPublish
Dapr 出力バインドに値を送信する Out daprBinding

拡張機能のインストール

インストールする拡張機能 NuGet パッケージは、関数アプリで使用している C# モード (インプロセスまたは分離ワーカー プロセス) によって異なります。

この拡張機能は、NuGet パッケージバージョン 1.0.0 をインストールすることで使用できます。

.NET CLI の使用

dotnet add package Microsoft.Azure.WebJobs.Extensions.Dapr

バンドルのインストール

この拡張機能を追加するには、host.json ファイル内に次のコードを追加するまたは置き換えます。

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

Dapr の有効化

Dapr は、ランタイム コンテキストに基づいてさまざまな[引数と注釈](dapr-args)を使用して構成できます。 2 つのチャネルを使って、Azure Functions 用に Dapr を構成できます。

  • Bicep や Azure Resource Manager (ARM) のテンプレートのような、コードとしてのインフラストラクチャ (IaC) テンプレート
  • Azure portal

IaC テンプレートを使用する場合は、コンテナー アプリ リソース定義の properties セクションで、次の引数を指定します。

DaprConfig: {
  enabled: true
  appId: '${envResourceNamePrefix}-funcapp'
  appPort: 3001
  httpReadBufferSize: ''
  httpMaxRequestSize: ''
  logLevel: ''
  enableApiLogging: true
}

上記の Dapr 構成値は、アプリケーション スコープの変更と見なされます。 複数リビジョン モードでコンテナー アプリを実行すると、これらの設定を変更しても新しいリビジョンは作成されません。 代わりに、既存のすべてのリビジョンが再起動されて、最新の値で確実に構成されます。

Azure portal を使って Dapr を構成するときは、関数アプリに移動し、左側のメニューから [Dapr] を選びます。

Azure portal 内で Function App の Dapr 有効化がどこにあるかを示すスクリーンショット。

Dapr のポートとリスナー

Dapr から関数をトリガーすると、拡張機能はポート 3001 を自動的に公開して、Dapr サイドカーから着信する要求をリッスンします。

重要

ポート 3001 は、Dapr トリガーが関数アプリで定義されている場合にのみ、公開およびリッスンされます。 Dapr を使うと、サイドカーは、定義されたポートから応答を受信するのを待ってから、インスタンス化を完了します。 トリガーがない場合は、dapr.io/port 注釈または --app-port を定義 "しないでください"。 それを行うと、Dapr サイドカーからアプリケーションがロックされる可能性があります。

入力と出力のバインドのみを使っている場合は、ポート 3001 を公開または定義する必要はありません。

既定では、Azure Functions は Dapr と通信しようとするとき、環境変数 DAPR_HTTP_PORT から解決されたポートを介して Dapr を呼び出します。 その変数が null の場合、ポートは既定で 3500 になります。

バインド (または属性) の function.jsonDaprAddress プロパティを設定することで、入力と出力のバインドで使われる Dapr アドレスをオーバーライドできます。 既定では、http://localhost:{DAPR_HTTP_PORT} が使われます。

関数アプリには、まだ他にも HTTP トリガーなどのために公開されるポートとエンドポイントがあります。その既定値は、ローカル環境では 7071 ですが、コンテナーでは 80 です。

バインドの種類

.NET でサポートされるバインドの種類は、拡張機能のバージョンと C# 実行モードの両方によって異なります。これは次のいずれかになります。

インプロセス クラス ライブラリは、Functions ランタイムと同じプロセスで実行されるコンパイル済みの C# 関数です。

Dapr 拡張機能では、次の表のようにパラメーターの型がサポートされています。

バインド パラメーターの種類
Dapr トリガー daprBindingTrigger
daprServiceInvocationTrigger
daprTopicTrigger
Dapr 入力 daprState
daprSecret
Dapr 出力 daprState
daprInvoke
daprPublish
daprBinding

これらの型の使用例については、拡張機能の GitHub リポジトリに関するページを参照してください。

Azure Functions 用の Dapr 拡張機能を試す

提供されているサンプルで Azure Functions 用 Dapr 拡張機能を使用する方法について説明します。

サンプル 説明
クイックスタート Dapr パブリッシュ/サブスクライブ バインドと HttpTrigger の使用を開始します。
Dapr Kafka Kafka バインド Dapr コンポーネントで Azure Functions Dapr 拡張機能の使い方を学習します。
.NET インプロセス Azure Functions のインプロセス モデルを使って、サービス呼び出し、パブリッシュ/サブスクライブ、バインド、状態管理など、.NET で複数の Dapr コンポーネントと統合する方法を学習します。
.NET 分離 Azure Functions のアウト プロセス (OOP) 実行モデルを使って、.NET で Dapr コンポーネントと統合します。

Azure Functions 用の Dapr 拡張機能を試す

提供されているサンプルで Azure Functions 用 Dapr 拡張機能を使用する方法について説明します。

サンプル 説明
Java 関数 Java を使って Azure Functions Dapr 拡張機能の使い方を学習します。

Azure Functions 用の Dapr 拡張機能を試す

提供されているサンプルで Azure Functions 用 Dapr 拡張機能を使用する方法について説明します。

サンプル 説明
クイックスタート Dapr パブリッシュ/サブスクライブ バインドと HttpTrigger の使用を開始します。
Dapr Kafka Kafka バインド Dapr コンポーネントで Azure Functions Dapr 拡張機能の使い方を学習します。
JavaScript JavaScript Dapr 関数アプリケーションを実行し、Azure Functions を使って、Dapr のサービス呼び出し、パブリッシュ/サブスクライブ、バインド、状態管理と統合します。

Azure Functions 用の Dapr 拡張機能を試す

提供されているサンプルで Azure Functions 用 Dapr 拡張機能を使用する方法について説明します。

サンプル 説明
PowerShell 関数 PowerShell を使って Azure Functions Dapr 拡張機能の使い方を学習します。

Azure Functions 用の Dapr 拡張機能を試す

提供されているサンプルで Azure Functions 用 Dapr 拡張機能を使用する方法について説明します。

サンプル 説明
Dapr Kafka Kafka バインド Dapr コンポーネントで Azure Functions Dapr 拡張機能の使い方を学習します。
Python v1 Dapr 対応の Python アプリケーションを実行し、Azure Functions Python v1 プログラミング モデルを使って、Dapr コンポーネントと統合します。
Python v2 Azure Functions Python v2 プログラミング モデルを使って Dapr アプリケーションを起動し、Dapr コンポーネントと統合します。

トラブルシューティング

このセクションでは、Azure Functions 用の Dapr 拡張機能を使用する際に発生する可能性がある問題のトラブルシューティング方法について説明します。

Dapr が環境内で有効なことを確認する

Azure Functions 内で Dapr のバインドとトリガーを使用しており、かつその環境内で Dapr が有効ではない場合、次のエラー メッセージが表示されることがあります。"Dapr sidecar isn't present. Please see (https://aka.ms/azure-functions-dapr-sidecar-missing) for more information."。環境内で Dapr を有効にするには、次を実行します。

  • Azure Function が Azure Container Apps 内にデプロイされている場合は、「Azure Functions 用の Dapr 拡張機能」の「Dapr の有効化」手順を参照してください。

  • Azure Function が Kubernetes 内にデプロイされている場合は、そのデプロイの YAML 構成に次の注釈があることを確認します。

    annotations:
      ...
      dapr.io/enabled: "true"
      dapr.io/app-id: "functionapp"
      # You should only set app-port if you are using a Dapr trigger in your code.
      dapr.io/app-port: "<DAPR_APP_PORT>"
      ...
    
  • Azure Function をローカルで実行している場合は、次のコマンドを実行して、Dapr を使用して関数アプリを実行していることを確認します。

    dapr run --app-id functionapp --app-port <DAPR_APP_PORT>  --components-path <COMPONENTS_PATH> -- func host start 
    

Dapr 構成内でアプリポートの値を確認する

Azure Functions 用の Dapr 拡張機能は、既定では 3001 ポート上で HTTP サーバーを起動します。 このポートは DAPR_APP_PORT 環境変数を使用して構成できます。

Azure Functions アプリの実行時に正しくないアプリ ポート値を指定すると、次のエラー メッセージが表示されることがあります。"The Dapr sidecar is configured to listen on port {portInt}, but the app server is running on port {appPort}. This may cause unexpected behavior. For more information, visit [this link](https://aka.ms/azfunc-dapr-app-config-error)."。このエラー メッセージを解決するには、次を実行します。

  1. コンテナー アプリの Dapr 設定内で、次を実行します。

    • コード内で Dapr トリガーを使用している場合は、そのアプリ ポートが 3001、または環境変数 DAPR_APP_PORT の値に設定されていることを確認します。

    • コード内で Dapr トリガーを使用していない場合は、アプリ ポートが設定されていないことを確認します。 中には何も入っていないはずです。

  2. Dapr 構成内で正しいアプリ ポート値を指定したことを確認します。

    • Azure Container Apps を使用している場合は、Bicep 内でアプリ ポートを指定します。

      DaprConfig: {
         ...
         appPort: <DAPR_APP_PORT>
         ...
      }
      
    • Kubernetes 環境を使用している場合は、注釈 dapr.io/app-port を設定します。

      annotations:
         ...
         dapr.io/app-port: "<DAPR_APP_PORT>"
         ...
      
    • ローカルで開発している場合は、Dapr を使用して関数アプリを実行する際に、--app-port を設定していることを確認します。

      dapr run --app-id functionapp --app-port <DAPR_APP_PORT> --components-path <COMPONENTS_PATH> -- func host start 
      

次のステップ

Dapr の詳細を理解する。