Azure Container Apps との Dapr 統合

Distributed Application Runtime (Dapr) は、マイクロサービス ベースの分散型アプリケーションの作成を簡略化する、段階的に導入可能な機能のセットです。 たとえば、Dapr では、pub/sub を介したメッセージングまたは信頼性の高いセキュリティで保護されたサービス間呼び出しを介して、アプリケーションの相互通信を有効にする機能を提供します。 コンテナー アプリで Dapr が有効になると、アプリケーション コードと共にセカンダリ プロセスが作成され、HTTP または gRPC 経由で Dapr との通信が可能になります。

Dapr の API は、次のことを実現するよう、業界のベスト プラクティス標準に基づいて構築されています。

  • お好みの言語またはフレームワークにシームレスに適合
  • 段階的に採用可能、アプリケーションのニーズに合わせて、Dapr の 1 つ、複数、またはすべての機能を使用できる

Dapr は、オープンソースの Cloud Native Computing Foundation (CNCF) プロジェクトです。 CNCF は Linux Foundation の一部であり、急速に成長しているクラウド ネイティブ プロジェクトのためのサポート、監視、方向性を提供します。 Dapr OSS プロジェクトを各自でデプロイして管理する代わりに、Container Apps プラットフォームが次のことを担います。

  • マネージドかつサポート対象の Dapr 統合を提供する
  • Dapr のバージョンのアップグレードをシームレスに処理する
  • 簡略化された Dapr 相互作用モデルを公開し、開発者の生産性を高める

このガイドでは、Dapr の主な概念と、Container Apps の Dapr 相互作用モデルに関する詳細について説明します。

Dapr API

Diagram that shows Dapr APIs.

Dapr API 説明
サービス間の呼び出し 自動 mTLS 認証と暗号化を使用して、サービスを検出し、信頼性の高いサービス間呼び出しを実行します。 Azure Container Apps での Dapr サービス呼び出しに関する既知の制限事項を参照してください。
状態管理 トランザクションと CRUD 操作の状態管理機能を提供します。
pub/sub パブリッシャーとサブスクライバーのコンテナー アプリが中間メッセージ ブローカーを介して相互通信できるようにします。
バインド イベントに基づいてアプリケーションをトリガーする
アクター Dapr のアクターは、迅速にスケーリングするように設計された、メッセージ駆動型のシングル スレッドの作業単位です。 たとえば、ワークロードにバーストが多い状況などです。
可観測性 Application Insights バックエンドにトレース情報を送信します。
シークレット アプリケーション コードからシークレットにアクセスするか、Dapr コンポーネントのセキュリティで保護された値を参照します。
Configuration サポートされている構成ストアのアプリケーション構成項目を取得してサブスクライブします。

Note

上の表は安定した Dapr API についての説明です。 アルファ API と機能の使用について詳しくは、Dapr に関する FAQ をご覧ください

Dapr の概念の概要

pub/sub API に基づく次の例は、Azure Container Apps の Dapr に関連する主な概念を示すために使用されます。

Diagram demonstrating Dapr pub/sub and how it works in Container Apps.

Label Dapr 設定 説明
1 Dapr が有効になっている Container Apps Dapr は、Dapr の一連の引数を構成することで、コンテナー アプリ レベルで有効になります。 これらの値は、複数のリビジョン モードで実行されている場合に、特定のコンテナー アプリのすべてのリビジョンに適用されます。
2 Dapr Dapr のフル マネージド API は、Dapr サイドカーを介して各コンテナー アプリに公開されます。 Dapr API は、HTTP または gRPC を介してコンテナー アプリから呼び出すことができます。 Dapr サイドカーは、HTTP ポート 3500 と gRPC ポート 50001 で実行されます。
3 Dapr コンポーネントの構成 Dapr では、機能がコンポーネントとして提供されるモジュール設計を使用します。 Dapr コンポーネントは、複数のコンテナー アプリ間で共有できます。 スコープ配列で提供される Dapr アプリ識別子によって、実行時に特定のコンポーネントを読み込む Dapr 対応コンテナー アプリが決まります。

Dapr の有効化

Dapr は、ランタイム コンテキストに基づいてさまざまな引数と注釈を使用して構成できます。 Azure Container Apps には、Dapr を構成できる 3 つのチャネルが用意されています。

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

以下の表は、Container Apps で現在サポートされている Dapr サイドカー構成の一覧を示しています。

Container Apps CLI [テンプレート] フィールド 説明
--enable-dapr dapr.enabled コンテナー アプリで Dapr を有効にします。
--dapr-app-port dapr.appPort アプリケーションと通信するために Dapr によって使われる、アプリケーションがリッスンしているポート
--dapr-app-protocol dapr.appProtocol アプリケーションで使用しているプロトコルを Dapr に伝えます。 有効なオプションは http または grpc です。 既定値は http です。
--dapr-app-id dapr.appId サービス検出、状態のカプセル化、および pub/sub コンシューマー ID に使用される、コンテナー アプリに対する一意の Dapr 識別子。
--dapr-max-request-size dapr.httpMaxRequestSize 大きなファイルのアップロードを処理する要求本文の http サーバーと grpc サーバーの最大サイズを設定します。 既定値は 4 MB です。
--dapr-read-buffer-size dapr.httpReadBufferSize マルチ KB ヘッダーの送信時に処理する HTTP ヘッダー読み取りバッファーの最大サイズを設定します。 既定値は 4 KB です。
--dapr-api-logging dapr.enableApiLogging アプリケーションから Dapr サイドカーへの API 呼び出しを表示できるようにします。
--dapr-log-level dapr.logLevel Dapr サイドカーのログ レベルを設定します。 使用できる値は、debug、error、info、warn です。 既定値は info です。

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

 dapr: {
   enabled: true
   appId: 'nodeapp'
   appProtocol: 'http'
   appPort: 3000
 }

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

Dapr コンポーネント

Dapr では、機能がコンポーネントとして提供されるモジュール設計を使用します。 Dapr コンポーネントの使用はオプションであり、アプリケーションのニーズによって排他的に決まります。

コンテナー アプリの Dapr コンポーネントは、次のようなことを行う環境レベルのリソースです。

  • サポート対象の外部サービスに接続するためのプラグ可能な抽象化モデルを提供できる。
  • コンテナー アプリ間で共有することも、特定のコンテナー アプリにスコープを設定することもできる。
  • Dapr シークレットを使用して、構成メタデータを安全に取得できる。

コンポーネントのスキーマ

すべての Dapr OSS コンポーネントは、次の基本スキーマに準拠しています。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: [COMPONENT-NAME]
  namespace: [COMPONENT-NAMESPACE]
spec:
  type: [COMPONENT-TYPE]
  version: v1
  initTimeout: [TIMEOUT-DURATION]
  ignoreErrors: [BOOLEAN]
  metadata:
    - name: [METADATA-NAME]
      value: [METADATA-VALUE]

Container Apps では、Dapr コンポーネントに対応し、不要なフィールド (apiVersionkind など) と冗長なメタデータや仕様のプロパティが削除されるように、上記のスキーマが少し簡略化されています。

componentType: [COMPONENT-TYPE]
version: v1
initTimeout: [TIMEOUT-DURATION]
ignoreErrors: [BOOLEAN]
metadata:
  - name: [METADATA-NAME]
    value: [METADATA-VALUE]

コンポーネントのスコープ

既定では、同じ環境内のすべての Dapr 対応コンテナー アプリは、デプロイされたコンポーネントの完全なセットを読み込みます。 コンポーネントが実行時に適切なコンテナー アプリによってのみ読み込まれるようにするには、アプリケーション スコープを使用する必要があります。 次の例では、コンポーネントは、Dapr アプリケーション ID が APP-ID-1APP-ID-2 の 2 つの Dapr 対応コンテナー アプリによってのみ読み込まれます。

Note

Dapr コンポーネントのスコープは、コンテナー アプリ名ではなく、コンテナー アプリの Dapr アプリケーション ID に対応します。

componentType: [COMPONENT-TYPE]
version: v1
initTimeout: [TIMEOUT-DURATION]
ignoreErrors: [BOOLEAN]
metadata:
  - name: [METADATA-NAME]
    value: [METADATA-VALUE]
scopes:
  - [APP-ID-1]
  - [APP-ID-2]

Dapr を介した外部サービスへの接続

Dapr コンポーネントの外部サービスへの接続を安全に確立するために、コンテナー アプリでいくつかの方法がサポートされています。

  1. マネージド ID の使用
  2. Dapr シークレット ストア コンポーネント参照の使用
  3. プラットフォーム マネージド Kubernetes シークレットの使用

マネージド ID の使用

Azure でホストされるサービスの場合、Dapr でスコープ付きコンテナー アプリのマネージド ID を使用して、バックエンド サービス プロバイダーに対して認証を行うことができます。 マネージド ID を使用している場合、コンポーネント マニフェストにシークレット情報を含める必要はありません。 コンポーネント内に秘匿性の高い入力を格納することがなくなり、シークレット ストアを管理する必要がないため、マネージド ID を使用することをお勧めします。

Note

azureClientId メタデータ フィールド (マネージド ID のクライアント ID) は、ユーザー割り当てマネージド ID を使って認証を行うすべてのコンポーネントで必要です。

Dapr シークレット ストア コンポーネント参照の使用

AD 対応でないサービス用に Dapr コンポーネントを作成する場合、特定のメタデータ フィールドに秘匿性の高い入力値が必要です。 これらのシークレットを取得するのに推奨される方法は、シークレット情報に安全にアクセスする既存の Dapr シークレット ストア コンポーネントを参照することです。

参照を設定する手順はこちらです。

  1. Container Apps スキーマを使用して Dapr シークレット ストア コンポーネントを作成します。 サポートされているすべての Dapr シークレット ストアのコンポーネントの種類は、secretstores. で始まります。
  2. この Dapr シークレット ストア コンポーネントを参照して秘匿性の高いメタデータ入力を取得する追加のコンポーネントを、必要に応じて作成します。

コンテナー アプリでシークレット ストア コンポーネントを作成する場合は、次のいずれかの方法でメタデータ セクションに秘匿性の高い情報を指定できます。

  • Azure Key Vault シークレット ストアの場合は、マネージド ID を使用して接続を確立します。
  • Azure 以外のシークレット ストアの場合は、コンポーネント マニフェストの一部として直接定義されたプラットフォーム マネージド Kubernetes シークレットを使用します。

次のコンポーネントは、考えられる最も単純なシークレット ストアの構成を示しています。 このパブリッシャーおよびサブスクライバーのサンプル アプリケーションは、両方とも Azure Key Vault インスタンスに対する適切なアクセス許可を持つシステムまたはユーザー割り当てマネージド ID を持つように構成されています。

componentType: secretstores.azure.keyvault
version: v1
metadata:
  - name: vaultName
    value: [your_keyvault_name]
  - name: azureEnvironment
    value: "AZUREPUBLICCLOUD"
  - name: azureClientId # Only required for authenticating user-assigned managed identity
    value: [your_managed_identity_client_id]
scopes:
  - publisher-app
  - subscriber-app

Note

Kubernetes シークレット、ローカル環境変数、ローカル ファイルの Dapr シークレット ストアは、Container Apps ではサポートされていません。 アップストリームの Dapr の既定の Kubernetes シークレット ストアの代わりに、コンテナー アプリには、Kubernetes シークレットを作成して活用するためのプラットフォーム マネージド アプローチが用意されています。

プラットフォーム マネージド Kubernetes シークレットの使用

このコンポーネント構成では、秘匿性の高い値をメタデータ セクションから参照できるシークレット パラメーターとして定義します。 この方法は、シークレット ストアやマネージド ID を設定せずに CLI を介してコンポーネントを迅速にデプロイするために、Azure 以外のサービスに接続するため、または Dev/Test シナリオで使用できます。

componentType: secretstores.azure.keyvault
version: v1
metadata:
  - name: vaultName
    value: [your_keyvault_name]
  - name: azureEnvironment
    value: "AZUREPUBLICCLOUD"
  - name: azureTenantId
    value: "[your_tenant_id]"
  - name: azureClientId 
    value: "[your_client_id]"
  - name: azureClientSecret
    secretRef: azClientSecret
secrets:
  - name: azClientSecret
    value: "[your_client_secret]"
scopes:
  - publisher-app
  - subscriber-app

Dapr シークレット ストア コンポーネントの参照

一度上記のいずれかの方法を使用して Dapr シークレット ストアを作成した後は、同じ環境内の他の Dapr コンポーネントからそのシークレット ストアを参照できるようになります。 次の例では、secretStoreComponent フィールドに、上記で指定した sb-root-connectionstring が格納されるシークレット ストアの名前が入力されます。

componentType: pubsub.azure.servicebus.queue
version: v1
secretStoreComponent: "my-secret-store"
metadata:
  - name: connectionString
    secretRef: sb-root-connectionstring
scopes:
  - publisher-app
  - subscriber-app

コンポーネントの例

Container Apps CLI を使用して Dapr コンポーネントを作成するには、コンテナー アプリの YAML マニフェストを使用できます。 複数のコンポーネントを構成する場合は、コンポーネントごとに別個の YAML ファイルを作成して適用する必要があります。

az containerapp env dapr-component set --name ENVIRONMENT_NAME --resource-group RESOURCE_GROUP_NAME --dapr-component-name pubsub --yaml "./pubsub.yaml"
# pubsub.yaml for Azure Service Bus component
componentType: pubsub.azure.servicebus.queue
version: v1
secretStoreComponent: "my-secret-store"
metadata:
  - name: connectionString
    secretRef: sb-root-connectionstring
scopes:
  - publisher-app
  - subscriber-app

制限事項

サポートされていない Dapr 機能

  • Dapr 監視のカスタム構成: Application Insights を使用して環境をインストルメント化し、分散トレースを視覚化します。
  • Dapr 構成仕様: Dapr 構成仕様を使用する必要があるすべての機能。
  • Dapr 対応であるかのように Dapr から Dapr 以外のサービスを呼び出すこと: Azure Container Apps での Dapr のサービス呼び出しは、Dapr 対応サービス間でのみサポートされます。
  • 宣言型の pub/sub サブスクリプション
  • 上記に記載されていない Dapr サイドカーの注釈
  • アルファ API とコンポーネント: Azure Container Apps では、Dapr アルファ API と機能の可用性は保証されません。 詳しくは、Dapr に関する FAQ をご覧ください。

既知の制限事項

  • アクターのリマインダー: リマインダーが常にアクティブになり、正しく起動されるためには、1 以上の minReplicas が必要です。
  • ジョブ: ジョブでは、Dapr はサポートされていません。

次のステップ

Dapr および Dapr によって解決するいくつかの課題を確認しました。