docker buildx build --platform linux/amd64 ... のようにプラットフォーム指定が必要。Key Vault Secrets UserやKey Vault Secrets Officerロールを割り当てる必要がある。az webapp identity assign でマネージドIDを有効化→ az role assignment create で当該IDにロール付与→ Web AppのApp Settingsに @Microsoft.KeyVault(SecretUri=...) を設定すると、シークレットが展開される(ただし、権限不足やロール割り当ての待ち時間などで即時に反映されないケースがある)。以上がAzure上でAIサービスやWebアプリをデプロイ・運用する際に汎用的に使えるポイントです。
ビルド時に server:latest で作成しているのに、プッシュ時に client-admin:latest と別のタグを使用しているようです。Webアプリが参照しているイメージタグと一致しているか確認してください。 素人なのでこういうミスをしたりする
サーバサイドでconsole.logした時にログにでない問題
Azureポータルで「診断ログ」や「アプリケーション ログ(ファイルシステム)」が有効になっているか、ログレベルが十分か確認してください。
2025-03-17 ver.1 ver.2 広聴AI (Digital Democracy 2030) 簡易Azure導入ガイド (ver.3)
いったん全部消してやり直してみる
$ az login
テナントの中のサブスクリプション一覧がでる
デフォルトのままでいいのでこのまま進める
リソースグループの作成 Azure OpenAI Serviceリソースの作成
An existing resource with ID '...kouchou-ai-openai' has been soft-deleted. To restore the resource, you must specify 'restore' to be 'true' in the property. If you don't want to restore existing resource, please purge it first. 親切すぎるw
$ az cognitiveservices account purge --location japaneast --name kouchou-ai-openai --resource-group kouchou-ai-rg --subscription ...
モデルのデプロイ これはCLIでできないのか
作成したAzure OpenAI Serviceリソースに移動します。
Azure OpenAI Studioを開けと言ってるけどAzure AI Foundryでいいのかな?
Azure OpenAI Studioは、以前は独立したポータルでしたが、現在はAzure AI Foundryポータルに統合されています。
そのため、「Azure OpenAI Studioを開け」と指示されても、Azure AI Foundryポータルで同じ機能が利用できるので、基本的にはAzure AI Foundryで問題ありません。
前回これはCLIでやった気がするな
前回作業した時、エンドポイントはhttps://kouchou-ai-openai.openai.azure.comだったのに
上記のコマンドで得たエンドポイントはhttps://japaneast.api.cognitive.microsoft.com/で、なんかおかしいね
前者の方が正しいよな
.envに同じエンドポイントを書くことに関して
embeddingとgpt4oに同じエンドポイントを指定していいの?どうやってリクエストを区別するんですか?
同じエンドポイントを使っても問題ありません。
Azure OpenAI Serviceでは、1つのエンドポイントで複数のデプロイを管理しており、リクエスト時に「デプロイ名」を指定することで、どのモデル(gpt4oやembedding)を呼び出すかを区別します。
Azure App Serviceのセットアップ App Service Planの作成
App Serviceを3つ立ち上げるけど、費用はどうなります?3倍?
App Serviceの料金は、個々のアプリの料金ではなく、App Service Plan単位で発生します。
つまり、同じプラン内に3つのアプリを配置すれば、必ずしも費用が3倍になるわけではありません。ただし、各アプリを別々のプランで立ち上げると、その分料金がかさむ可能性があります。
AWSでいうと一つのEC2の中で3つのコンテナが動いてる感じですか?
はい、その通りです。
同じApp Service Plan内に配置すると、1台のEC2上で複数のコンテナを動かすようなイメージで、リソースを共有するため、別々のプランを使わなければ費用は増えません。
サーバーコンポーネントのデプロイ ここからビルド待ちがあるので3つ並列でやろうと思う
リポジトリのクローン ここ古い名前なので直す必要がある
$ docker buildx build --platform linux/amd64 -t kouchou-ai-server:latest ./server
ビルドしたDockerイメージをローカルで実行してテストします
前回のマニュアルにはこれはなかったね、親切になった
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested そりゃそうだ pydantic_core._pydantic_core.ValidationError: 2 validation errors for Settings ADMIN_API_KEY PUBLIC_API_KEY そりゃそうだ このテストは逆効果だw
Dockerイメージの保存とアップロード
:
# Dockerイメージをtarファイルに保存
docker save kouchou-ai-server:latest -o kouchou-ai-server.tar
# tarファイルをgzipで圧縮
gzip kouchou-ai-server.tar
Azure Container Registryがないとdocker pushができないのか...
Azure App Serviceへのデプロイ :
# Dockerイメージをデプロイ
az webapp config container set \
--resource-group kouchou-ai-rg \
--name kouchou-ai-server \
--multicontainer-config-type compose \
--multicontainer-config-file docker-compose.yml
docker-compose.ymlを新しく作るみたいなことを言ってるけど違うよね 前回なんて言ってた? https://gist.github.com/nishio/bd2e30d604c3dad4b8aafe620fbf3635#2-web-appの作成サーバー用 :
# サーバー用Web Appの作成
az webapp create \
--resource-group kouchou-ai-rg \
--plan kouchou-ai-plan \
--name kouchou-ai-server \
--deployment-container-image-name kouchouaiacr.azurecr.io/server:latest
そもそも前回はAzure Container Registryを作ってたのか
すでにローカルで立ち上げる時ようにcompose.yamlがあるけどそれでいいのかな?
基本的にはローカル用のcompose.yamlを利用しても問題ありません。ただし、Azure App Serviceで運用する際は以下の点を確認してください:
前回のマニュアルではそういうことはしていないのだけどシンプルにするためにこうなったのかな?
そうです。前回は個々の設定を別々に行っていたかもしれませんが、今回はdocker-composeを使うことで設定を一元管理し、シンプルに運用できるように工夫されています。
ホントかなぁ、まあいいけど
renameの必要性についてセカンドオピニオン
デフォルトでは「docker-compose.yml」というファイル名で認識されるため、ローカルで「compose.yaml」としている場合はリネームするのが無難です。
どうしても「compose.yaml」を使いたい場合は、Azure CLI のオプション(例:--multicontainer-config-file)で明示的にファイル名を指定する必要があります。
そういう感じなら、明示的に指定するからrenameしなくていいか :
# Dockerイメージをデプロイ
az webapp config container set \
--resource-group kouchou-ai-rg \
--name kouchou-ai-server \
--multicontainer-config-type compose \
--multicontainer-config-file compose.yaml
このCLI側の手順ではimageをアップロードするタイミングがないような気がする
CLIの手順では、Dockerイメージ自体のアップロード(push)は行っていません。
通常は、Docker HubやAzure Container Registryなどの外部レジストリに事前にイメージをプッシュし、CLIはそのレジストリ上のイメージを参照してApp Serviceを設定するためのものです。
今回Azure Container Registryのインスタンス?を作っていない
そうです。今回のガイドはシンプルな構成を重視しており、ACRを利用せずにローカルでビルド・保存したDockerイメージを直接アップロードする方法を採用しています。
CLIでアップロードできる?ブラウザからしかできない?
CLIでは、ローカルのDockerイメージファイルを直接アップロードする機能は基本的に提供されていません。
通常は、コンテナレジストリ(ACRやDocker Hubなど)にイメージをプッシュし、そのイメージをApp Serviceから参照するか、もしくはブラウザのDeployment Centerを使ってローカルイメージをアップロードする形になります。
うえー、めんどくさ。ACR作成はそんなにつまづいてないから入れてもいいかもな
GitHub Actionsで差し込むことがお薦めされてる
じゃああれか、今手元でdocker buildxしてるけど、将来的にはGitHub Actionsでやるのがいいのか?
いやGitHub Actionsでビルドしても、それは結局ACRかDocker Hubかにpushして、そのトリガーでpullするってだけか。じゃあACRをセットアップする方がいいな。
$ az acr create --resource-group kouchou-ai-rg --name aikouchouacr --sku Basic$ az acr login --name aikouchouacr$ docker buildx build --platform linux/amd64 -t kouchou-ai-server:latest ./server
$ docker tag kouchou-ai-server:latest aikouchouacr.azurecr.io/kouchou-ai-server:latest
$ docker push aikouchouacr.azurecr.io/kouchou-ai-server:latestこれにより、ACRからイメージを取得してApp Serviceでコンテナを実行できるようになります。
$ az acr update -n aikouchouacr --admin-enabled true
$ az acr credential show --name aikouchouacr --resource-group kouchou-ai-rg
:
az webapp config container set \
--resource-group kouchou-ai-rg \
--name kouchou-ai-server \
--docker-custom-image-name aikouchouacr.azurecr.io/kouchou-ai-server:latest \
--docker-registry-server-url https://aikouchouacr.azurecr.io \
--docker-registry-server-user <ACRユーザー名> \
--docker-registry-server-password <ACRパスワード>
再起動する
$ az webapp restart --resource-group kouchou-ai-rg --name kouchou-ai-server
サーバが起動したかどうかはログをみよう :
# App Serviceのログを確認
az webapp log tail \
--resource-group kouchou-ai-rg \
--name kouchou-ai-server
ログが表示されないな。
% # ACRへのログイン
az acr login --name kouchouaiacr
zsh: command not found: #
Could not connect to the registry login server 'kouchouaiacr.azurecr.io'. Please verify that the registry exists and the URL 'https://kouchouaiacr.azurecr.io/v2/' is reachable from your environment.
Try running 'az acr check-health -n kouchouaiacr --yes' to diagnose this issue.
% az acr check-health -n kouchouaiacr --yes
Docker daemon status: available
Docker version: 'Docker version 20.10.22, build 42c8b31, platform linux/arm64'
Docker pull of 'mcr.microsoft.com/mcr/hello-world:latest' : OK
Azure CLI version: 2.70.0
2025-03-17 08:23:50.591717 An error occurred: CONNECTIVITY_DNS_ERROR
Failed to reach DNS for registry 'kouchouaiacr.azurecr.io'. Please check if the spelling is correct, if the CLI environment is on correct cloud and your network connectivity.ACRが二つあるとログインに失敗する?不可解
ログが出ない問題、むしろAzure Portalのログストリームならつながることもある
admin
2025-03-17T08:52:06 Welcome, you are now connected to log-streaming service.Starting Log Tail -n 10 of existing logs ----/appsvctmp/volatile/logs/runtime/container.log
2025-03-17T08:51:15.3231533Z Configure Services : 08.51.15.322864
2025-03-17T08:51:16.7442581Z Configure : 08.51.16.743970
2025-03-17T08:51:17.6208151Z Setting Up Routes : 08.51.17.620555
2025-03-17T08:51:18.2362864Z Exiting Configure : 08.51.18.236021
2025-03-17T08:51:18.6132403Z [40m[1m[33mwarn[39m[22m[49m: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
2025-03-17T08:51:18.6133451Z No XML encryptor configured. Key {fdf3c2ce-05ea-4c38-a6ba-9cffe3df9d1b} may be persisted to storage in unencrypted form.
2025-03-17T08:51:18.8348701Z Hosting environment: Production
2025-03-17T08:51:18.8359212Z Content root path: /opt/Kudu
2025-03-17T08:51:18.8533469Z Now listening on: http://0.0.0.0:8181
2025-03-17T08:51:18.8534039Z Application started. Press Ctrl+C to shut down.Ending Log Tail of existing logs ---Starting Live Log Stream ---
2025-03-17T08:53:06 No new trace in the past 1 min(s).
2025-03-17T08:53:50.5848228Z
2025-03-17T08:53:50.7628783Z > kouchou-ai-client-admin@0.1.0 start
2025-03-17T08:53:50.7629743Z > next start -p 4000
2025-03-17T08:53:50.7629784Z
2025-03-17T08:53:54.5458289Z ▲ Next.js 15.1.6
2025-03-17T08:53:54.5460079Z - Local: http://localhost:4000
2025-03-17T08:53:54.5460176Z - Network: http://169.254.132.3:4000
2025-03-17T08:53:54.5460215Z
2025-03-17T08:53:54.5460243Z ✓ Starting...
2025-03-17T08:53:56.3796807Z ✓ Ready in 3.9s
2025-03-17T08:55:06 No new trace in the past 1 min(s).
client
2025-03-17T08:48:53 Welcome, you are now connected to log-streaming service.Starting Log Tail -n 10 of existing logs ----/home/LogFiles/__lastCheckTime.txt (https://kouchou-ai-client.scm.azurewebsites.net/api/vfs/LogFiles/__lastCheckTime.txt)03/17/2025 08:47:13/home/LogFiles/kudu/trace/c2a2216e2cb4-c522ab4a-31c3-44b4-8dae-bd0dd87d61cf.txt (https://kouchou-ai-client.scm.azurewebsites.net/api/vfs/LogFiles/kudu/trace/c2a2216e2cb4-c522ab4a-31c3-44b4-8dae-bd0dd87d61cf.txt)
2025-03-17T08:48:52 Startup Request, url: /api/logstream/, method: GET, type: request, pid: 776,1,5, ScmType: None/home/LogFiles/2025_03_17_lw1sdlwk000C43_default_docker.log (https://kouchou-ai-client.scm.azurewebsites.net/api/vfs/LogFiles/2025_03_17_lw1sdlwk000C43_default_docker.log)
2025-03-17T08:44:56.888979144Z
2025-03-17T08:44:56.889594374Z > kouchou-ai-client@0.1.0 build
2025-03-17T08:44:56.889598946Z > next build
2025-03-17T08:44:56.889601478Z
2025-03-17T08:45:09.723432943Z ??? Next.js 15.1.6
2025-03-17T08:45:09.743210166Z
2025-03-17T08:45:09.834319984Z Creating an optimized production build .../home/LogFiles/2025_03_17_lw1sdlwk000C43_docker.log (https://kouchou-ai-client.scm.azurewebsites.net/api/vfs/LogFiles/2025_03_17_lw1sdlwk000C43_docker.log)
2025-03-17T08:46:31.303Z INFO - Waiting for response to warmup request for container kouchou-ai-client_0_4abf5642. Elapsed time = 100.3545987 sec
2025-03-17T08:46:48.895Z INFO - Waiting for response to warmup request for container kouchou-ai-client_0_4abf5642. Elapsed time = 117.9464186 sec
2025-03-17T08:47:05.550Z INFO - Waiting for response to warmup request for container kouchou-ai-client_0_4abf5642. Elapsed time = 134.6007097 sec
2025-03-17T08:47:27.022Z INFO - Waiting for response to warmup request for container kouchou-ai-client_0_4abf5642. Elapsed time = 156.0733663 sec
2025-03-17T08:47:49.023Z INFO - Waiting for response to warmup request for container kouchou-ai-client_0_4abf5642. Elapsed time = 178.0737392 sec
2025-03-17T08:48:14.332Z INFO - Waiting for response to warmup request for container kouchou-ai-client_0_4abf5642. Elapsed time = 203.3826478 sec
2025-03-17T08:48:31.846Z INFO - Waiting for response to warmup request for container kouchou-ai-client_0_4abf5642. Elapsed time = 220.8968595 sec
2025-03-17T08:48:42.925Z ERROR - Container kouchou-ai-client_0_4abf5642 for site kouchou-ai-client did not start within expected time limit. Elapsed time = 231.948246 sec
2025-03-17T08:48:43.097Z ERROR - Container kouchou-ai-client_0_4abf5642 didn't respond to HTTP pings on port: 3000, failing site start. See container logs for debugging.
2025-03-17T08:48:43.347Z INFO - Stopping site kouchou-ai-client because it failed during startup.Ending Log Tail of existing logs ---Starting Live Log Stream ---
2025-03-17T08:49:54 No new trace in the past 1 min(s).
serverがエラー
https://gist.github.com/nishio/7745a8449c0688976db9aebfb5aa398e
ログから見ると、コンテナが起動時に必要な設定情報(特に、ADMIN_API_KEY、PUBLIC_API_KEY、OPENAI_API_KEY など)が不足しているため、アプリケーション側で Pydantic によるバリデーションエラーが発生しています。その結果、アプリケーションが正しく起動できず、HTTP の ping にも応答できず、最終的に起動タイムアウトとなっています。
【対策】
必須環境変数の設定 アプリケーションが起動時に必要とする環境変数(ADMIN_API_KEY、PUBLIC_API_KEY、OPENAI_API_KEY など)を、Azure App Service の「構成」→「アプリ設定」から設定してください。
:
az webapp config appsettings set \
--resource-group kouchou-ai-rg \
--name kouchou-ai-server \
--settings ADMIN_API_KEY="admin" PUBLIC_API_KEY="public" OPENAI_API_KEY="..."
多分これバリデーションでUSE_AZUREのときにはなくてもOKにするとかした方がいいのかも
なんか色々エラーのようなものが出たりしてたけど他の作業をしているうちに気がついたら完了していた https://gist.github.com/nishio/df0513d9ac5219e848390315d08d03fe
おっ、処理が始まったっぽいぞ
問題はレポート作成がちゃんと進んでいるのか、裏でエラーで落ちてるのか、というところだな あとclientはまだ表示されない
今日の進捗
2025-03-18 Azure環境にデプロイするのとAzure OpenAI Serviceを使うのは独立の話だよねという話 確かにそれはそう ちょうどリポジトリも色々変わったことだしリポジトリごとゼロからやってみるか
https://github.com/digitaldemocracy2030/kouchou-ai fork https://github.com/nishio/kouchou-ai cloneして.envにOpenAIのAPIキーをいれてdocker-compose up
Attaching to kouchou-ai-api-1, kouchou-ai-client-1, kouchou-ai-client-admin-1 Error response from daemon: driver failed programming external connectivity on endpoint kouchou-ai-api-1 (0ad5b0eeabca84ef698349ed3093339034298f7711c03d847781b61a2b7a55d4): Bind for 0.0.0.0:8000 failed: port is already allocated おっとどこかで8000番が使われている
どこでポートが使われている?
$ sudo lsof -i :8000
古いサーバが生きてたので殺してから再度docker up
localhost:4000で管理画面が出る
localhost:8000でAPIのOKがでる
localhost:3000でクライアントが出ないが...
ビルドに時間がかかってただけみたい
:
kouchou-ai-client-1 |
kouchou-ai-client-1 | > kouchou-ai-client@0.1.0 build
kouchou-ai-client-1 | > next build
kouchou-ai-client-1 |
kouchou-ai-client-1 | ▲ Next.js 15.1.6
kouchou-ai-client-1 |
kouchou-ai-client-1 | Creating an optimized production build ...
... :
kouchou-ai-client-1 | ✓ Compiled successfully
kouchou-ai-client-1 | Linting and checking validity of types ...
kouchou-ai-client-1 |
kouchou-ai-client-1 | ./components/report/ClientContainer.tsx
kouchou-ai-client-1 | 30:6 Warning: React Hook useEffect has a missing dependency: 'fetchReport'. Either include it or remove the dependency array. react-hooks/exhaustive-deps
kouchou-ai-client-1 |
kouchou-ai-client-1 | info - Need to disable some ESLint rules? Learn more here: https://nextjs.org/docs/app/api-reference/config/eslint#disabling-rules
kouchou-ai-client-1 | Collecting page data ...
kouchou-ai-client-1 | Generating static pages (0/4) ...
kouchou-ai-client-1 | Generating static pages (1/4)
kouchou-ai-client-1 | Generating static pages (2/4)
kouchou-ai-client-1 | Generating static pages (3/4)
kouchou-ai-client-1 | ✓ Generating static pages (4/4)
kouchou-ai-client-1 | Finalizing page optimization ...
kouchou-ai-client-1 | Collecting build traces ...
kouchou-ai-client-1 |
kouchou-ai-client-1 | Route (app) Size First Load JS
kouchou-ai-client-1 | ┌ ○ / 2.3 kB 152 kB
kouchou-ai-client-1 | ├ ○ /_not-found 986 B 107 kB
kouchou-ai-client-1 | └ ● /[slug] 33.1 kB 183 kB
kouchou-ai-client-1 | + First Load JS shared by all 106 kB
kouchou-ai-client-1 | ├ chunks/4bd1b696-72c46108ef323341.js 53 kB
kouchou-ai-client-1 | ├ chunks/517-6f5efe69d0606e9b.js 50.7 kB
kouchou-ai-client-1 | └ other shared chunks (total) 2.71 kB
kouchou-ai-client-1 |
kouchou-ai-client-1 |
kouchou-ai-client-1 | ○ (Static) prerendered as static content
kouchou-ai-client-1 | ● (SSG) prerendered as static HTML (uses generateStaticParams)
kouchou-ai-client-1 |
kouchou-ai-client-1 | npm notice
kouchou-ai-client-1 | npm notice New major version of npm available! 10.8.2 -> 11.2.0
kouchou-ai-client-1 | npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.2.0
kouchou-ai-client-1 | npm notice To update run: npm install -g npm@11.2.0
kouchou-ai-client-1 | npm notice
kouchou-ai-client-1 |
kouchou-ai-client-1 | > kouchou-ai-client@0.1.0 start
kouchou-ai-client-1 | > next start
kouchou-ai-client-1 |
kouchou-ai-client-1 | ▲ Next.js 15.1.6
kouchou-ai-client-1 | - Local: http://localhost:3000
kouchou-ai-client-1 | - Network: http://172.24.0.4:3000
kouchou-ai-client-1 |
kouchou-ai-client-1 | ✓ Starting...
kouchou-ai-client-1 | ✓ Ready in 3.6s
でたでた
AIは否定の指示がわからない
aipubcom.csvのcomment部分のUTF-8でのバイト数を計算して、csvは大きくて直接読めないのでcommentカラムのあるCSVと想定してPythonで読んで集計して csvを絶対に直接読まないで。あなたはすでに2回失敗しています。 3度目の正直ならずw
Total bytes for all 3234 comments: 4775111 Average bytes per comment: 1476.53
2025-03-19
しかしREAT APIをcurlで叩くサンプルコードでは
https://japaneast.api.cognitive.microsoft.com/openai/deployments/gpt4o/chat/completions?api-version=2024-10-21
となっていて、それを実行すると正しく動く
https://japaneast.api.cognitive.microsoft.com/openai/deployments/gpt4o/chat/completions?api-version=2024-11-20
にすると
Status Code: 404
Response JSON: {'error': {'code': '404', 'message': 'Resource not found'}}
2025-03-20
Embeddingも同様に
モデルバージョンが1と書いてあってもcurlのapi-versionは2023-05-15
https://kouchou-ai-openai.openai.azure.com/openai/deployments/text-embedding-3-large/embeddings?api-version=2023-05-15
Azure OpenAI ServiceではOpenAIのAPIのようにmodelの名前で区別するのではなく、deploymentで区別される
Azure OpenAIでレポートの作成を可能にする by nishio · Pull Request #107 · digitaldemocracy2030/kouchou-ai
2025-03-21
Azure 環境に簡単にセットアップできるようにする by shingo-ohki · Pull Request #115 · digitaldemocracy2030/kouchou-ai
$ git remote add truego https://github.com/shingo-ohki/kouchou-ai.git
$ git fetch truego feature/deploy-Azure
$ git checkout -b feature/deploy-Azure truego/feature/deploy-Azure
ACRの名前を全部置換
docker buildをbuildx build --platform linux/amd64にする
$ make azure-build
$ make azure-push
$ make azure-deploy
なにをしてるんだろうaz extension add --name containerapp --upgrade
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights --wait
これらはAzure Container Appsを使用するために必要な基本設定です。
az monitor log-analytics workspace create \
-resource-group kouchou-ai-rg \
-workspace-name kouchou-ai-logs \
-location japaneast
このワークスペースはコンテナのログを収集・分析するために使用されます。
az containerapp env create \
-name kouchou-ai-env \
-resource-group kouchou-ai-rg \
-location japaneast \
-logs-workspace-id $WORKSPACE_ID
これは3つのコンテナアプリを実行するための共有環境を設定します。
az acr update \
-name kouchouairegistry \
-resource-group kouchou-ai-rg \
-admin-enabled true
これによりContainer AppsがACRからイメージをプルできるようになります。
各コンテナは以下の設定で作成されます:
このコマンドにより、広聴AIの3つのコンポーネントが完全に構成されたAzure環境にデプロイされます。
2025-03-25
az containerapp exec
- --name <コンテナアプリ名>
- --resource-group <リソースグループ名>
- --container <コンテナ名>
- --command "/bin/bash"
https://app.devin.ai/sessions/895b427620ef45c79a992efb319d31ac✅
2025-03-27 広聴AIからのサルベージ az containerapp exec --name api --resource-group nishio-kouchou-ai-rg --container api --command "/bin/bash"