セキュリティやコンプライアンス上の理由で、Azure VM には直接 Public IP を紐づけられないように制限したいといったシナリオがあるかと思います。そういう場合には Azure Policy を利用することで制限することが可能ですのでご紹介しておきます。
まず、Azure Portal で [ポリシー] の [定義] を開くと、既に用意されている組み込みのポリシーが表示されます。あいにく、組み込みポリシーには Public IP を禁止するようなものがありませんので、 [+ ポリシー定義] から新規ポリシーを作成します。

ポリシー定義の画面では、ポリシー定義の場所 (サブスクリプションなど) を選択して任意の名前を付け、ポリシー ルールの箇所に具体的なポリシーの設定内容を定義します。今回は VM (厳密には NIC) に Public IP を付けることを禁止したいので、リソース タイプが networkInterfaces で、かつ NIC の ipconfigurations に publicIpAddress が設定されていない事を強制するため、以下のようなポリシーを定義します。

ポリシー定義の例
{
“mode”: “All”,
“policyRule”: {
“if”: {
“allOf”: [
{
“field”: “type”,
“equals”: “Microsoft.Network/networkInterfaces”
},
{
“not”: {
“field”: “Microsoft.Network/networkInterfaces/ipconfigurations[*].publicIpAddress.id”,
“exists”: “false”
}
}
]
},
“then”: {
“effect”: “deny”
}
},
“parameters”: {}
}
ポリシーが作成できたら、[割り当て] からポリシーを適用したいサブスクリプションやリソース グループを選択して割り当てます。

以下のようなメッセージが表示され、初回のスキャンが完了するまでに 30 分ほど時間がかかります。気長に待ちましょう。

初回の評価が終わると、既存のリソースでポリシーに準拠していないリソースがリストアップされます。

また、ポリシーの適用後に NIC に Public IP を紐づけて保存しようとすると、以下のようにエラーになるので、意図した通りに制限できたことが分かります。

JSON でポリシー定義を良い感じ書けば自由に制御できるので、Azure リソースのスキーマを理解したうえで使いこなしましょう。ちなみに、Azure Policy のプロパティに指定できるエイリアスは、Azure PowerShell で調べることが可能なので、この辺を使いこなすと楽だと思います。