AWS SCP の大きいサイズのインスタンス制限を Azure Policy で再現してみた

AWS SCP の大きいサイズのインスタンス制限を Azure Policy で再現してみた

2026.03.31

こんにちは、クラウド事業本部コンサルティング部のいたくらです。

はじめに

AWS では SCP(Service Control Policy)を使って「大きいサイズのインスタンス起動の制限」をしている環境があると思います。Azure でも同等の統制をかけたいけど、どうやればいいんだろうと思ったので、Azure Policy で実現する方法を検証してみました。

ビルトインポリシー「許可される仮想マシンのサイズ SKU」もありますが、今回は AWS SCP でよく使われる拒否リスト方式のカスタムポリシーで実装しています。

三行まとめ

  • Azure Policy の like 演算子でワイルドカードパターンを使い、高コスト VM ファミリー(GPU/HPC/超大容量メモリ)と汎用系の 64 vCPU 以上を一括拒否できる
  • ビルトインの許可リスト方式と異なり、拒否リスト方式はパターンベースで新 SKU も自動カバーできる
  • VM に加えて VMSS と BareMetal Infrastructure も同じポリシーでカバー可能

AWS で一般的に実施されている制限

AWS の SCP では、意図しない高額課金を防ぐため、以下のようなインスタンスタイプの制限をかけてる方が多いかと思います。

制限対象 説明
超大型インスタンス 16xlarge(64 vCPU)以上を制限
GPU インスタンス GPU 系(p3, p4, p5 等)を制限
ベアメタル ベアメタルインスタンスを制限

本記事では、これと同等の統制を Azure Policy で実現します。

Azure での実現方法

方針

Azure Policy のカスタムポリシーで、以下の 3 種類のリソースを拒否します。

  1. 高コスト VM ファミリーの全サイズ
    • GPU/FPGA 系(N 系)、HPC 系(H 系)、超大容量メモリ系(M 系)
  2. 汎用系 VM の大サイズ(64 vCPU 以上)
    • D / DC / E / EC / F / FX / L 系
  3. BareMetal Infrastructure
    • 専用ベアメタルサーバー

AWS SCP と同じ拒否リスト方式を採用し、like 演算子のワイルドカード(*)で制御します。

AWS と Azure の対応関係

AWS の制限 Azure での対応 備考
p*.*(GPU 系) Standard_N* を拒否 AWS は計算用 GPU(p 系)のみだが、Azure では N 系全体を制限
*.metal(ベアメタル) Microsoft.BareMetalInfrastructure を拒否 VM とは別リソースタイプのため、リソースタイプ単位で拒否
*.??xlarge 等(超大型) ファミリー全体拒否 + 64 vCPU 以上の個別パターン AWS の StringLike に相当する like 演算子を使用

ファミリー全体を拒否する高コスト VM

以下のファミリーは全サイズを拒否します。

ファミリー カテゴリ 用途
NC / ND GPU(計算用) AI/ML トレーニング、ディープラーニング
NV / NG GPU(描画用) VDI、リモート視覚化、クラウドゲーミング
NP FPGA リアルタイム ML 推論、ビデオトランスコーディング
HB / HC HPC 流体力学、有限要素解析
M 超大容量メモリ SAP HANA、超大規模 DB

汎用系 VM の大サイズ制限(64 vCPU 以上)

AWS では *.??xlarge のように「2 桁サイズ」を 1 つのパターンで表現できますが、Azure の SKU 名は Standard_D64s_v5 のように vCPU 数が直接埋め込まれているため、1 つのパターンで「64 以上」を表現できません。

そのため、東京リージョンの全 VM SKU(1,177 件、2026 年 3 月 12 日時点)を調査し、N/H/M 系以外で 64 vCPU 以上の SKU を洗い出しました。

ファミリー 拒否対象の vCPU 数 パターン数
D(汎用) 64, 96, 128, 160, 192 5
DC(汎用・機密コンピューティング対応) 64, 96 2
E(メモリ最適化) 64, 80, 96, 104, 112, 128, 192 7
EC(メモリ最適化・機密コンピューティング対応) 64, 96 2
F(コンピューティング最適化) 64, 72, 80 3
FX(コンピューティング最適化) 64, 96 2
L(ストレージ最適化) 64, 80, 96 3
合計 24

ポリシー定義(JSON)

全 28 条件を含むポリシー定義です。VM、VMSS、BareMetal の 3 つのリソースタイプをカバーしています。

{
  "if": {
    "anyOf": [
      {
        "allOf": [
          {
            "field": "type",
            "equals": "Microsoft.Compute/virtualMachines"
          },
          {
            "anyOf": [
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_N*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_H*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_M*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_D64*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_D96*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_D128*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_D160*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_D192*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_DC64*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_DC96*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_E64*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_E80*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_E96*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_E104*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_E112*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_E128*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_E192*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_EC64*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_EC96*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_F64*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_F72*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_F80*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_FX64*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_FX96*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_L64*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_L80*" },
              { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_L96*" }
            ]
          }
        ]
      },
      {
        "allOf": [
          {
            "field": "type",
            "equals": "Microsoft.Compute/VirtualMachineScaleSets"
          },
          {
            "anyOf": [
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_N*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_H*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_M*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_D64*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_D96*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_D128*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_D160*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_D192*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_DC64*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_DC96*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_E64*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_E80*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_E96*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_E104*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_E112*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_E128*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_E192*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_EC64*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_EC96*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_F64*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_F72*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_F80*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_FX64*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_FX96*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_L64*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_L80*" },
              { "field": "Microsoft.Compute/VirtualMachineScaleSets/sku.name", "like": "Standard_L96*" }
            ]
          }
        ]
      },
      {
        "field": "type",
        "equals": "Microsoft.BareMetalInfrastructure/bareMetalInstances"
      }
    ]
  },
  "then": {
    "effect": "Deny"
  }
}

ポリシー条件の内訳は以下の通りです。

区分 パターン 条件数 説明
N 系(GPU/FPGA) Standard_N* 1 ファミリー全体を拒否
H 系(HPC) Standard_H* 1 ファミリー全体を拒否
M 系(超大容量メモリ) Standard_M* 1 ファミリー全体を拒否
D 系(汎用) Standard_D64*Standard_D192* 5 64 vCPU 以上を拒否
DC 系(機密コンピューティング対応) Standard_DC64*Standard_DC96* 2 64 vCPU 以上を拒否
E 系(メモリ最適化) Standard_E64*Standard_E192* 7 64 vCPU 以上を拒否
EC 系(機密コンピューティング対応) Standard_EC64*Standard_EC96* 2 64 vCPU 以上を拒否
F 系(コンピューティング最適化) Standard_F64*Standard_F80* 3 64 vCPU 以上を拒否
FX 系(コンピューティング/メモリ) Standard_FX64*Standard_FX96* 2 64 vCPU 以上を拒否
L 系(ストレージ最適化) Standard_L64*Standard_L96* 3 64 vCPU 以上を拒否
BareMetal リソースタイプ拒否 1 リソースタイプ全体を拒否
合計 28

上記は VM 分の条件数です。VMSS も同じ 28 条件を持つため、ポリシー全体の条件数はさらに多くなりますが、1 つのポリシー定義で VM・VMSS・BareMetal をまとめてカバーしています。

ビルトインポリシーを採用しなかった理由

Azure にはビルトイン「許可される仮想マシンのサイズ SKU」(ID: cccc23c7-8427-4f53-ad12-b6a63eb452b3)がありますが、以下の理由からカスタムポリシーを採用しました。

観点 ビルトイン(許可リスト方式) カスタム(拒否リスト方式)
方式 許可する SKU を全て列挙 拒否するファミリーをパターン指定
ワイルドカード 不可(in 演算子のため完全一致のみ) 可能(like 演算子で Standard_N* 等)
メンテナンス 新 SKU 追加時にリスト更新が必要 パターンベースなので新 SKU も自動カバー
AWS SCP との親和性 低い 高い(同じ拒否リスト方式)

AWS の SCP に慣れている環境では、拒否リスト方式のほうが考え方を統一できるメリットもあります。

検証結果

弊社検証環境(東京リージョン)にて、ポリシーの動作確認を行いました。

テスト リソース SKU vCPU 期待結果 実際の結果
N 系(GPU)ファミリー拒否 VM Standard_NC4as_T4_v3 4 拒否 拒否されました
D 系(汎用)小サイズ許可 VM Standard_D2s_v5 2 許可 作成できました
D 系(汎用)64 vCPU 拒否 VM Standard_D64s_v5 64 拒否 拒否されました
VMSS での拒否 VMSS Standard_NC4as_T4_v3 4 拒否 拒否されました

テスト 1:N 系(GPU)ファミリーの拒否

Azure Portal の VM サイズ選択画面で、NC4as_T4_v3(GPU、4 vCPU)を選択しようとすると、「ポリシーによってブロック」と表示され選択できません。

3.png

Azure CLI で作成を試みた場合も、ポリシーによって拒否されます。

az vm create \
  --resource-group rg-policy-test \
  --name test-nc4-vm \
  --image Ubuntu2204 \
  --size Standard_NC4as_T4_v3 \
  --admin-username azureuser \
  --generate-ssh-keys
RequestDisallowedByPolicy
Resource 'test-nc4-vm' was disallowed by policy.
エラーレスポンスの詳細(クリックで展開)
{
  "evaluatedExpressions": [
    {
      "result": "True",
      "expression": "type",
      "expressionValue": "Microsoft.Compute/virtualMachines",
      "targetValue": "Microsoft.Compute/virtualMachines",
      "operator": "Equals"
    },
    {
      "result": "True",
      "expression": "Microsoft.Compute/virtualMachines/sku.name",
      "expressionValue": "Standard_NC4as_T4_v3",
      "targetValue": "Standard_N*",
      "operator": "Like"
    }
  ]
}

Standard_NC4as_T4_v3Standard_N* パターンにマッチし、Deny が発動しています。vCPU 数に関係なく、N 系ファミリーは全サイズが拒否されます。

テスト 2:D 系(汎用)小サイズの許可

Standard_D2s_v5(2 vCPU)は拒否対象のパターンにマッチしないため、正常に作成できました。

az vm create \
  --resource-group rg-policy-test \
  --name test-d2-vm \
  --image Ubuntu2204 \
  --size Standard_D2s_v5 \
  --admin-username azureuser \
  --generate-ssh-keys
ResourceGroup    PowerState    PublicIpAddress    PrivateIpAddress    Location
---------------  ------------  -----------------  ------------------  ----------
rg-policy-test   VM running    52.xxx.xxx.xxx     10.0.0.4            japaneast

テスト 3:D 系(汎用)64 vCPU の拒否

Standard_D64s_v5(64 vCPU)はポリシーの Standard_D64* パターンにマッチし、拒否されます。

4.png

Azure CLI でも同様に拒否されます。

az vm create \
  --resource-group rg-policy-test \
  --name test-d64-vm \
  --image Ubuntu2204 \
  --size Standard_D64s_v5 \
  --admin-username azureuser \
  --generate-ssh-keys
RequestDisallowedByPolicy
Resource 'test-d64-vm' was disallowed by policy.
エラーレスポンスの詳細(クリックで展開)
{
  "evaluatedExpressions": [
    {
      "result": "True",
      "expression": "type",
      "expressionValue": "Microsoft.Compute/virtualMachines",
      "targetValue": "Microsoft.Compute/virtualMachines",
      "operator": "Equals"
    },
    {
      "result": "True",
      "expression": "Microsoft.Compute/virtualMachines/sku.name",
      "expressionValue": "Standard_D64s_v5",
      "targetValue": "Standard_D64*",
      "operator": "Like"
    }
  ]
}

汎用系ファミリーでは、小サイズ(D2s_v5)は許可されますが、64 vCPU 以上(D64s_v5)は拒否されることを確認できました。

テスト 4:VMSS での拒否

VMSS(Virtual Machine Scale Sets)に対しても同じポリシーが効くことを確認しました。

5.png

Azure CLI でも同様に拒否されます。

az vmss create \
  --resource-group rg-policy-test \
  --name test-vmss-nc \
  --image Ubuntu2204 \
  --vm-sku Standard_NC4as_T4_v3 \
  --instance-count 1 \
  --admin-username azureuser \
  --generate-ssh-keys
RequestDisallowedByPolicy
Resource 'test-vmss-nc' was disallowed by policy.
エラーレスポンスの詳細(クリックで展開)
{
  "evaluatedExpressions": [
    {
      "result": "True",
      "expression": "type",
      "expressionValue": "Microsoft.Compute/virtualMachineScaleSets",
      "targetValue": "Microsoft.Compute/VirtualMachineScaleSets",
      "operator": "Equals"
    },
    {
      "result": "True",
      "expression": "Microsoft.Compute/VirtualMachineScaleSets/sku.name",
      "expressionValue": "Standard_NC4as_T4_v3",
      "targetValue": "Standard_N*",
      "operator": "Like"
    }
  ]
}

VM と同じポリシー定義で VMSS もカバーできていることが確認できました。

実運用上の注意点

新 SKU への対応

N/H/M 系はファミリー全体を Standard_N* のようにワイルドカードで拒否しているため、新 SKU が追加されても自動的にカバーされます。

一方、汎用系の大サイズ制限(Standard_D64* 等)は vCPU 数ごとのパターン指定のため、Azure が新しい大サイズ SKU(例: D256)を追加した場合はパターンの追加が必要です。ただし、大サイズ SKU の追加頻度はそれほど高くないと考えられます。

VMSS の対象フィールド

VM と VMSS ではポリシーで指定するフィールドが異なります。

リソースタイプ フィールド
VM Microsoft.Compute/virtualMachines/sku.name
VMSS Microsoft.Compute/VirtualMachineScaleSets/sku.name

本記事のポリシー定義では両方をカバーしていますが、VM のみを対象にする場合は VMSS のブロックを削除してください。

BareMetal Infrastructure

BareMetal Infrastructure は Microsoft.BareMetalInfrastructure という別のリソースプロバイダーであり、ポリシーエイリアスが存在しないため SKU レベルでの制御はできません。本ポリシーではリソースタイプ単位で作成を拒否しています。

まとめ

  • AWS SCP の「大きいサイズのインスタンス起動の制限」は、Azure Policy の like 演算子を使ったカスタムポリシーで再現できる
  • GPU/HPC/超大容量メモリ系はファミリー全体を Standard_N* 等のパターンで拒否、汎用系は 64 vCPU 以上の SKU を個別パターンで拒否する
  • ビルトインの許可リスト方式より、拒否リスト方式のほうがメンテナンス性と AWS SCP との親和性が高い
  • VM、VMSS、BareMetal Infrastructure を 1 つのポリシー定義でカバーできる

AWS と Azure でマルチクラウド運用をしている環境では、同じ考え方でガバナンスを統一できると運用がシンプルになると思います。

この記事がどなたかのお役に立てれば幸いです。
以上、クラウド事業本部コンサルティング部のいたくら(@itkr2305)でした!

参考ドキュメント

この記事をシェアする

関連記事