次の方法で共有


Azure Kubernetes Service (AKS) で OpenAI を使うアプリケーションをデプロイする

この記事では、AKS で Azure OpenAI または OpenAI を使うアプリケーションをデプロイする方法について学習します。 OpenAI を使うと、特定のタスクに合わせて、コンテンツ生成、概要、セマンティック検索、自然言語などのさまざまな AI モデルをコード生成に適応させることができます。 まず、Azure サブスクリプションに AKS クラスターをデプロイします。 その後、OpenAI サービスとサンプル アプリケーションをデプロイします。

サンプル クラウド ネイティブ アプリケーションは、実際の実装を代表しています。 マルチコンテナー アプリケーションは、次のような複数の言語とフレームワークで記述されたアプリケーションで構成されています。

  • Golang と Gin
  • Rust と Actix-Web
  • JavaScript と Vue.js および Fastify
  • Python と FastAPI

これらのアプリケーションには、顧客とストア管理者向けのフロント エンド、RabbitMQ メッセージ キューと MongoDB データベースにデータを送信するための REST API、トラフィックをシミュレートするコンソール アプリが用意されています。

注意

MongoDB や Rabbit MQ などのステートフル コンテナーを運用環境の永続ストレージなしで実行することはお勧めしません。 わかりやすくするためにここではこれらを使用しますが、Azure CosmosDB や Azure Service Bus などのマネージド サービスを使うことをお勧めします。

サンプル アプリケーションの GitHub コードベースにアクセスする場合は、「AKS Store Demo」を参照してください。

開始する前に

前提条件

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

リソース グループを作成する

Azure リソース グループは、Azure リソースをデプロイおよび管理する論理グループです。 リソース グループを作成する際は、場所の指定を求めるプロンプトが表示されます。 この場所は、リソース グループのメタデータが格納される場所です。また、リソースの作成時に別のリージョンを指定しない場合は、Azure でリソースが実行される場所でもあります。

次の例では、myResourceGroup という名前のリソース グループを eastus に作成します。

  • az group create コマンドを使用して、リソース グループを作成します。

    az group create --name myResourceGroup --location eastus
    

    リソース グループが正常に作成された場合の出力例を以下に示します。

    {
      "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup",
      "location": "eastus",
      "managedBy": null,
      "name": "myResourceGroup",
      "properties": {
        "provisioningState": "Succeeded"
      },
      "tags": null,
      "type": "Microsoft.Resources/resourceGroups"
    }
    

AKS クラスターを作成する

次の例では、myResourceGroupmyAKSCluster という名前のクラスターを作成します。

  • az aks create コマンドを使用して、AKS クラスターを作成します。

    az aks create --resource-group myResourceGroup --name myAKSCluster --generate-ssh-keys
    

    数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。

クラスターに接続する

Kubernetes クラスターを管理するには、Kubernetes のコマンドライン クライアントである kubectl を使用します。 Azure Cloud Shell を使用している場合、kubectl は既にインストールされています。

  1. az aks install-cli コマンドを使用して kubectl をローカルにインストールします。

    az aks install-cli
    

    Note

    Linux ベースのシステムで管理者特権のアクセス許可が必要な場合は、sudo az aks install-cli コマンドを使用できます。

  2. az aks get-credentials コマンドを使用して、Kubernetes クラスターに接続するように kubectl を構成します。

    このコマンドは、次の操作を実行します。

    • 資格情報をダウンロードし、それを使用するように Kubernetes CLI を構成します。
    • ~/.kube/config (Kubernetes 構成ファイルの既定の場所) を使用します。 Kubernetes 構成ファイルに対して別の場所を指定するには、--file 引数を使用します。
    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. kubectl get コマンドを使用して、ご利用のクラスターへの接続を確認します。 このコマンドでは、クラスター ノードの一覧が返されます。

    kubectl get nodes
    

    次の出力例は、前の手順で作成したノードを示しています。 ノードの状態が [Ready] であることを確認してください。

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-31469198-vmss000000   Ready    agent   3h29m   v1.25.6
    aks-nodepool1-31469198-vmss000001   Ready    agent   3h29m   v1.25.6
    aks-nodepool1-31469198-vmss000002   Ready    agent   3h29m   v1.25.6
    

Note

プライベート クラスターの場合、パブリック IP アドレスを介してノードに接続しようとすると、ノードに到達できない可能性があります。 これを修正するには、接続元のクラスターと同じ VNET 内にエンドポイントを作成する必要があります。 手順に従って、プライベート AKS クラスターを作成し、接続します。

アプリケーションの配置

Architecture diagram of AKS AI demo.

AKS Store アプリケーションの場合、マニフェストには次の Kubernetes デプロイとサービスが含まれています。

  • 製品サービス: 製品情報が表示されます。
  • 注文サービス: 注文を行います。
  • Makeline サービス: キューの注文を処理し、注文を完了します。
  • ネットショップ: 顧客が製品を見て注文するための Web アプリケーション。
  • Store Admin: ストアの従業員がキュー内の注文を確認し、製品情報を管理するための Web アプリケーション。
  • 仮想顧客: スケジュールに基づいて注文の作成をシミュレートします。
  • 仮想ワーカー: スケジュールに基づいて注文の完了をシミュレートします。
  • Mongo DB: 保持されているデータの NoSQL インスタンス。
  • Rabbit MQ: 注文キューのメッセージ キュー。

Note

MongoDB や Rabbit MQ などのステートフル コンテナーを運用環境の永続ストレージなしで実行することはお勧めしません。 わかりやすくするためにここではこれらを使用しますが、Azure CosmosDB や Azure Service Bus などのマネージド サービスを使うことをお勧めします。

  1. アプリケーションの YAML マニフェストを確認します。

  2. kubectl apply コマンドを使用してアプリケーションをデプロイし、ご利用の YAML マニフェストの名前を指定します。

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-all-in-one.yaml
    

    次の出力例は、正常に作成されたデプロイおよびサービスを示しています。

    deployment.apps/mongodb created
    service/mongodb created
    deployment.apps/rabbitmq created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/makeline-service created
    service/makeline-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-front created
    deployment.apps/store-admin created
    service/store-admin created
    deployment.apps/virtual-customer created
    deployment.apps/virtual-worker created
    

OpenAI をデプロイする

Azure OpenAI または OpenAI を使って、AKS 上でアプリケーションを実行できます。

  1. [Request Access to Azure OpenAI Service] (Azure OpenAI Service へのアクセスを要求する) フォームに入力して、Azure サブスクリプションで Azure OpenAI を有効にします。
  2. Azure portal で Azure OpenAI インスタンスを作成します。
  3. 作成した Azure OpenAI インスタンスを選びます。
  4. [Keys and Endpoints] (キーとエンドポイント) を選んでキーを生成します。
  5. [Model Deployments] (モデルのデプロイ)>[Managed Deployments] (マネージド デプロイ) を選んで Azure OpenAI スタジオを開きます。
  6. gpt-35-turbo モデルを使用して新しいデプロイを作成します。

Azure OpenAI でデプロイを作成する方法の詳細については、「Azure OpenAI Service を使用してテキストの生成を開始する」を参照してください。

AI サービスをデプロイする

アプリケーションがデプロイされたので、OpenAI を使ってストアのカタログに追加される新しい製品の説明を自動的に生成する Python ベースのマイクロサービスをデプロイできます。

  1. ai-service.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ai-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ai-service
      template:
        metadata:
          labels:
            app: ai-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: ai-service
            image: ghcr.io/azure-samples/aks-store-demo/ai-service:latest
            ports:
            - containerPort: 5001
            env:
            - name: USE_AZURE_OPENAI 
              value: "True"
            - name: AZURE_OPENAI_DEPLOYMENT_NAME 
              value: ""
            - name: AZURE_OPENAI_ENDPOINT 
              value: ""
            - name: OPENAI_API_KEY 
              value: ""
            resources:
              requests:
                cpu: 20m
                memory: 50Mi
              limits:
                cpu: 50m
                memory: 128Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: ai-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 5001
        targetPort: 5001
      selector:
        app: ai-service
    
  2. 環境変数 USE_AZURE_OPENAI"True" に設定します。

  3. Azure OpenAI スタジオから Azure OpenAI デプロイ名を取得し、AZURE_OPENAI_DEPLOYMENT_NAME の値を入力します。

  4. Azure portal から、リソースの左ブレードにある [キーとエンドポイント] を選択して、Azure OpenAI エンドポイントと Azure OpenAI API キーを取得します。 適宜、YAML の AZURE_OPENAI_ENDPOINTOPENAI_API_KEY を更新します。

  5. kubectl apply コマンドを使用してアプリケーションをデプロイし、ご利用の YAML マニフェストの名前を指定します。

    kubectl apply -f ai-service.yaml
    

    次の出力例は、正常に作成されたデプロイおよびサービスを示しています。

      deployment.apps/ai-service created
      service/ai-service created
    

Note

API キーなどの機密情報を Kubernetes マニフェスト ファイルに直接追加することは安全ではなく、誤ってコード リポジトリにコミットされる可能性があります。 ここでは、わかりやすくするために追加しました。 運用環境ワークロードの場合は、代わりにマネージド ID を使って Azure OpenAI サービスの認証を受けるか、Azure Key Vault にシークレットを格納します。

アプリケーションをテストする

  1. kubectl get pods コマンドを使って、デプロイされたポッドの状態を確認します。

    kubectl get pods
    

    次の手順に進む前に、すべてのポッドが "実行中" であることを確認します。

    NAME                                READY   STATUS    RESTARTS   AGE
    makeline-service-7db94dc7d4-8g28l   1/1     Running   0          99s
    mongodb-78f6d95f8-nptbz             1/1     Running   0          99s
    order-service-55cbd784bb-6bmfb      1/1     Running   0          99s
    product-service-6bf4d65f74-7cbvk    1/1     Running   0          99s
    rabbitmq-9855984f9-94nlm            1/1     Running   0          99s
    store-admin-7f7d768c48-9hn8l        1/1     Running   0          99s
    store-front-6786c64d97-xq5s9        1/1     Running   0          99s
    virtual-customer-79498f8667-xzsb7   1/1     Running   0          99s
    virtual-worker-6d77fff4b5-7g7rj     1/1     Running   0          99s
    
  2. kubectl get service コマンドを使用して、Store Admin Web アプリケーションとネットショップ Web アプリケーションの IP を取得します。

    kubectl get service store-admin
    

    このアプリケーションは、Kubernetes サービスによってプロビジョニングされたパブリック ロード バランサーを介して、Store Admin サイトをインターネットに公開しています。 このプロセスが完了するまでに数分かかることがあります。 サービスが起動して IP アドレスが表示されるまでの初期には、外部 IP は "保留中" と表示されます。

    NAME          TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
    store-admin   LoadBalancer   10.0.142.228   40.64.86.161    80:32494/TCP   50m    
    

    ''store-front'' という名前のサービスについても同じ手順を繰り返します。

  3. Web ブラウザーを開き、サービスの外部 IP アドレスを参照します。 ここで示す例では、40.64.86.161 を開き、ブラウザーに Store Admin を表示します。 ネットショップについても同じ手順を繰り返します。

  4. Store Admin で製品タブをクリックし、[製品の追加] を選択します。

  5. ''ai-service'' が正常に実行されている場合は、説明フィールドの横に [OpenAI に聞く] ボタンが表示されるはずです。 名前、価格、キーワードを入力し、[OpenAI に聞く]>[製品の保存] を選択し、製品の説明を生成します。

    Screenshot of how to use openAI to generate a product description.

  6. これで、販売者が使う Store Admin に作成した新しい製品が表示されます。 この画像では、Jungle Monkey Chew Toy が追加されたことを確認できます。

    Screenshot viewing the new product in the store admin page.

  7. 購入者が使うネットショップにも、作成した新製品が表示されます。 この画像では、Jungle Monkey Chew Toy が追加されたことを確認できます。 必ず、kubectl get service コマンドを使ってネットショップの IP アドレスを取得してください。

    Screenshot viewing the new product in the store front page.

次のステップ

AKS アプリケーションに OpenAI 機能を追加したので、Azure Kubernetes Service (AKS) から Azure OpenAI へのアクセスをセキュリティで保護できます。

生成 AI のユース ケースについて詳しくは、次のリソースを参照してください。