【Terraform】Azure OpenAIからAI Foundryへの移行完全ガイド:ダウンタイムゼロの「接続」アーキテクチャ

【Terraform】Azure OpenAIからAI Foundryへの移行完全ガイド:ダウンタイムゼロの「接続」アーキテクチャ

Azure OpenAI Service をTerraformで管理している皆様、Azure Portal上に表示される「Azure AI Foundry へのアップグレード」という通知に安易に従ってはいけません。Webコンソール上ではボタン一つの操作に見えますが、IaC(Infrastructure as Code)の観点では、エンドポイントの変更やアクセスキーの無効化を伴うリソースの破壊的再作成(ForceNew)を引き起こすリスクがあります。

本記事では、既存の本番環境リソースを維持したまま、Terraformを用いて安全に「Azure AI Foundry」環境へ移行するためのアーキテクチャパターンと、具体的な実装コードを解説します。
目次

Azure Portalの「アップグレード」がTerraformでは危険な理由

⚠️ 警告:kindプロパティの変更は「リソース置換」を引き起こします
Webコンソールの案内に従い、Terraformコード上の kind を “OpenAI” から “AIServices” に書き換えるアプローチは推奨されません。これはAzure Resource Managerの仕様上、リソースの再作成(ForceNew)を強制するためです。
リソースが再作成されると、以下の致命的な問題が発生します。
  • エンドポイントURLの変更: アプリケーション側の接続設定を更新する必要があります。
  • アクセスキーの変更: 既存のキーが無効化され、即座にサービスダウンが発生します。
  • デプロイ済みモデルの消失: GPT-4などのモデルデプロイ設定がすべて削除されます。
したがって、我々がとるべき戦略は「リソースの変換」ではなく、**「既存リソースへの接続(Integration)」**です。

推奨戦略:「Hub & Spoke」アーキテクチャによる統合

Azure AI Foundryの本質は、既存のAIサービスを置き換えるものではなく、それらを統合管理する「ハブ」です。既存のAzure OpenAIリソース(計算リソース)には手を加えず、その外側に管理層としての「AI Hub」と「AI Project」を構築し、そこから既存リソースを**参照(Link)**させる構成が正解です。
この構成のメリット
既存のOpenAIリソースの設定(kind=”OpenAI”)は一切変更しません。そのため、稼働中のアプリケーションへの影響は皆無(ダウンタイムゼロ)です。

【実践】Terraformによる移行実装コード

ここからは、azurerm プロバイダー(v4.0系以上推奨)と、細かい設定を補完する azapi プロバイダーを併用した実装例を紹介します。

1プロバイダー設定

AI Foundry関連の新しいリソースに対応するため、azurerm はv4.0以上を使用し、接続設定のために azapi を定義します。
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = ">= 4.0.0"
    }
    azapi = {
      source  = "Azure/azapi"
      version = "~> 1.13"
    }
  }
}

2AI Hub と Project の作成

既存のOpenAIリソースとは別に、新規にHubとProjectを作成します。v4.0系では専用リソース azurerm_ai_foundry が利用可能です。
# AI Hub (管理プレーン)
resource "azurerm_ai_foundry" "hub" {
  name                    = "hub-foundry-prod"
  location                = azurerm_resource_group.example.location
  resource_group_name     = azurerm_resource_group.example.name
  
  # 依存リソース (Storage, KeyVault, AppInsights) は別途作成しID指定
  storage_account_id      = azurerm_storage_account.foundry_sa.id
  key_vault_id            = azurerm_key_vault.foundry_kv.id
  application_insights_id = azurerm_application_insights.foundry_ai.id

  identity {
    type = "SystemAssigned"
  }
}

# AI Project (作業プレーン)
resource "azurerm_ai_foundry_project" "project" {
  name               = "prj-genai-app-01"
  location           = azurerm_resource_group.example.location
  ai_services_hub_id = azurerm_ai_foundry.hub.id
}

3【重要】既存リソースとの接続 (Connection)

ここが移行の肝となる部分です。AI Hubに対して「既存のOpenAIリソースを使いたい」という設定を投入します。現状、この部分は azapi_resource を用いてREST APIを直接叩くのが最も安定的かつ柔軟です。
resource "azapi_resource" "openai_connection" {
  type      = "Microsoft.MachineLearningServices/workspaces/connections@2024-04-01-preview"
  name      = "conn-existing-openai"
  parent_id = azurerm_ai_foundry.hub.id # Hubに接続し全プロジェクトで共有

  body = jsonencode({
    properties = {
      category      = "AzureOpenAI"
      target        = azurerm_cognitive_account.existing_openai.endpoint # 既存エンドポイント
      authType      = "AAD" # Managed Identity認証 (キー管理不要)
      isSharedToAll = true
      metadata = {
        ResourceId = azurerm_cognitive_account.existing_openai.id
      }
    }
  })
  
  # 権限付与後に実行
  depends_on = [azurerm_role_assignment.hub_openai_contributor]
}
Point: authType = "AAD" を指定することで、HubのManaged Identityを使用したセキュアな接続が可能になります。これにより、アクセスキーをコードに埋め込むリスクを排除できます。

4権限の付与 (RBAC)

最後に、AI HubのManaged Identityが既存のOpenAIリソースを操作できるよう、適切なロール(Cognitive Services OpenAI Contributor)を割り当てます。
resource "azurerm_role_assignment" "hub_openai_contributor" {
  scope                = azurerm_cognitive_account.existing_openai.id
  role_definition_name = "Cognitive Services OpenAI Contributor"
  principal_id         = azurerm_ai_foundry.hub.identity.principal_id
}

まとめ:IaCにおける「Link & Extend」戦略

Azure AI Foundryへの移行は、既存リソースを破壊することなく、管理レイヤーを追加する「Link & Extend(接続と拡張)」のアプローチで実現可能です。
  1. 既存の OpenAIリソースはそのまま 維持する。
  2. Terraformで AI Hub / Project を新規作成する。
  3. Connectionリソース で両者を紐付ける。
この手順を踏むことで、本番環境の安定稼働を守りつつ、最新のAIプラットフォームの恩恵(Prompt Flowやモデル評価機能など)を即座に享受できるようになります。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次