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
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 に関連する主な概念を示すために使用されます。
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 構成値は、アプリケーション スコープの変更と見なされます。 複数リビジョン モードでコンテナー アプリを実行すると、これらの設定を変更しても新しいリビジョンは作成されません。 代わりに、既存のすべてのリビジョンが再起動されて、最新の値で確実に構成されます。
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 コンポーネントに対応し、不要なフィールド (apiVersion
、kind
など) と冗長なメタデータや仕様のプロパティが削除されるように、上記のスキーマが少し簡略化されています。
componentType: [COMPONENT-TYPE]
version: v1
initTimeout: [TIMEOUT-DURATION]
ignoreErrors: [BOOLEAN]
metadata:
- name: [METADATA-NAME]
value: [METADATA-VALUE]
コンポーネントのスコープ
既定では、同じ環境内のすべての Dapr 対応コンテナー アプリは、デプロイされたコンポーネントの完全なセットを読み込みます。 コンポーネントが実行時に適切なコンテナー アプリによってのみ読み込まれるようにするには、アプリケーション スコープを使用する必要があります。 次の例では、コンポーネントは、Dapr アプリケーション ID が APP-ID-1
と APP-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 コンポーネントの外部サービスへの接続を安全に確立するために、コンテナー アプリでいくつかの方法がサポートされています。
- マネージド ID の使用
- Dapr シークレット ストア コンポーネント参照の使用
- プラットフォーム マネージド Kubernetes シークレットの使用
マネージド ID の使用
Azure でホストされるサービスの場合、Dapr でスコープ付きコンテナー アプリのマネージド ID を使用して、バックエンド サービス プロバイダーに対して認証を行うことができます。 マネージド ID を使用している場合、コンポーネント マニフェストにシークレット情報を含める必要はありません。 コンポーネント内に秘匿性の高い入力を格納することがなくなり、シークレット ストアを管理する必要がないため、マネージド ID を使用することをお勧めします。
Note
azureClientId
メタデータ フィールド (マネージド ID のクライアント ID) は、ユーザー割り当てマネージド ID を使って認証を行うすべてのコンポーネントで必要です。
Dapr シークレット ストア コンポーネント参照の使用
AD 対応でないサービス用に Dapr コンポーネントを作成する場合、特定のメタデータ フィールドに秘匿性の高い入力値が必要です。 これらのシークレットを取得するのに推奨される方法は、シークレット情報に安全にアクセスする既存の Dapr シークレット ストア コンポーネントを参照することです。
参照を設定する手順はこちらです。
- Container Apps スキーマを使用して Dapr シークレット ストア コンポーネントを作成します。 サポートされているすべての Dapr シークレット ストアのコンポーネントの種類は、
secretstores.
で始まります。 - この 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 によって解決するいくつかの課題を確認しました。
- Azure Container Apps ポータルを使って、Azure Dapr コンポーネントを作成する
- Azure Resource Manager または Azure CLI を使用して Dapr アプリケーションを Azure Container Apps にデプロイしてみる。
- GitHub Actions を使用して、複数リビジョンの Dapr 対応コンテナー アプリの変更を自動化するチュートリアルを確認する。
- Dapr バインディングを使ってイベント ドリブンの作業を実行する方法を理解する。
- Dapr 要求のトークン認証を有効にする。
- KEDA スケーラーを使って Dapr アプリケーションをスケーリングする
- Dapr と Azure Container Apps の統合に関する一般的な質問に答える