Teams アプリをコンテナー サービスにデプロイする

Teams ボットまたはタブ アプリは、Azure Container Apps、Azure Kubernetes Service (AKS)、またはオンプレミスの Kubernetes クラスターにデプロイできます。

前提条件

サンプルの Teams ボットまたはサンプルの Teams タブ アプリをダウンロードします。このアプリでは、Azure Container Apps 開発にすぐに使用できるエクスペリエンスが提供されます。 いくつかの構成を変更し、AKS またはオンプレミスの Kubernetes クラスターにデプロイできます。

作業を開始する前に、次のツールがあることを確認してください。

  • Azure アカウント。

  • Azure Container Apps または AKS デプロイ用の Azure コマンド ライン インターフェイス (CLI)。

注:

この記事のコマンドは Git Bash に基づいています。 他のインターフェイスを使用している場合は、必要に応じてコマンドを更新します。

Azure Container Apps へのデプロイ

Azure Container Apps は、コンテナー化されたアプリケーションをクラウドで実行できるフル マネージド サービスです。 すべてのネイティブ Kubernetes API とクラスター管理に直接アクセスする必要がなく、ベスト プラクティスに基づくフル マネージド エクスペリエンスを好む場合に最適です。

サンプル アプリケーションの助けを借りて、Teams Toolkit でプロビジョニングコマンドとデプロイ コマンドを実行できます。 Teams Toolkit では、Azure Container Registry と Azure Container Apps が自動的に作成され、アプリがコンテナー イメージに構築され、Azure Container Apps にデプロイされます。

provision コマンドは、次のリソースを作成して構成します。

  • タブまたはボット機能を備えた Teams アプリ。
  • コンテナー イメージをホストする Azure Container Registry。
  • アプリをホストする Azure Container App 環境と Azure Container Apps。
  • 認証用の Microsoft Entra アプリ。

サンプルの Teams ボットでは、 provision コマンドによって、Teams クライアントと Azure Container Apps をチャネルするための Azure Bot Service も作成されます。

deploy コマンドは、次のアクションを実行します。

  • コンテナー イメージにアプリをビルドします。
  • コンテナー イメージを Azure Container Registry にプッシュします。
  • Azure Container Apps にイメージをデプロイします。

Teams ボットを Azure Kubernetes Service にデプロイする

AKS は、Azure によって提供されるマネージド コンテナー オーケストレーション サービスです。 AKS を使用すると、Azure 内で Kubernetes エクスペリエンスを完全に管理できます。

アーキテクチャ

Azure Kubernetes Service アーキテクチャへの Teams ボットを示すスクリーンショット。

Teams バックエンド サーバーは、Azure Bot Service を介してボットと対話します。 このサービスでは、パブリック HTTPS エンドポイントを介してボットに到達できる必要があります。 セットアップするには、Kubernetes クラスターにイングレス コントローラーをデプロイし、TLS 証明書でセキュリティで保護します。

Microsoft Entra ID を使用して、Azure Bot Service でボットを認証できます。 アプリ ID とパスワードを含む Kubernetes シークレットを作成し、そのシークレットをコンテナーのランタイム構成に統合します。

AKS での HTTPS によるイングレスのセットアップ

  1. コンテナー イメージをホストする Azure Container Registry に AKS が接続されていることを確認します。 詳細については、「 Azure CLI の使用」を参照してください。

  2. 次のコマンドを実行して、イングレス コントローラーと証明書マネージャーをインストールします。

    NAMESPACE=teams-bot
    
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    helm install ingress-nginx ingress-nginx/ingress-nginx --create-namespace --namespace $NAMESPACE \
        --set controller.nodeSelector."kubernetes\.io/os"=linux  \
        --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux  \
        --set controller.healthStatus=true \
        --set controller.service.externalTrafficPolicy=Local \
        --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz 
    
    helm repo add jetstack https://charts.jetstack.io
    helm repo update
    helm install cert-manager jetstack/cert-manager --namespace $NAMESPACE --set installCRDs=true --set nodeSelector."kubernetes\.io/os"=linux
    

    注:

    アン マネージド イングレス コントローラーの作成 に関するページの手順に従い、 証明書を暗号化して Tls を使用 して Kubernetes クラスターにイングレス証明書と TLS 証明書を設定することもできます。

  3. 次のコマンドを実行して、イングレス パブリック IP の DNS を更新し、イングレス エンドポイントを取得します。

    > kubectl get services --namespace $NAMESPACE -w ingress-nginx-controller
    
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
    ingress-nginx-controller LoadBalancer $CLUSTER_IP $EXTERNAL_IP 80:32514/TCP,443:32226/TCP
    
    > PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$EXTERNAL_IP')].[id]" --output tsv)
    > az network public-ip update --ids $PUBLICIPID --dns-name $DNSLABEL
    > az network public-ip show --ids $PUBLICIPID --query "[dnsSettings.fqdn]" --output tsv
    
    $DNSLABEL.$REGION.cloudapp.azure.com
    

Teams Toolkit を使用してリソースをプロビジョニングする

Teams Toolkit の provision コマンドを使用して、ボット機能を備えた Teams アプリを作成し、Azure Bot Service を組み込み、認証用の Microsoft Entra ID を追加できます。

Teams Toolkit でリソースをプロビジョニングするには、次の手順に従います。

  1. 前にダウンロードしたサンプル アプリを開きます。

  2. env/.env.${envName} ファイルに移動し、の値を FQDN で更新します。

  3. teamsapp.yml ファイルに移動し、次のarm/deployアクションを更新して、provision コマンドの実行中に Teams Toolkit によって Azure Bot Service がプロビジョニングされるようにします。

    - uses: arm/deploy 
      with:
        subscriptionId: ${{AZURE_SUBSCRIPTION_ID}} 
        resourceGroupName: ${{AZURE_RESOURCE_GROUP_NAME}} 
        templates:
          - path: ./infra/botRegistration/azurebot.bicep
            parameters: ./infra/botRegistration/azurebot.parameters.json
            deploymentName: Create-resources-for-bot
        bicepCliVersion: v0.9.1
    
  4. Teams Toolkit で provision コマンドを実行します。

  5. プロビジョニング後、env/.env.${envName} ファイル内のBOT_IDと、env/.env.${envName}.user ファイル内の暗号化されたSECRET_BOT_PASSWORDを見つけます。 BOT_PASSWORDの実際の値を取得します。 [秘密の暗号化解除] 注釈を選択します。

  6. BOT_IDBOT_PASSWORDを含む Kubernetes シークレットを作成するには、キー値ペアを ./deploy/.env.dev-secrets ファイルに保存し、次のコマンドを実行してシークレットをプロビジョニングします。

    kubectl create secret generic dev-secrets --from-env-file ./deploy/.env.dev-secrets -n $NAMESPACE
    

デプロイを適用する

サンプルには、参照用のデプロイ ファイル deploy/sso-bot.yamlが含まれています。

  1. 次のプレースホルダーを更新します。

    1. <image>: イメージを更新します。 たとえば、「 myacr.azurecr.io/sso-bot:latest 」のように入力します。

    2. <hostname>: イングレス FQDN を更新します。

  2. deploy/tab.yamlを適用するには、次のコマンドを実行します。

    kubectl apply -f deploy/sso-bot.yaml -n $NAMESPACE
    
  3. Visual Studio Code に移動します。

  4. [ 実行とデバッグ ] パネルで、[ リモートの起動 ] 構成を選択します。

  5. AKS にデプロイされた Teams ボット アプリケーションをプレビューするには、[ デバッグの開始 (F5)] を選択します。

オンプレミスの Kubernetes クラスターに Teams ボットをデプロイする

AKS に Teams ボットをデプロイするために使用する同様の手順に従って、さまざまなクラウド サービスから個人用 Kubernetes クラスターまたは Kubernetes サービスに Teams ボットをデプロイできます。

アーキテクチャ

オンプレミスの kubernetes クラスター アーキテクチャを示すスクリーンショット。

Teams バックエンド サーバーは、Azure Bot Service を介してボットと対話します。 このサービスでは、パブリック HTTPS エンドポイントを介してボットに到達できる必要があります。 セットアップするには、Kubernetes クラスターにイングレス コントローラーをデプロイし、TLS 証明書でセキュリティで保護します。

Microsoft Entra ID を使用して、Azure Bot Service でボットを認証できます。 アプリ ID とパスワードを含む Kubernetes シークレットを作成し、そのシークレットをコンテナーのランタイム構成に統合します。

Teams Toolkit を使用してリソースをプロビジョニングする

Teams Toolkit の provision コマンドを使用して、ボット機能を備えた Teams アプリを作成し、Azure Bot Service を組み込み、認証用の Microsoft Entra ID を追加できます。

Teams Toolkit でリソースをプロビジョニングするには、次の手順に従います。

  1. 前にダウンロードしたサンプル アプリを開きます。

  2. env/.env.${envName} ファイルに移動し、の値を FQDN で更新します。

  3. teamsapp.yml ファイルに移動し、次のarm/deployアクションを更新して、provision コマンドの実行中に Teams Toolkit によって Azure Bot Service がプロビジョニングされるようにします。

    - uses: arm/deploy 
      with:
        subscriptionId: ${{AZURE_SUBSCRIPTION_ID}} 
        resourceGroupName: ${{AZURE_RESOURCE_GROUP_NAME}} 
        templates:
          - path: ./infra/botRegistration/azurebot.bicep
            parameters: ./infra/botRegistration/azurebot.parameters.json
            deploymentName: Create-resources-for-bot
        bicepCliVersion: v0.9.1
    
  4. teamsapp.yml ファイルで、プロビジョニング ステージ中に botFramework/create アクションを更新します。 このアクションにより、Teams Toolkit は適切なメッセージング エンドポイントを使用してボットの登録を作成できます。

    注:

    チャネル化には Azure Bot Service を使用することをお勧めします。 Azure アカウントを持っていなくても、Azure Bot Service を作成できない場合は、ボットの登録を作成できます。

    - uses: botFramework/create
        with:
        botId: ${{BOT_ID}}
        name: <Bot display name>
        messagingEndpoint: https://${{BOT_DOMAIN}}/api/messages
        description: ""
        channels:
            - name: msteams
    

    Azure リソースは必要ないので、teamsapp.yml ファイル内のarm/deployアクションを削除できます。

  5. Teams Toolkit で provision コマンドを実行します。

  6. プロビジョニング後、env/.env.${envName} ファイル内のBOT_IDと、env/.env.${envName}.user ファイル内の暗号化されたSECRET_BOT_PASSWORDを見つけます。 BOT_PASSWORDの実際の値を取得します。 [秘密の暗号化解除] 注釈を選択します。

  7. BOT_IDBOT_PASSWORDを含む Kubernetes シークレットを作成するには、キー値ペアを ./deploy/.env.dev-secrets ファイルに保存し、次のコマンドを実行してシークレットをプロビジョニングします。

    kubectl create secret generic dev-secrets --from-env-file ./deploy/.env.dev-secrets -n $NAMESPACE
    

デプロイを適用する

このサンプルには、ガイダンス用のデプロイ ファイル deploy/sso-bot.yamlが含まれています。

  1. 次のプレースホルダーを更新します。

    1. <image>: イメージを更新します。 たとえば、「 myacr.azurecr.io/sso-bot:latest 」のように入力します。

    2. <hostname>: イングレス FQDN を更新します。

  2. deploy/tab.yamlを適用するには、次のコマンドを実行します。

    kubectl apply -f deploy/sso-bot.yaml -n $NAMESPACE
    
  3. Visual Studio Code に移動します。

  4. [ 実行とデバッグ ] パネルで、[ リモートの起動 ] 構成を選択します。

  5. AKS にデプロイされた Teams ボット アプリケーションをプレビューするには、[ デバッグの開始 (F5)] を選択します。

Teams タブ アプリを Kubernetes に展開する

AKS は、Azure によって提供されるマネージド コンテナー オーケストレーション サービスとして機能します。 AKS を使用すると、Azure 内で Kubernetes エクスペリエンスを完全に管理できます。

AKS への Teams タブ アプリのデプロイは、AKS への Web アプリのデプロイに似ています。 ただし、Teams タブ アプリには HTTPS 接続が必要であるため、AKS でドメインを所有し、TLS イングレスを設定する必要があります。

また、Teams タブ アプリを個人用の Kubernetes クラスターまたは異なるクラウド プラットフォーム上の Kubernetes サービスにデプロイすることもできます。 これには、Azure Kubernetes Service にデプロイするときに使用される手順と同様の手順が含まれます。

AKS での HTTPS によるイングレスのセットアップ

  1. AKS が、コンテナー イメージをホストする Azure Container Registry に既に接続されていることを確認します。 詳細については、「 Azure CLI」を参照してください。

  2. 次のコマンドを実行して、イングレス コントローラーと証明書マネージャーをインストールします。

    NAMESPACE=teams-tab
    
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    helm install ingress-nginx ingress-nginx/ingress-nginx --create-namespace --namespace $NAMESPACE \
        --set controller.nodeSelector."kubernetes\.io/os"=linux  \
        --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux  \
        --set controller.healthStatus=true \
        --set controller.service.externalTrafficPolicy=Local \
        --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz 
    
    helm repo add jetstack https://charts.jetstack.io
    helm repo update
    helm install cert-manager jetstack/cert-manager --namespace $NAMESPACE --set installCRDs=true --set nodeSelector."kubernetes\.io/os"=linux
    

    注:

    アン マネージド イングレス コントローラーの作成 に関するページの手順に従い、 証明書を暗号化して Tls を使用 して Kubernetes クラスターにイングレス証明書と TLS 証明書を設定することもできます。

  3. 次のコマンドを実行して、イングレス パブリック IP の DNS を更新し、イングレス エンドポイントを取得します。

    > kubectl get services --namespace $NAMESPACE -w ingress-nginx-controller
    
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
    ingress-nginx-controller LoadBalancer $CLUSTER_IP $EXTERNAL_IP 80:32514/TCP,443:32226/TCP
    
    > PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$EXTERNAL_IP')].[id]" --output tsv)
    > az network public-ip update --ids $PUBLICIPID --dns-name $DNSLABEL
    > az network public-ip show --ids $PUBLICIPID --query "[dnsSettings.fqdn]" --output tsv
    
    $DNSLABEL.$REGION.cloudapp.azure.com
    

Teams Toolkit を使用してリソースをプロビジョニングする

Teams Toolkit の provision コマンドを使用して、タブ機能を備えた Teams アプリを作成し、Azure Bot Service を組み込み、認証用の Microsoft Entra ID を追加できます。

Teams Toolkit でリソースをプロビジョニングするには、次の手順に従います。

  1. 前にダウンロードしたサンプル アプリを開きます。

  2. env/.env.${envName} ファイルに移動し、の値を FQDN で更新します。

  3. teamsapp.yml ファイルに移動し、追加の Azure リソースは必要がないため、arm/deployアクションを削除します。

  4. Teams Toolkit で provision コマンドを実行します。

  5. Teams Toolkit を使用して Microsoft Entra ID を作成します。この ID は、アプリの環境変数として設定することもできます。

  6. プロビジョニング後、env/.env.${envName} ファイル内のAAD_APP_CLIENT_IDと、env/.env.${envName}.user ファイル内の暗号化されたSECRET_AAD_APP_CLIENT_SECRETを見つけます。

  7. SECRET_AAD_APP_CLIENT_SECRETの実際の値を取得します。 [秘密の暗号化解除] 注釈を選択します。

デプロイを適用する

サンプルには、参照用のデプロイ ファイル deploy/tab.yamlが含まれています。

  1. 次のプレースホルダーを更新します。

    1. <tab-image>: イメージを更新します。 たとえば、「 myacr.azurecr.io/tab:latest 」のように入力します。

    2. <api-image>: API イメージを更新します。 API がない場合は、 hello-world-apiサービスを削除し、yaml ファイルからデプロイします。

    3. <hostname>: イングレス FQDN を更新します。

  2. deploy/tab.yamlを適用するには、次のコマンドを実行します。

    kubectl apply -f deploy/tab.yaml -n $NAMESPACE
    
  3. Visual Studio Code に移動します。

  4. [ 実行とデバッグ ] パネルで、[ リモートの起動 ] 構成を選択します。

  5. AKS にデプロイされた Teams ボット アプリケーションをプレビューするには、[ デバッグの開始 (F5)] を選択します。