Azure DNS で DNS ゾーン(ドメイン)を ARM/Bicep から作成しようとしたら、InvalidTemplateDeployment と一緒に Deny assignment check failed が出て失敗…「自分はグローバル管理者なのになぜ?」というケースは、実は Azure ガバナンス設計が原因であることがほとんどです。この記事では、Deny assignment によって Azure DNS ゾーン作成がブロックされる仕組みと、即時解決策・恒久対策・チェック手順までを実務レベルで整理します。
Azure DNS で DNS ゾーンを作成できないときに出るエラーの正体
典型的なエラーメッセージ
ARM テンプレートや Bicep、あるいは Portal から Azure DNS ゾーンを作成したときに、次のようなエラーになるケースがあります。
{
"error": {
"code": "InvalidTemplateDeployment",
"message": "The template deployment failed with error: 'Deny assignment check failed for template resource 'ten4service.com' of type 'Microsoft.Network/dnsZones'. The client '[email protected]' with object id 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' has the permission to perform action 'Microsoft.Network/dnsZones/write' at scope '/subscriptions/.../resourceGroups/..._managed/providers/Microsoft.Network/dnsZones/ten4service.com' but is blocked by deny assignment.'."
}
}
ポイントは以下の 3 行です。
- `type ‘Microsoft.Network/dnsZones’` … 対象は DNSゾーン
- `has the permission to perform action ‘Microsoft.Network/dnsZones/write’` … RBAC 上は権限あり
- `but is blocked by deny assignment` … しかし Deny assignment によってブロック
つまり、
「書き込み権限はあるが、Deny assignment のせいで実行できない」
という状態です。同じ症状は Microsoft Q&A でも Azure DNS の質問として報告されており、再現性の高い事象です。
結論:Deny assignment 付きのリソース グループに DNS ゾーンを作ろうとしている
結論から言うと、このエラーの本質は次の 1 行に集約できます。
「Deny assignment が設定されているリソース グループ(またはサブスクリプション)に DNS ゾーンを作成しようとしたため」
Deny assignment は「このスコープでは ○○ の操作を誰にもさせない」という 最優先の禁止ルールで、通常の RBAC(Owner / Contributor / DNS Zone Contributor 等)よりも強く適用されます。
そのため、
- ユーザーが
OwnerやContributorを持っていても - Entra ID の グローバル管理者であっても
Deny assignment でブロックされている操作は実行できません。
即時解決策:ユーザー管理用の別リソース グループに DNS ゾーンを作成する
まずは「今すぐ DNS ゾーンを作りたい」という視点での実務的な解決策です。
シンプルな回避策
- Deny assignment が付与されていない、ユーザー管理用のリソース グループ(RG)を新規作成
- その RG を Bicep / ARM / Terraform / Portal のデプロイ先として指定
実際、質問に近いケースでも、別の RG を指定しただけで DNS ゾーン作成が成功しています。
Portal からの手順例
- Azure ポータルで「リソース グループ」→「作成」
- サブスクリプション:該当のサブスクリプション
- リソース グループ名:例)
rg-dns-prod - リージョン:任意(DNS ゾーン自体は location =
global) - 作成
- 「DNS ゾーン」→「作成」で、サブスクリプションと RG に
rg-dns-prodを選択し、ゾーン名(例:ten4service.com)を入力して作成
これで問題なく作成できるようであれば、元の RG に Deny assignment が付いていたことがほぼ確定です。
Bicep / ARM で RG を切り替える例
Bicep(リソース グループスコープ)のサンプル:
targetScope = 'resourceGroup'
@description('DNS ゾーン名(例: ten4service.com)')
param dnsZoneName string
resource dnsZone 'Microsoft.Network/dnsZones@2023-07-01-preview' = {
name: dnsZoneName
location: 'global'
properties: {
zoneType: 'Public'
}
}
この Bicep を 別のリソース グループに対してデプロイすれば OK です。DNS ゾーン リソース定義自体は公式ドキュメントと同じ構造です。
Deny assignment とは何者か:RBAC を上書きする「禁止ルール」
Deny assignment の概要
Deny assignment は、Azure RBAC と同じく「スコープ+プリンシパル」に紐づく設定ですが、役割は真逆です。
| 項目 | ロール割り当て(Role assignment) | Deny assignment(拒否の割り当て) |
|---|---|---|
| 目的 | 操作を 許可する | 操作を 禁止する |
| 誰が作るか | 管理者(Owner など)が明示的に作成 | 主に Azure のサービス(Blueprint, Managed Application など)が自動作成 |
| 優先順位 | 通常の許可判定 | 許可よりも優先して評価 |
| 管理画面 | IAM > ロールの割り当て | IAM > 拒否の割り当て |
Deny assignment は、特定スコープで「この操作は誰にもさせない」という禁止アクションを定義しており、Microsoft.Network/dnsZones/write が含まれていれば DNS ゾーンの作成はできません。
なぜ自分で Deny assignment を作れないのか
公式ドキュメントでも明記されていますが、Deny assignment は基本的に Azure が作るものであり、通常の管理者が直接作成することはできません(Deployment Stack などの機能経由を除く)。
代表的な付与元は次のとおりです。
- Azure Blueprints(旧機能だが現場ではまだ利用例あり)
- Managed Application(サードパーティ製ソリューションなど)
- Service や SaaS が作成する「管理対象リソース グループ」
- 新しめのガバナンス機能(Deployment Stack 等)の保護設定
「自分はグローバル管理者なのになぜ?」の理由
Entra ID のグローバル管理者と Azure RBAC は別物
よくある誤解が、
「グローバル管理者だから Azure の全リソースにフルアクセスできるはず」
という認識です。しかし実際には、次のように権限の次元が異なります。
| 役割 | どこを管理するロールか | DNS ゾーン作成への影響 |
|---|---|---|
| グローバル管理者 (Entra ID) | ディレクトリ(ユーザー / グループ / アプリ / 認証) | Azure リソースの作成権限は 自動的には付かない |
| サブスクリプション Owner | そのサブスクリプション配下の Azure リソース | 通常は全操作が可能だが、Deny assignment には勝てない |
| DNS Zone Contributor | DNS ゾーン・レコードの作成/更新/削除 | Deny がなければ DNS ゾーンを書き込める |
つまり、たとえ Entra ID のグローバル管理者であっても、
- 対象サブスクリプション / RG に RBAC が付与されていないと操作できない
- RBAC が付与されていても、Deny assignment があればブロックされる
という二重の条件があります。
DNS ゾーン作成に必要なロール
DNS ゾーンそのものの作成には、おおむね次の権限が必要です。
DNS Zone Contributor(推奨)- または
Contributor/Ownerなどの上位ロール
ただし、ここでもう一度強調しますが、
「許可よりも Deny が優先」
なので、Deny assignment が付いている限り、どんなロールを割り当てても解決しません。
管理対象リソース グループ(_managed / MC_ など)に要注意
今回のような DNS ゾーン作成エラーが起きやすいのが、「サービスが自動で作ったリソース グループ」に対して、誤って IaC のデプロイ先を向けてしまったパターンです。
ありがちな RG 名と意味
| RG 名の例 | よくある用途 | ユーザーがしてはいけないこと |
|---|---|---|
..._managed | Managed Application / Blueprint / Deployment Stack などの管理対象リソース | 独自の VM / NIC / DNS ゾーンなどを追加作成 |
MC_{rgName}_{aksName}_{region} | Azure Kubernetes Service (AKS) の管理用 RG | 手動で Public IP や LB、DNS を作成してクラスタ用リソースを汚染 |
databricks-rg-* | Azure Databricks ワークスペース管理用 RG | 別システム用のストレージやネットワークを追加 |
| その他ベンダー名や製品名を含む RG | サードパーティ製 Managed Application など | サービスが想定していないリソースの追加・変更 |
このような RG には、多くの場合 Deny assignment や Resource Lock が自動付与されています。
DNS ゾーンなどの ユーザー管理リソースは、専用の RG(例:rg-dns-prod)に分離するのがベストプラクティスです。
Azure ポータルで Deny assignment を確認する手順
リソース グループの Deny assignment を確認
- Azure ポータルで該当の「リソース グループ」を開く
- 左メニューから「アクセス制御 (IAM)」を選択
- 上部タブの「拒否の割り当て」をクリック
- 一覧に何か表示されていれば、その RG には Deny assignment が付与されている
ここで表示される Deny assignment には、多くの場合以下のような情報が含まれます。
- 名前(DenyAssignmentName)
- 作成元(例:Azure Blueprints, Managed Application など)
- 適用されるアクション(actions / notActions)
- スコープ(サブスクリプション / RG / 個別リソース)
- SystemProtected = true(システム保護かどうか)
もしここに DNS 関連のアクション(例:Microsoft.Network/dnsZones/*)を含む Deny assignment があれば、それが DNS ゾーン作成失敗の直接原因になります。
サブスクリプション / 管理グループに付いている Deny assignment も確認
DNS 用 RG 自体に Deny が無くても、上位スコープ(サブスクリプション / 管理グループ)にある Deny が継承されている場合があります。
- 対象サブスクリプションを開く
- 「アクセス制御 (IAM)」→「拒否の割り当て」タブを確認
- 必要に応じて管理グループ側でも同様に確認
Deny assignment のスコープと継承の概念は、公式ドキュメントにまとまっています。
Azure Policy の「Deny」と Deny assignment の違い
実務で混同されやすいのが、「Azure Policy の Deny 効果」と「Deny assignment」です。
| 項目 | Azure Policy (effect: Deny) | Deny assignment |
|---|---|---|
| 主な目的 | タグや構成ルール違反の リソース作成を阻止 | 特定操作自体を 原則禁止にする |
| 定義主体 | 管理者が Policy 定義 / 割り当てを作成 | Azure のサービス(Blueprint, Managed App など)が主に作成 |
| エラーの出方 | 「Policy により拒否されました(RequestDisallowedByPolicy など)」 | 「Deny assignment check failed」 |
| 確認場所 | 「Azure Policy」ブレード | 各スコープの IAM > 拒否の割り当て |
今回のようにエラーメッセージに Deny assignment check failed と明示されている場合は、Azure Policy ではなく Deny assignment 側でブロックされています。
再発防止のための実務チェックリスト
1. RG が「ユーザー管理用」か「サービス管理用」かを見分ける
- RG 名に
_managedやMC_、製品名などが含まれていないか確認 - 怪しい場合は、その RG の概要を確認し、Managed Application や AKS / Databricks などの管理用でないかを判断
- 管理用であれば、ユーザー管理リソースを置かない方針にする
2. Deny assignment の有無をポータルで確認
- DNS を置きたい RG・サブスクリプション・管理グループそれぞれで IAM > 拒否の割り当てを確認
- DNS ゾーンやネットワーク系のアクションを含む Deny があれば、そのスコープで DNS を作るのは避ける
3. ガバナンス設計(Policy / Blueprint / Managed App)を棚卸し
- Azure Policy の Deny が意図しない制限をかけていないか
- Blueprint や Managed App で過度に広いスコープを保護していないか
- DNS 用に あらかじめ標準 RG(例:
rg-dns-prod,rg-dns-shared)を用意しておき、そこにだけ DNS を作る運用にする
4. 権限は「DNS Zone Contributor」を基本としつつ、Deny がないかを先に確認
- DNS 管理者には RG スコープで
DNS Zone Contributorを付与(VM など余計な権限を与えない) - それでも作成できない場合は、ロール追加ではなく Deny の有無を最優先で確認
5. IaC では「どの RG にデプロイしているか」を常に明示する
Bicep / ARM / Terraform などで DNS を作る場合、つい resourceGroup().name のように「今の RG」を使ってしまいがちです。
- DNS 用 RG を変数やパラメータで明示する
- CI/CD パイプライン側で「DNS 用 RG 名」を環境変数に固定する
- 誤って
_managedRG に向けていないかをコードレビューでチェック
実務でよくある「ハマりパターン」と回避例
パターン1:AKS クラスタ導入後、MC_ RG に DNS を作ろうとした
- 症状:
MC_rg-xxx_aks-yyy_regionという RG に DNS ゾーンを作ろうとして Deny assignment エラー - 原因:AKS の管理用 RG であり、クラスタを守るために Deny assignment やロックが設定されている
- 回避:アプリケーション用 / DNS 用の RG を別途作成し、そちらに DNS ゾーンをデプロイ
パターン2:Marketplace から導入したセキュリティ製品の Managed RG に作ろうとした
- 症状:ベンダー名の付いた RG に対し、DNS ゾーンを含む IaC をまとめてデプロイしようとして失敗
- 原因:Managed Application によって作成された RG で、ユーザーが勝手にリソースを追加できないよう Deny assignment が付いている
- 回避:製品の資料を確認し、「ユーザーが利用する RG」と「製品が管理する RG」を分ける設計に修正
パターン3:Blueprint / Policy ベースのガバナンス導入後、突然作れなくなった
- 症状:以前は DNS ゾーンを作れた RG で、ある日から Deny assignment エラーが出るようになった
- 原因:ガバナンス強化に伴い Blueprint や Deployment Stack、Policy などが適用され、Deny assignment が追加された
- 回避:ガバナンス担当チームと連携し、「DNS 用の例外 RG」や「スコープ除外」を検討
DNS 用リソース グループ設計のベストプラクティス
Azure DNS 自体も可用性が重要な「インフラの中のインフラ」です。運用上おすすめの RG 設計パターンをいくつか挙げます。
用途別に RG を分ける
- 共有 DNS ゾーン:
rg-dns-shared - 本番系アプリ DNS:
rg-dns-prod - 検証・開発用 DNS:
rg-dns-dev
各 RG に対して、
- DNS 管理者には
DNS Zone Contributor - 監査担当には
Reader
といったロールを割り当てると、責務が明確になりトラブルシューティングもしやすくなります。
Deny assignment やロックは「DNS 用 RG には付けない」が基本
もちろん、DNS ゾーンを誤削除から守るために リソース ロック(Delete ロック)や厳しめの RBAC を設定するのは良いプラクティスです。
しかし、Deny assignment のように 「誰も更新できなくなる」レベルの制約を DNS 用 RG に付与すると、いざというときの障害対応も不可能になります。
- 管理対象 RG:Deny assignment あり(サービスが管理)
- ユーザー管理 RG:Deny assignment なし(代わりにロール+ロックで保護)
という線引きをしておくと、今回のようなエラーに悩まされにくくなります。
トラブルシューティングの流れ(まとめ)
最後に、現場でそのまま使える「DNS ゾーン作成エラー対応フロー」をまとめておきます。
- エラーメッセージを確認
Deny assignment check failedがあるか?- 対象リソースが
Microsoft.Network/dnsZonesか?
- RG 名を確認
_managed/MC_/ ベンダー名などが含まれていないか?
- 対象 RG の IAM > 拒否の割り当てを確認
- Deny assignment が 1 件でもあれば、そこでの新規作成は原則 NG
- サブスクリプション / 管理グループ側の Deny も確認
- ユーザー管理用の新規 RG を作成し、そこに DNS ゾーンを作成
- ガバナンス担当と調整
- 必要なら DNS 用 RG を Policy / Blueprint のスコープから除外
- Managed Application 側の設計も見直し
おわりに:エラーの本質は「誰が悪い」ではなく「どこに作ろうとしたか」
今回の Deny assignment エラーは、
「権限が足りない」のではなく、「作ろうとしている場所がそもそもユーザーが触る前提ではなかった」
という設計上の問題であることがほとんどです。
- グローバル管理者だからといって、Deny assignment を無視できるわけではない
- Deny assignment はガバナンス上重要な仕組みなので、むりやり解除するのではなく「適切な RG にリソースを分離する」発想が大事
- DNS 用の専用 RG を用意し、そこには Deny ではなく RBAC とロックで安全にガードする
この 3 点を押さえておけば、「Azure DNS で新しいドメイン(DNS ゾーン)を作れない」というトラブルは、原因特定も再発防止もかなりスムーズになります。

コメント