Azure Container Apps の Dapr コンポーネント

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

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

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

このガイドでは、Azure Container Apps サービス向けに Dapr コンポーネントを構成する方法について説明します。

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

Dapr オープンソース プロジェクトでは、すべてのコンポーネントは次の基本的なスキーマに準拠しています。

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]

Azure 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 対応コンテナー アプリによってのみ読み込まれます。

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

Note

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

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

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

  1. マネージド ID の使用
  2. Dapr シークレット ストア コンポーネント参照を使うには、次のいずれかを作成します。

マネージド ID の使用

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

Note

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

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

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

参照を設定するには:

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

Dapr シークレット ストア コンポーネントの作成

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

Azure Key Vault シークレット ストア

次のコンポーネントは、Azure Key Vault シークレット ストアを使った最も単純なシークレット ストア構成を示しています。 このパブリッシャーおよびサブスクライバーのサンプル アプリケーションは、両方とも 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
プラットフォームマネージド Kubernetes シークレット

Kubernetes シークレット、ローカル環境変数、ローカル ファイルの Dapr シークレット ストアは、Azure Container Apps ではサポートされていません。 アップストリームの Dapr の既定の Kubernetes シークレット ストアの代わりに、Azure Container Apps には、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 コンポーネントからそのシークレット ストアを参照できるようになります。 次の例は、Entra ID 認証の使用を示しています。

componentType: pubsub.azure.servicebus.queue
version: v1
secretStoreComponent: "[your_secret_store_name]"
metadata:
  - name: namespaceName
    # Required when using Azure Authentication.
    # Must be a fully-qualified domain name
    value: "[your_servicebus_namespace.servicebus.windows.net]"
  - name: azureTenantId
    value: "[your_tenant_id]"
  - name: azureClientId 
    value: "[your_client_id]"
  - name: azureClientSecret
    secretRef: azClientSecret
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: namespaceName
    # Required when using Azure Authentication.
    # Must be a fully-qualified domain name
    value: "[your_servicebus_namespace.servicebus.windows.net]"
  - name: azureTenantId
    value: "[your_tenant_id]"
  - name: azureClientId 
    value: "[your_client_id]"
  - name: azureClientSecret
    secretRef: azClientSecret
scopes:
  - publisher-app
  - subscriber-app

次のステップ

Dapr コンポーネントの回復性を設定する方法を確認します。