Azure App Service へのデプロイ (Node.js)
このスキルでは、Node.js アプリケーションを Azure App Service (Linux) にデプロイし、Managed Identity を使用して Azure AI Foundry エージェントに安全に接続するための、ベストプラクティスに沿った完璧な手順を説明します。
1. クラウドインフラストラクチャのセットアップ
- App Service プラン: 本番環境では必ず専用のティア(例:Basic B1)を選択してください。Free (F1) ティアには厳格な1日60分のCPUクォータがあり、アプリケーションが強制シャットダウンされます(結果として
403 Stoppedエラーが発生します)。
2. 認証と Managed Identity (パスワードレス)
- コード: Node.js バックエンドで
@azure/identityのDefaultAzureCredentialを使用します。 - ID を有効化: Azure App Service ポータルで、Settings > Identity に移動し、System assigned を有効にします。
- IAM アクセス許可: 対象の Azure AI プロジェクトで、Access control (IAM) に移動し、App Service の Managed Identity に Azure AI Developer ロールを割り当てます。 (注:
Cognitive Services OpenAI Userでは Azure Foundry Orchestration Agents には不十分です)。
3. 環境変数 (フロントエンド vs バックエンドの落とし穴)
GitHub Actions でフルスタックアプリ (React/Vite + Node.js) をデプロイする場合、環境変数は論理的に分割する必要があります。
フロントエンド (Vite)
VITE_プレフィックスが付いた変数 (例: Supabase キー) は、ビルド時に静的な HTML/JS に埋め込まれます。- 設定場所: これらは GitHub Secrets に保存し、
.github/workflowsファイル内のnpm run buildステップのenv:ブロックで明示的にマッピングする必要があります。 - 危険: Azure にのみ設定し GitHub Actions に設定しない場合、Vite は空の変数でフロントエンドをビルドします。
バックエンド (Node.js)
- 実行中の
server.jsファイルは、環境変数をクラウドコンテナからランタイムで読み取ります。 - 設定場所: 変数 (例: Azure AI エンドポイント、バックエンド Supabase キー) は、Azure ポータルの Settings > Environment variables で直接設定します。
- 危険: Azure App Service のバックエンドは GitHub Actions のシークレットを継承しません。Azure ポータルで手動で設定する必要があります。
- 重要: 変数は Node.js プロセスの起動時に一度だけメモリに読み込まれます。変数を追加または変更した場合は、App Service の概要ページで明示的に Restart をクリックする必要があります。
- Azure Load Balancer を信頼するには(
express-rate-limitに必要)、Express アプリにapp.set('trust proxy', 1);を追加してください。
4. GitHub Actions CI/CD パイプライン
最も安全なデプロイ戦略は、ビルドエンジンの競合 (GitHub と Azure Oryx) を避けることです。GitHub にビルドとパッケージ化を100%任せましょう。
ワークフローのベストプラクティス:
- GitHub で
npm installとフロントエンドのビルド (npm run build) を実行します。 - GitHub は、コンパイルされた出力 (
dist)、バックエンドファイル (server.js)、そして重要なnode_modulesフォルダを含むアーティファクトをアップロードします。- 理由:
node_modulesを省略すると、Azure の Oryx エンジンがnpm run buildを実行してアプリをビルドしようとしますが、生のソースファイル (index.html) がアップロードされていないためクラッシュします。
- 理由:
- GitHub Secret として保存された発行プロファイルと共に
azure/webapps-deploy@v3を使用します。