Zenn
💻

Azure Policy で Azure AI Foundry 上でのモデルデプロイを制御する

2025/02/11に公開
1

Control model-deployment on Azure AI Foundry using Azure Policy

企業において Microsoft Azure を利用する際、基盤管理者は利用者が Azure OpenAI Service や Azure AI Foundry 上でデプロイする AI モデルの種別を制御したい時があると思います。
そんな時は、Azure Policy を利用して、デプロイできる AI モデルを制限しましょう。

Azure ポリシーを利用してデプロイできる AI モデルを制限する

組み込みポリシーを利用する

Azure Policy を使ったことがないという人は、まず Microsoft が公式に提供している 組み込みポリシー (BuiltIn) を利用すれば良いと思います。
Azure Policy の ポリシー定義画面 にて、 [Preview]: Azure Machine Learning Deployments should only use approved Registry Models という定義を参照します。

ポリシーの定義は以下のようになっています。

{
  "properties": {
    "displayName": "[Preview]: Azure Machine Learning Deployments should only use approved Registry Models",
    "policyType": "BuiltIn",
    "mode": "Microsoft.MachineLearningServices.v2.Data",
    "description": "Restrict the deployment of Registry models to control externally created models used within your organization",
    "metadata": {
      "version": "1.0.0-preview",
      "category": "Machine Learning",
      "preview": true
    },
    "version": "1.0.0-preview",
    "parameters": {
      "effect": {
        "type": "String",
        "metadata": {
          "displayName": "Effect",
          "description": "Enable or disable the execution of the policy."
        },
        "allowedValues": [
          "Audit",
          "Deny",
          "Disabled"
        ],
        "defaultValue": "Audit"
      },
      "allowedPublishers": {
        "type": "Array",
        "metadata": {
          "displayName": "Allowed Model Publishers",
          "description": "List of Publishers whose Models are allowed to be deployed."
        },
        "defaultValue": []
      },
      "allowedAssetIds": {
        "type": "Array",
        "metadata": {
          "displayName": "Allowed Asset Ids",
          "description": "List of AssetIds of Models that are allowed to be deployed. This can include partial assetIds to allow all Models under a given scope."
        },
        "defaultValue": []
      }
    },
    "policyRule": {
      "if": {
        "allOf": [
          {
            "field": "type",
            "equals": "Microsoft.MachineLearningServices.v2.Data/workspaces/deployments"
          },
          {
            "field": "Microsoft.MachineLearningServices.v2.Data/workspaces/deployments/model.registryName",
            "exists": true
          },
          {
            "allOf": [
              {
                "field": "Microsoft.MachineLearningServices.v2.Data/workspaces/deployments/model.publisher",
                "notin": "[parameters('allowedPublishers')]"
              },
              {
                "count": {
                  "value": "[parameters('allowedAssetIds')]",
                  "name": "allowedAssetId",
                  "where": {
                    "field": "Microsoft.MachineLearningServices.v2.Data/workspaces/deployments/model.assetId",
                    "contains": "[current('allowedAssetId')]"
                  }
                },
                "equals": 0
              }
            ]
          }
        ]
      },
      "then": {
        "effect": "[parameters('effect')]"
      }
    }
  },
  "id": "/providers/Microsoft.Authorization/policyDefinitions/12e5dd16-d201-47ff-849b-8454061c293d/versions/1.0.0-preview",
  "type": "Microsoft.Authorization/policyDefinitions/versions",
  "name": "1.0.0-preview"
}

Azure Policy の定義を作ったことがない人が見ると、何書いてあるかわからないかと思いますが、そんな時は以下をざっくり知っておけばよいです。

  • parameters: 定義したポリシーの内容を実際に環境に適用 (割り当て) する際に設定する変数の定義
  • policyRule: ポリシーとして検知する条件と、検知した際の処理内容を定義

つまり、上記の組み込みロールは

  • もし (if)
  • 以下の条件すべてを満たす場合 (allOf)
    • 操作 (処理) 内容が AI モデルのデプロイ (Microsoft.MachineLearningServices.v2.Data/workspaces/deployments)
    • デプロイするモデルのレジストリ名が存在している (Microsoft.MachineLearningServices.v2.Data/workspaces/deployments/model.registryName)
    • 以下の条件すべてを満たす (allOf)
      • デプロイ対象のモデルの公開元 (Microsoft.MachineLearningServices.v2.Data/workspaces/deployments/model.publisher) が事前に定義した公開元一覧 (parameters('allowedPublishers'))に存在しない (notin)
      • モデルのアセット ID 値 (Microsoft.MachineLearningServices.v2.Data/workspaces/deployments/model.assetId) をデプロイ対象のモデル (current('allowedAssetId')) と事前に定義したアセット ID 一覧 (parameters('allowedAssetIds')) で突合 (count) しても 1 件もマッチしない ("equals": 0)
  • その時は (then)
  • 割り当て時に指定した動作 (parameters('effect')) を強制する (effect)

ということを書いているということです。
簡単にこのポリシーを説明すれば、 allowedAssetId に載せていないモデルに関してはデプロイを禁止できる定義が書いてあります。

ちなみに、モデルのアセット ID というのは、モデルカタログ上に置けるモデル ID を指しています。
例えば、o3-mini の場合、以下となります。

azureml://registries/azure-openai/models/o3-mini/versions/2025-01-31

実際にデプロイできるモデルを制限するポリシーを導入する際は、定義を使用して、実際に環境に割り当てます。
※上記で説明した定義は、その名の通りあくまで定義なので、実際に割り当て設定を行わない限り、環境で定義したポリシー制御が有効化されることはありません。

割り当てる際は 割り当て 画面にて設定を行います。

ポリシーの割り当て から、ポリシーの割り当てを行います。
今回は o1 や GPT-4o など、Azure OpenAI Service で提供されているモデル以外のデプロイを禁止する設定を入れてみます。
実際に割り当てる際の restrictedModels の値には、以下を設定しました。

allowedAssetIds
[
    "azureml://registries/azure-openai/models/gpt-35-turbo/versions/0125",
    "azureml://registries/azure-openai/models/gpt-35-turbo-16k/versions/0613",
    "azureml://registries/azure-openai/models/gpt-35-turbo-instruct/versions/0914",
    "azureml://registries/azure-openai/models/text-embedding-ada-002/versions/2",
    "azureml://registries/azure-openai/models/babbage-002/versions/2",
    "azureml://registries/azure-openai/models/davinci-002/versions/3",
    "azureml://registries/azure-openai/models/dall-e-3/versions/3.0",
    "azureml://registries/azure-openai/models/whisper/versions/1",
    "azureml://registries/azure-openai/models/text-embedding-3-small/versions/1",
    "azureml://registries/azureml/models/openai-whisper-large/versions/17",
    "azureml://registries/azure-openai/models/gpt-4/versions/turbo-2024-04-09",
    "azureml://registries/azure-openai/models/gpt-4-32k/versions/0613",
    "azureml://registries/azure-openai/models/gpt-4o-audio-preview/versions/2024-12-17",
    "azureml://registries/azure-openai/models/gpt-4o-mini-audio-preview/versions/2024-12-17",
    "azureml://registries/azure-openai/models/gpt-4o-realtime-preview/versions/2024-12-17",
    "azureml://registries/azure-openai/models/gpt-4o-mini-realtime-preview/versions/2024-12-17",
    "azureml://registries/azure-openai/models/o1-preview/versions/1",
    "azureml://registries/azure-openai/models/o1/versions/2024-12-17",
    "azureml://registries/azure-openai/models/o1-mini/versions/1",
    "azureml://registries/azure-openai/models/o3-mini/versions/2025-01-31"
]

効果 (effect) には Deny を設定します。

割り当ての対象は、今回はサブスクリプションに設定していますが、企業で Microsoft Azure を利用している場合は、管理グループ でサブスクリプション群を管理していると思いますので、必要に応じて変更してください。

実際に割り当てが完了すれば、指定したモデル以外がデプロイできないようになります。
試しに、上記設定に含まれない DeepSeek のデプロイを試してみます。

モデルデプロイの画面に遷移すると、以下のようなエラーメッセージが表示されるようになり、許可していないモデルがデプロイできなくなりました。

カスタムポリシーを利用する

Azure Policy について知見がある人は、組み込みポリシーではなく、カスタムポリシーでモデルデプロイを制御する定義を自作して割り当てると良いです。ちなみに、後述するカスタムポリシーの定義を利用すると、ポリシー適用前にデプロイされてしまった違反扱いのモデル種別も識別できます。

ちなみに、上記の組み込みポリシーはモデルのアセット ID を利用しているのですが、2025/02/21 現在、Preview 扱いのため、Terraform といった IaC (Infrastructure as a Code) を用いてのポリシー/イニシアティブ管理に向いていません。
企業内で Azure Policy を管理する場合は、IaC を利用して Azure Policy を管理・適用するのが基本だと思うので、そういった意味でも、カスタムポリシーでデプロイ制限をかけるのが良いと思います。

Preview の組み込みポリシーではない形でモデルデプロイできるの制御をかける方法については、以下の公式ドキュメントに記載があります。

https://learn.microsoft.com/en-us/azure/ai-foundry/model-inference/how-to/configure-deployment-policies?tabs=models

実際に、GPT モデル以外のデプロイを禁止するカスタムポリシーの例です。

policyRules
{
  "mode": "All",
  "version": "1.0.0",
  "policyRule": {
    "if": {
      "allOf": [
        {
          "equals": "Microsoft.CognitiveServices/accounts/deployments",
          "field": "type"
        },
        {
          "not": {
            "in": "[parameters('approvedModels')]",
            "value": "[field('Microsoft.CognitiveServices/accounts/deployments/model.name')]"
          }
        }
      ]
    },
    "then": {
      "effect": "[parameters('effect')]"
    }
  },
  "parameters": {
    "approvedModels": {
      "type": "Array",
      "metadata": {
        "displayName": "Approved models",
        "description": "List of approved models"
      },
      "allowedValues": [
        "o3-mini",
        "gpt-4o-mini-audio-preview",
        "gpt-4o-mini-realtime-preview",
        "o1",
        "o1-mini",
        "gpt-4o",
        "gpt-4o-mini",
        "gpt-4o-audio-preview",
        "gpt-4o-realtime-preview",
        "o1-preview",
        "gpt-4",
        "gpt-4-32k",
        "gpt-35-turbo-16k",
        "gpt-35-turbo-instruct",
        "gpt-35-turbo",
        "text-embedding-3-large",
        "text-embedding-3-small",
        "tts",
        "tts-hd",
        "whisper",
        "dall-e-3",
        "text-embedding-ada-002",
        "babbage-002"
      ],
      "defaultValue": [
        "o3-mini",
        "gpt-4o-mini-audio-preview",
        "gpt-4o-mini-realtime-preview",
        "o1",
        "o1-mini",
        "gpt-4o",
        "gpt-4o-mini",
        "gpt-4o-audio-preview",
        "gpt-4o-realtime-preview",
        "o1-preview",
        "gpt-4",
        "gpt-4-32k",
        "gpt-35-turbo-16k",
        "gpt-35-turbo-instruct",
        "gpt-35-turbo",
        "text-embedding-3-large",
        "text-embedding-3-small",
        "tts",
        "tts-hd",
        "whisper",
        "dall-e-3",
        "text-embedding-ada-002",
        "babbage-002"
      ]
    },
    "effect": {
      "type": "String",
      "metadata": {
        "displayName": "Effect",
        "description": "The effect determines what happens when the policy rule is evaluated to match"
      },
      "allowedValues": [
        "Audit",
        "Deny",
        "Disabled"
      ],
      "defaultValue": "Deny"
    }
  }
}

上記は Azure Policy を理解している人向けなので定義内容についての細かい説明はしませんが、許可しているモデル種類以外のデプロイを禁止するものになっていますので、そのまま割り当てます。
割り当て時、ユーザーへの説明文も忘れずに設定しましょう。

ちなみに、先述の公式ドキュメントの場合、デプロイの制限は モデル名バージョン の組み合わせパターンで制御できる記載になっています。
モデル種別だけではなく、バージョンまで指定して制限させたい場合は、ドキュメントの記述を参考にすると良いです。
{モデル名},{バージョン} の形式で allowedValues を定義できるようにすることで、モデル名×バージョンの組み合わせ指定での制限を実現できるようにしています。

{
  "not": {
    "value": "[concat(field('Microsoft.CognitiveServices/accounts/deployments/model.name'), ',', field('Microsoft.CognitiveServices/accounts/deployments/model.version'))]",
    "in": "[parameters('allowedModels')]"
  }
}

concat を用いたパラメータの指定は覚えておくとポリシー定義に柔軟性が出ます。必修レベルの技なので、この機に覚えておくと良いです。

ポリシーを割り当てると、以下のようにポリシー準拠状態を見ることができ、すでにポリシー適用前にデプロイされてしまったモデルも一覧で確認ができます。
今回は、ポリシー適用前に Phi-4 のモデルをデプロイしていたので、きちんと検知されていることを確認できます。

これで、ポリシーで違反状態にあるリソースを検知し、組織として逸脱した生成 AI 利用を抑止することができます。

(備忘) Azure AI Foundry 上でデプロイするモデルの取り扱いについて

Azure AI Foundry では、デプロイした生成 AI モデルに対して送信されたデータについてはモデルプロバイダーに共有されることはない という旨の記述が公式ドキュメントにあります。

https://learn.microsoft.com/ja-jp/azure/ai-studio/how-to/concept-data-privacy#generation-of-inferencing-outputs-as-a-serverless-api

Microsoft は、従量課金制推論用にデプロイされたモデル (MaaS) により送信および生成されるプロンプトと出力のデータ プロセッサとして機能します。 Microsoft では、これらのプロンプトと出力をモデル プロバイダーと共有しません。 また、Microsoft は、Microsoft、モデル プロバイダー、またはサード パーティのモデルをトレーニングまたは改善するために、これらのプロンプトと出力を使用しません。
モデルはステートレスであり、プロンプトや出力はモデルに保存されません。 コンテンツ フィルタリング (プレビュー) が有効になっている場合、有害なコンテンツの特定のカテゴリのプロンプトと出力が、Azure AI Content Safety サービスによってリアルタイムでスクリーニングされます。 Azure AI Content Safety によるデータの処理方法に関する詳細を確認してください。

そのため、サードパーティ製の生成 AI モデルを Azure AI Foundry 上で利用する際、プロンプトなどのデータが実際にモデル提供元に流れることがない点は Microsoft によって保障されているようです。

ただし、モデル提供元に対して、どれだけモデルを利用しているか、また利用者の顧客情報などについては適宜、Microsoft からモデルプロバイダーへ共有される場合があるということなので、その点については把握をしておくべきかと思います。

MaaS のデプロイ プロセス中に説明したように、Microsoft は、モデル パブリッシャーがモデルに関して顧客に連絡できるように、顧客の連絡先情報とトランザクションの詳細 (オファリングに関連付けられている使用量を含む) をパブリッシャーと共有する場合があります。 モデル パブリッシャーが利用できる情報の詳細については、パートナー センターの Microsoft コマーシャル マーケットプレース向け分析情報へのアクセスに関するページを参照してください。

さいごに

企業における Microsoft Azure 利用においては、セキュリティやコンプライアンス/ガバナンスの観点から、利用する生成 AI のモデルを制限したい場合があると思います。
アプリケーション開発者などの視点からすると、好きな生成 AI モデルを自由に使わせてほしいという想いはあると思いますが、サードパーティモデル利用における個別契約についての法務的観点や、モデル自体の利用に関する個人情報保護の観点など、企業としては利用以前の部分でクリアしなければならないポイントがいくつもあると日々感じます。
利用できるモデルを制限することも、安心して企業で生成 AI を活用する大切なポイントだと思うので、こういった知見も広まってほしいと思う次第です。

参考情報

Microsoft Learn

GitHub

1

Discussion

ログインするとコメントできます