Open Interpreterを使ってAzureにリソースを作成してみた

## はじめに
巷でOpen Interpreterというオープンソースプロジェクトが話題になっています。プロンプトで指示した内容についてプログラムの作成から実行まで行える激アツツールのようです。プログラムが実行できるならAzureCLIを実行できるのでは？と思い検証してみました。

[Open Interpreterの公式サイト](https://openinterpreter.com)
## 事前準備
AzureCLIの認証用のサービスプリンシパルを作成します。
```bash
$ az login -t
$ az account set -s <サブスクリプションのID>
$ az ad sp create-for-rbac --role Contributor --scopes "/subscriptions/<サブスクリプションID>" -n <spの名前>
```
また、Azure OpenAIのgpt-35-turbo or gpt-4モデルが必要なので作成しておきます。Azure  OpenAIの利用申請が済んでない方は[こちら](https://customervoice.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR7en2Ais5pxKtso_Pz4b1_xUOFA5Qk1UWDRBMjg0WFhPMkIzTzhKQ1dWNyQlQCN0PWcu)のリンクから申請できます。

## 環境構築
今回はDocker + docker-composeを使ってOpen Interpreterを動かしていきます。
### ディレクトリ構成
```text
root/
  ├ open-interpreter/
  │    └ Dockerfile
  └ docker-compose.yaml    
```

### Dockerfile
Open Interpreter自体はPythonがあれば動作しますが、今回の検証ではazコマンドを使用するのでAzureCLIのインストールも一緒に行なっています。

```dockerfile
FROM python:3.11.5

# Open interpreterのインストール
RUN set -eux; \
    pip install open-interpreter;

# Azure CLIのインストール
RUN set -eux; \
    apt-get update; \
    apt-get install ca-certificates curl apt-transport-https lsb-release gnupg -y; \
    mkdir -p /etc/apt/keyrings; \
    curl -sLS https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | tee /etc/apt/keyrings/microsoft.gpg > /dev/null; \
    chmod go+r /etc/apt/keyrings/microsoft.gpg; \
    AZ_REPO=$(lsb_release -cs); \
    echo "deb [arch=`dpkg --print-architecture` signed-by=/etc/apt/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" | tee /etc/apt/sources.list.d/azure-cli.list; \
    apt-get update; \
    apt-get install azure-cli;
```

### docker-compose.yaml
```yaml
version: "3"

services:
  open-interpreter:
    container_name: open-interpreter
    build: ./open-interpreter
    tty: true
    environment:
      AZURE_API_KEY: <AzureOpenAIのAPIキー>
      AZURE_API_BASE: <AzureOpenAIのAPIのURL>
      AZURE_API_VERSION: 2023-07-01-preview
      AZURE_DEPLOYMENT_NAME: <AzureOpenAIにデプロイしたモデル名>
      SP_CLIENT_ID: <事前準備で作成したSPのID>
      SP_CLIENT_SECRET: <事前準備で作成したSPのシークレット>
      SP_TENANT_ID: <事前準備で作成したSPのテナントID>
    volumes:
      - ./open-interpreter/volume:/home/user/volume
```

上記ファイルを用意した後、次のコマンドを実行します。

```bash
$ docker-compose build
$ docker-compose up -d
$ docker exec -it open-interpreter bash

# アタッチしたコンテナで実行
$ interpreter -y --use-azure
```

以下の画像のようになっていれば準備完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565388/cdc9a50d-d989-10b9-b423-3de7d9003301.png)

## リソースグループを作成してもらう
手始めにAzureリソースの基本であるリソースグループを作成できるか検証します。

```text
AzureCLIを使ってリソースグループを作成してください。
必要な情報は適宜聞いてください。
```

申し訳ないほど雑にお願いしてみました。するとサブスクリプションID、リソースグループ名、リージョン情報を聞かれたので入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565388/b0c2ae70-8291-29a5-a2f1-e680a66b08eb.png)
次にaz loginコマンドを使ってAzureへのログインを求められました。今回はブラウザを経由するログインではなく、サービスプリンシパルを使って認証したかったので、その旨をOpen  Interpreterに伝えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565388/82c8560c-eeab-ab74-5930-552cd0447ca9.png)
必要な情報が揃ったのかリソースグループを作成するコマンドを出力してくれます。気がついた時には自分のサブスクリプションに指定した内容のリソースグループができていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565388/899c9476-6e82-f9cd-3137-6bff38e3ff98.png)

## App Serviceを作成してもらう
次はApp Serviceを作成できるか検証します。あいも変わらず雑にお願いしてみます。
```
先ほど作ったリソースグループにAppServiceを作成してください。AppServicePlanはなるべく安いものでお願いします。
```

先ほどと同様にApp Serviceの構築に必要な情報の入力をすると、

1. 最も安いApp Serviceプランの検索
1. App Serviceプランの作成
1. App Serviceの作成
という流れで作成してくれました。

## アラートを作成してもらう
最後に作成したApp Serviceに対してアラートを追加できるか検証します。アラートに対する知見がない体でお願いしてみます。
```
作成してもらったAppServiceにアラートを追加したいです。
アラートに対する知見がないのでいい感じに閾値などを設定してください。
一旦アラート設定だけで通知の設定は不要です。
```
今回はこちらからの入力は求められずに眺めているだけで作成が終わっていました。実際に作成されたアラートは以下の3つで基本的に監視しなければいけないものが揃っていていることが分かります。

- CPU使用率が80%を超えた場合のアラート                                                        
- メモリ使用率が80%を超えた場合のアラート                                                 
- HTTPエラー率が10%を超えた場合のアラート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565388/e415f0a8-9f13-3259-bced-3da0b215c532.png)

## 最後に
今回の検証から色々なことができそうだなと思いました。かなり雑なプロンプトを渡してもこちらの意図を汲み取って実行してくれるので、より洗練されたプロンプトを渡してあげたら「このリソースに対してXXという監視設定を追加して」や「ある時間のログからエラーの原因を解析して」のような運用作業の効率化に繋げられるのではと密かに期待しています。