network policyをportal上の最終状態ではなく、source-controlledなintentとして管理する。IaCがresource topologyを作る責任、Azure Policyがcomplianceを評価/強制する責任、AVNMがcentral network intentを配布する責任を分離し、single-writer、test、canary、rollback、runtime verificationまでpipelineの一部にする。
Network Policy as Codeを理解するための前提
MicrosoftのPolicy as Code guidanceは、policy definitionをsource controlへ置き、変更のたびにtest / validateする考え方を示している。 Azure Policyにはdefinition、initiative、assignment、exemption等のartifactがあり、definitionだけversion管理してもproduction behaviorを再現できない。assignment scopeとparameterまでcode/review対象にする。
新policyはenforcementを無効にした状態で影響を評価し、compliance結果・remediation・permissionを確認してから段階的にenforceする。 Bicep/Terraform等のIaCはVNet/subnet/NSG/route table/Firewall/DNS等のresource desired stateを管理する。一方Azure Policyはcompliance guardrailであり、同じresource propertyを複数systemが書く場合はsingle-writerを決める。
AVNMのNetwork Group dynamic membership、connectivity/security/routing configurationもcentral intentであり、portal-only変更にせずsource/review/deploy evidenceを残す。 test PASSだけではnetwork change完了ではない。effective route/security、DNS、actual traffic、failure/recoveryをruntimeで確認し、pipeline evidenceと紐付ける。
大scopeのPolicy/AVNM/IaC変更はblast radiusが大きい。management group全体へ一括deployせず、canary subscription / Network Group / regionからwaveを拡大する。
Ownership / Control / Data plane boundary
Git等にdefinition / module / assignment intentを置き、reviewableなchangeとして扱う。
IaC / Azure Policy / AVNMそれぞれのwrite authorityを明示し、同一propertyの競合を避ける。
pipelineからscope / region / waveを制御し、plan/compliance/deploy evidenceを残す。
effective route/security/DNS/trafficを観測し、declared intentとdata planeの差をdriftとして扱う。
Architecture model
設計判断
| 判断軸 | 推奨する問い | 設計時に固定するもの |
|---|---|---|
| Authority | VNet/NSG/UDR/AVNM/Policyの各propertyを誰が書くか。 | system of record、single writer、break-glass path。 |
| Repository model | platform policyとworkload IaCを同repo/別repoのどこで分離するか。 | ownership、CODEOWNERS相当、module version、release process。 |
| Test levels | syntaxだけでなく何をpre-deployで検証するか。 | lint/schema、plan/what-if、Policy compliance preview、fixture。 |
| Enforcement rollout | audit→enforceをどのscopeで進めるか。 | canary subscription、wave、exemption、stop condition。 |
| Drift | portal change / external system changeをどう検知・戻すか。 | scheduled plan、Policy compliance、AVNM deploy/effective state、alert。 |
| Runtime acceptance | network config適用後に何をobservable PASSにするか。 | traffic matrix、DNS、effective route/security、failure recovery。 |
実装・展開の順序
- authority mapを作る。 resource/property単位でIaC・Policy・AVNM・manual emergencyのwriterを列挙し、競合を解消する。
- current stateをimport/inventoryする。 legacy portal configurationを無視してcodeを上書きせず、driftとunknown ownershipを先に分類する。
- policyをsource controlする。 definitionだけでなくinitiative/assignment/parameter/exemptionをreview可能にする。
- pre-deploy testを行う。 schema/lint、IaC plan/what-if、Policy disabled-enforcementで影響を確認し、unexpected resource countをgateにする。
- canaryへ反映する。 selected subscription / group / regionへdeployし、runtime traffic matrixまでPASSしたら次waveへ進む。
- post-deploy driftを監視する。 emergency portal changeは許容期間を定め、codeへreconcileされない変更を継続状態にしない。
Platform team / Workload team の責任分界
| 領域 | Platform / central team | Workload / application team |
|---|---|---|
| Platform repository | shared modules、central Policy/AVNM intent、release pipelineを所有。 | approved module/versionを利用し、application-specific inputを提供。 |
| Workload IaC | guardrailとinterfaceを提供。 | workload VNet/subnet/NSG/service integrationをcodeで管理。 |
| Policy | definition/initiative/assignment/exemption標準を管理。 | compliance violationをremediateし、例外理由を維持。 |
| AVNM | Network Group/config/deployment pipelineを管理。 | membership metadataを維持し、data-plane testを実施。 |
| Emergency change | break-glassとreconciliation SLAを定義。 | 必要時にincident evidenceを残し、必ずsourceへ戻す。 |
Repository / pipeline model
platform-network/
modules/ # VNet / routing / firewall shared IaC
policy/
definitions/
initiatives/
assignments/
exemptions/
avnm/
network-groups/
connectivity/
security-admin/
routing/
tests/
policy-fixtures/
route-matrix/
negative-flows/
environments/
canary/
prod/
- schema/lintがPASS
- scope/resource count差分をreview
- ownerとrollbackを明記
- Policy complianceがexpected
- effective route/securityが一致
- positive/negative trafficがPASS
- canaryにregressionなし
- next waveのblast radius承認
- rollback artifactがknown-good
- drift 0または承認済み
- runtime telemetry正常
- emergency/manual changeをsourceへreconcile
Verification / review evidence
設計レビューで残す証拠
- source commit / PR / reviewers / change reason
- IaC plan/what-ifとresource count差分
- Policy compliance previewとexemption一覧
- AVNM configuration/deployment version
- canary runtime verification result
- post-deploy drift scanとmanual change reconciliation
runtimeで確認すること
- effective routes / security rulesがsource intentと一致すること
- required DNS resolution / Private Endpoint / hybrid flowが成立すること
- negative flowがfail-closedであること
- Policy enforcementがunexpected legacy resourceを破壊していないこと
- portal/manual driftが検知されること
- rollback artifactを適用してknown-good flowへ戻せること
az policy definition list -o table
az policy assignment list -o table
az policy state summarize -o jsoncaz resource list --query "[].{Name:name,Type:type,Group:resourceGroup}" -o table
Common failure modes
| 症状 / anti-pattern | 原因になりやすい設計 | 確認・是正 |
|---|---|---|
| TerraformとPolicyが同じpropertyを行ったり来たり変更 | single-writerがなくmodify/remediationとIaCが競合。 | property authorityを定義し、Policyはaudit/denyかIaC側へ統合する。 |
| PRはPASSだがproduction断 | static testだけでdata-plane acceptanceがない。 | canary traffic matrix、effective route/security、DNS testをpromotion gateへ。 |
| Policy enableで大量non-compliance/remediation | disabled-enforcement/audit期間なしで大scopeへ展開。 | compliance preview→exception整理→canary→waveの順へ変更。 |
| portal hotfixが翌日IaCで消える | emergency changeをsourceへreconcileしていない。 | break-glass ticketとsource reconciliation SLAを必須化。 |
| AVNM membershipだけportalで変更 | central network intentの一部がsource control外。 | Network Group/config/deployment evidenceを同じrelease processへ統合。 |