APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

AKSの操作方法をAzure OpenAI Serviceに教えてもらおう - az aks copilot の解説

はじめに

こんにちは、ACS事業部の吉川です。
ふとしたことから、Azure CLIに以下のようなコマンドが増えていることに気が付きました。

$ az aks --help
~中略~
    copilot                        : Start a chat with the Azure Kubernetes Service expert. API keys
                                     for OpenAI or Azure are required.
~後略~

何ができるコマンドなのでしょうか。ちょっと試してみましょう。

aks-preview拡張機能をインストールする

az aks copilot は aks-previewという拡張機能に追加されたコマンドです。
利用するためには以下のようにインストールします。

az extension add --name aks-preview

過去にインストール済みの方は以下コマンドで更新しましょう。

az extension update --name aks-preview

今回インストールされたバージョンは、0.5.156 でした。

az extension list
  {
    "experimental": false,
    "extensionType": "whl",
    "name": "aks-preview",
    "path": "/home/azureuser/.azure/cliextensions/aks-preview",
    "preview": true,
    "version": "0.5.156"
  }

OpenAI用の環境変数を設定する

使い方を確認するためにヘルプを確認します。

$ az aks copilot --help
This command is from the following extension: aks-preview

Command
    az aks copilot : Start a chat with the Azure Kubernetes Service expert. API keys for OpenAI or
    Azure are required.
        This command initiates a chat assistant with expertise in Azure Kubernetes Service, offering
        guidance on troubleshooting issues using az commands.
        You have two options,
        OpenAI option,
            sign in to https://www.openai.com/, navigate to the API key section in your account
        dashboard (https://platform.openai.com/signup), follow the instructions to create a new API
        key, and choose models from https://platform.openai.com/docs/models/.
            export OPENAI_API_KEY=xxx, export OPENAI_API_MODEL=gpt-3.5-turbo
        Azure OpenAI option,
            after creating a new Cognitive Services resource (https://azure.microsoft.com/en-
        us/services/cognitive-services/), you can find the OPENAI_API_KEY and OPENAI_API_BASE in the
        "Keys and Endpoint" section of the resource's management page on the Azure portal
        (https://portal.azure.com/). OPENAI_API_DEPLOYMENT can be found in the "Model deployments"
        section, and OPENAI_API_TYPE should be "azure" for this option.
            export OPENAI_API_KEY=xxx, export OPENAI_API_BASE=https://xxxinstance.openai.azure.com/,
        export OPENAI_API_DEPLOYMENT=gpt-4-32k-0314, export OPENAI_API_TYPE=azure.
~以下略~

見たところ、OpenAI と Azure OpenAI Service のどちらも利用可能で、対応した環境変数を設定してあげればよさそうですね。
本記事のタイトルどおり、今回はAzure OpenAI Serviceを利用しました。以下のように設定します。

export OPENAI_API_KEY=<Azure OpenAIのAPIキー>
export OPENAI_API_BASE=<Azure OpenAIのエンドポイントURL>
export OPENAI_API_DEPLOYMENT=<モデルのデプロイメント名>
export OPENAI_API_TYPE=azure

もちろんですが、Azure CLIを実行する端末からのアクセスを許可するよう、Azure OpenAI Serviceのネットワーク設定も必要です。先日投稿した以下記事を参考にしてください。

techblog.ap-com.co.jp

いざ実行

拡張機能をインストールし環境変数を設定したら、もう使える状態です。
さっそく以下コマンドを実行してみましょう。

az aks copilot

すると、以下のように対話型のプロンプトが表示されます。

Please enter your request below.
For example: Create a AKS cluster
Prompt:

例文通り、Create a AKS cluster と問い合わせしてみましょう。

Prompt: Create a AKS cluster

To create an AKS cluster using the `az` command, you can use the following Bash script:


 ```bash
#!/bin/bash

# Set variables
resourceGroup="<resource_group_name>"
clusterName="<cluster_name>"
location="<location>"

# Create resource group
az group create --name $resourceGroup --location $location

# Create AKS cluster
az aks create --resource-group $resourceGroup --name $clusterName --location $location --node-count 3 --node-vm-size Standard_DS2_v2 --generate-ssh-keys
 ```


In the script above, you need to replace `<resource_group_name>`, `<cluster_name>`, and `<location>` with your desired values. The `--node-count` specifies the number of nodes in the cluster, and `--node-vm-size` specifies the size of each node. The `--generate-ssh-keys` flag generates SSH keys for the cluster.

To execute the script, save it to a file (e.g., `create_cluster.sh`), make it executable (`chmod +x create_cluster.sh`), and run it (`./create_cluster.sh`).



Menu: [p: re-Prompt, r: Run, q: Quit]

AKSクラスター作成用のBashスクリプトを提示してくれました。
なお、今回は gpt-35-turbo のモデルを利用しています。利用するモデルによって回答内容が変わる可能性はあるので、その点はご留意ください。

回答のあとに Menu: と表示され、再度入力を待ち受ける状態になりました。r: Run という選択肢が気になるので、r を入力してみます。

Menu: [p: re-Prompt, r: Run, q: Quit]<"r" を入力>

#!/bin/bash

# Set variables
resourceGroup="<resource_group_name>"
clusterName="<cluster_name>"
location="<location>"

# Create resource group
az group create --name $resourceGroup --location $location

# Create AKS cluster
az aks create --resource-group $resourceGroup --name $clusterName --location $location --node-count 3 --node-vm-size Standard_DS2_v2 --generate-ssh-keys

Hit `c` to cancel, `r` to run the script:

回答内にあったBashスクリプトをそのまま実行してくれるみたいです。再度確認のプロンプトが表示されるので、もう一度 r を入力してみます。

Hit `c` to cancel, `r` to run the script: <"r" を入力>
(InvalidResourceGroup) The provided resource group name '<resource_group_name>' has these invalid characters: '<>'. The name can only be a letter, digit, '-', '.', '(', ')' or '_'. For more details, visit https://aka.ms/ResourceGroupNamingRestrictions .
Code: InvalidResourceGroup
Message: The provided resource group name '<resource_group_name>' has these invalid characters: '<>'. The name can only be a letter, digit, '-', '.', '(', ')' or '_'. For more details, visit https://aka.ms/ResourceGroupNamingRestrictions .
The behavior of this command has been altered by the following extension: aks-preview
--name cannot exceed 63 characters and can only contain letters, numbers, or dashes (-).

エラーとなってしまいました。<resource_group_name> という名前でそのままリソースグループを作成しようとしたため、命名規則に引っ掛かっています。リソースグループ名の入力を求めるほど親切ではないようですね。

では、プロンプトでもう少し丁寧に指定してみましょう。

Prompt: Create AKS cluster. Resource Group is rg-sample. Region is japaneast. Cluster name is aks-sample.

Sure! Here's an updated version of the script to create an AKS cluster with the provided details:


 ```bash
#!/bin/bash

# Set variables
resourceGroup="rg-sample"
clusterName="aks-sample"
location="japaneast"

# Create resource group
az group create --name $resourceGroup --location $location

# Create AKS cluster
az aks create --resource-group $resourceGroup --name $clusterName --location $location --node-count 3 --node-vm-size Standard_DS2_v2 --generate-ssh-keys
 ```


In the script above, the resource group name is set to "rg-sample", the cluster name is set to "aks-sample", and the location is set to "japaneast". The cluster will have 3 nodes, and each node will use the "Standard_DS2_v2" VM size. SSH keys will be generated for the cluster.

To execute the script, save it to a file (e.g., `create_cluster.sh`), make it executable (`chmod +x create_cluster.sh`), and run it (`./create_cluster.sh`).

今度はちゃんと変数に値が入ったスクリプトを提示してくれました。
先ほどと同様 r を入力し実行してみます。

Menu: [p: re-Prompt, r: Run, q: Quit]<"r" を入力>

#!/bin/bash

# Set variables
resourceGroup="rg-sample"
clusterName="aks-sample"
location="japaneast"

# Create resource group
az group create --name $resourceGroup --location $location

# Create AKS cluster
az aks create --resource-group $resourceGroup --name $clusterName --location $location --node-count 3 --node-vm-size Standard_DS2_v2 --generate-ssh-keys

Hit `c` to cancel, `r` to run the script:<"r" を入力>
~以降Azure CLIの出力が続く~

今度はコマンドが正常に実行され、リソースが作成されました。

日本語で問い合わせてみる

OpenAIをバックエンドに利用しているのであれば、日本語で問い合わせても大丈夫な気がしますね。早速やってみましょう。

Please enter your request below.
For example: Create a AKS cluster
Prompt: AKSクラスターを作成したい

以下のBashスクリプトを使用して、Azure Kubernetes Service(AKS)クラスターを作成することができます。スクリプト内のコメン
トには、各ステップの説明が含まれています。


 ```bash
#!/bin/bash

# リソースグループの名前を指定します
resourceGroupName="myResourceGroup"

# AKSクラスターの名前を指定します
clusterName="myAKSCluster"

# リージョンを指定します
location="japaneast"

# リソースグループを作成します
az group create --name $resourceGroupName --location $location

# AKSクラスターを作成します
az aks create --resource-group $resourceGroupName --name $clusterName --node-count 3 --generate-ssh-keys

# AKSクラスターの認証情報を取得します
az aks get-credentials --resource-group $resourceGroupName --name $clusterName

# AKSクラスターの状態を確認します
az aks show --resource-group $resourceGroupName --name $clusterName --output table
 ```


このスクリプトでは、`az group create`コマンドを使用してリソースグループを作成し、`az aks create`コマンドを使用してAKSク
ラスターを作成します。`--node-count`パラメーターを変更することで、クラスターのノード数を調整することができます。

また、`az aks get-credentials`コマンドを使用してAKSクラスターの認証情報を取得し、`az aks show`コマンドを使用してクラスターの状態を確認します。

スクリプトを実行する前に、Azure CLIがインストールされていることを確認してください。また、Azureにログインしていることも必要です。ログインしていない場合は、`az login`コマンドを実行してログインしてください。

スクリプトを実行すると、指定したリソースグループとAKSクラスターが作成され、クラスターの認証情報と状態が表示されます。



Menu: [p: re-Prompt, r: Run, q: Quit]

日本語で入力すると回答も日本語で返してくれます。日本語で問い合わせたからか、リージョンも東日本が指定されているのが面白いですね。

いろいろ試してみる

AKSクラスターの状態確認を依頼する

Prompt: AKSクラスター上の起動していないPodを確認してほしい

以下のBashスクリプトを使用して、AKSクラスター上の起動していないPodを確認できます。


 ```bash
#!/bin/bash

# AKSクラスターのリソースグループ名とクラスター名を指定してください
resource_group="<リソースグループ名>"
cluster_name="<クラスター名>"

# AKSクラスターのコンテキストを設定します
az aks get-credentials --resource-group $resource_group --name $cluster_name

# 起動していないPodを確認します
kubectl get pods --field-selector=status.phase!=Running
 ```


上記のスクリプトでは、`resource_group``cluster_name`の変数にAKSクラスターのリソースグループ名とクラスター名を指定する
必要があります。これらの値を適切な値に置き換えてスクリプトを実行してください。

スクリプトの実行後、`kubectl get pods --field-selector=status.phase!=Running`コマンドが実行され、起動していないPodの一覧が表示されます。

確認用のコマンドを提示するのみで、直接的な確認はしてくれないようです。
この辺りはK8sGPTのほうが高機能なようですね。K8sGPTについては以下の記事で紹介しています。

techblog.ap-com.co.jp

マニフェストを出力する

Azure CLIのコマンドだけでなく、YAMLでのマニフェストファイルを作ってもらいましょう。

Prompt: nginxのPodをレプリカ数1で起動するDeploymentのマニフェストを書いてほしい

Sure! Here's a Bash script that will create a Kubernetes Deployment manifest for running an nginx Pod with 1 replica:


 ```bash
#!/bin/bash

# Set the resource group and AKS cluster name
resourceGroup="<resource-group-name>"
aksClusterName="<aks-cluster-name>"

# Set the deployment name and namespace
deploymentName="nginx-deployment"
namespace="default"

# Set the image and port for the nginx container
image="nginx:latest"
port=80

# Create the Deployment manifest
cat <<EOF > nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: $deploymentName
  namespace: $namespace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: $image
        ports:
        - containerPort: $port
EOF

# Apply the Deployment manifest to the AKS cluster
az aks get-credentials --resource-group $resourceGroup --name $aksClusterName --overwrite-existing
kubectl apply -f nginx-deployment.yaml
 ```


In this script, you need to replace `<resource-group-name>` with the name of your Azure resource group, `<aks-cluster-name>` with the name of your AKS cluster, and any other values as needed.

The script first sets the resource group and AKS cluster name variables. Then, it sets the deployment name, namespace, image, and port variables for the nginx container.

Next, it uses a HEREDOC to create the Deployment manifest in a file called `nginx-deployment.yaml`. The manifest specifies the API version, kind, metadata, and spec for the Deployment. It sets the number of replicas to 1, selects the nginx Pods using the `app: nginx` label, and defines the nginx container with the specified image and port.

Finally, the script uses the `az aks get-credentials` command to authenticate with the AKS cluster, and then applies the Deployment manifest to the cluster using the `kubectl apply` command.

You can run this script in a Bash environment to create the nginx Deployment in your AKS cluster.



Menu: [p: re-Prompt, r: Run, q: Quit]

YAMLを出力するBashスクリプトが提示されました。
プロンプトからそのまま実行させる都合上、Bashスクリプトの形式で出力するようシステムプロンプトで制限されているようです。

AKSと関係ない話をしてみる

Prompt: WHAT DO YOU GET IF YOU MULTIPLY SIX BY NINE

The product of multiplying six by nine is fifty-four (54). However, it seems like you are referencing a joke from "The Hitchhiker's Guide to the Galaxy" by Douglas Adams, 
where the answer to the ultimate question of life, the universe, and everything is humorously stated as 42. 
If you are referring to this joke, please let me know how I can assist you with Azure Kubernetes Service (AKS) automation.



Menu: [p: re-Prompt, q: Quit]

AKSに関係ないことを聞いても一応答えてはくれました。

おわりに

Azure CLIに追加された aks copilot を試用してみました。
現時点では、AKSを操作するためのスクリプトを、チャットベースの問い合わせで提示してくれる というもののようです。

詳しい内部実装については以下のプルリクエストで追加されたファイルを確認するとよいでしょう。

github.com

今年のMicrosoft Buildでチラッと触れられていたAKS Copilotとは別物なのかな?という気がしますが、AKSに関するコマンドにはかなりの数のオプションが存在するため、チャットベースで希望の操作ができるというだけでも便利に使えそうです。

【PR】
私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: 吉川 俊甫
AOAIもぼちぼちやってます。2023/06に Microsoft MVP (Microsoft Azure) を受賞しました。
Shunsuke Yoshikawa - Credly