JavaScriptを有効にしてください

Azure Policy -DeployIfNotExists- のタイミングをコントロールし隊

 ·   10 分で読めます  ·   Kento

Azure Policy には様々な効果があります
その中の1つに DeployIfNotExists があります
今回はこの DeployIfNotExists で使用できる、evaluationDelay にフォーカスしてみます

DeployIfNotExists とは

Azure の公式ドキュメントをそのまま引用してみます

deployIfNotExists は、リソース プロバイダーによって、サブスクリプションまたはリソースの作成または更新要求が処理され、成功を示す状態コードが返されてから、構成可能な遅延後に実行されます。

構成可能な遅延後に実行 とあります
今回はこの遅延のタイミングを構成してみたいと思います

evaluationDelay とは

Azure Policy 定義の deployIfNotExists 効果 - Azure Policy | Microsoft Learn に evaluationDelay の項目があります
以下の説明が記載されています

関連リソースの存在を評価する必要があるタイミングを指定します。 遅延は、リソースの作成または更新要求の結果である評価のみに使用されます。
使用できる値は AfterProvisioning、AfterProvisioningSuccess、AfterProvisioningFailure、または ISO 8601 期間の 0 から 360 分の間です。
AfterProvisioning 値では、ポリシー規則の if 条件で評価されたリソースのプロビジョニング結果が検査されます。 結果に関係なく、プロビジョニングが完了した後に AfterProvisioning が実行されます。 6 時間より長くかかるプロビジョニングは、AfterProvisioning の評価の遅延を判断するときに失敗として扱われます。
既定値は PT10M (10 分間) です。
長い評価遅延を指定すると、リソースの記録されたコンプライアンス状態が、次の評価のトリガーまで更新されない場合があります。

この evaluationDelay というプロパティで遅延時間を構成することができそうです

ざっくり手順

  1. Azure Policy の作成
  2. 作成した Policy の割り当て
  3. リソースの作成
  4. Policy 効果の確認

1. Azure Policy の作成

今回は evaluationDelay の効果を確認するためにいくつかのパターンを用意しました

パターン evaluationDelay
01 デフォルト (PT10M (10 分間))
02 AfterProvisioningSuccess
03 PT00M

カスタム ポリシーを作成しましたが、フロー ログと Traffic Analytics を有効にするように仮想ネットワークを構成する という組み込みポリシーをベースにしました

作成したポリシーを見たい方は下記を展開してみてください
then 配下の evaluationDelay 部分を追記しただけです

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
{
  "properties": {
    "displayName": "フロー ログと Traffic Analytics を有効にするように仮想ネットワークを構成する",
    "policyType": "Custom",
    "mode": "Indexed",
    "description": "Traffic Analytics とフロー ログは、ポリシー作成時に指定された設定を使用して、特定のリージョンでホストされているすべての仮想ネットワークに対して有効にすることができます。仮想ネットワークで既にこれらの機能が有効になっている場合、ポリシーによって現在の設定が上書きされません。Traffic Analytics はクラウド ネットワークのユーザーとアプリケーションのアクティビティを視覚的に把握するためのクラウドベースのソリューションです。",
    "metadata": {
      "category": "Network",
      "createdBy": "3181ca0f-5876-4934-a248-cdcb86ac8ad5",
      "createdOn": "2024-11-04T15:17:22.3212454Z",
      "updatedBy": null,
      "updatedOn": null
    },
    "version": "1.0.0",
    "parameters": {
      "effect": {
        "type": "String",
        "metadata": {
          "displayName": "効果",
          "description": "ポリシーの実行を有効または無効にします"
        },
        "allowedValues": [
          "DeployIfNotExists",
          "Disabled"
        ],
        "defaultValue": "DeployIfNotExists"
      },
      "vnetRegion": {
        "type": "String",
        "metadata": {
          "displayName": "仮想ネットワーク リージョン",
          "description": "選択したリージョンの仮想ネットワークに対してのみ構成します。",
          "strongType": "location"
        }
      },
      "storageId": {
        "type": "String",
        "metadata": {
          "displayName": "ストレージ アカウント",
          "description": "フローログの送信先となるストレージ アカウントのリソース ID。デプロイ目的でのみ使用されます。このストレージ アカウントが VNet と同じリージョンにあることを確認してください。",
          "strongType": "Microsoft.Storage/storageAccounts",
          "assignPermissions": true
        }
      },
      "timeInterval": {
        "type": "String",
        "metadata": {
          "displayName": "Traffic Analytics の処理間隔 (分)",
          "description": "Traffic Analytics では選択された頻度で BLOB を処理します。"
        },
        "allowedValues": [
          "10",
          "60"
        ],
        "defaultValue": "60"
      },
      "workspaceResourceId": {
        "type": "String",
        "metadata": {
          "displayName": "ワークスペースのリソース ID",
          "description": "Log Analytics ワークスペースのリソース ID",
          "strongType": "Microsoft.OperationalInsights/workspaces",
          "assignPermissions": true
        }
      },
      "workspaceRegion": {
        "type": "String",
        "metadata": {
          "displayName": "ワークスペースのリージョン",
          "description": "Log Analytics ワークスペースのリージョン",
          "strongType": "location"
        }
      },
      "networkWatcherRG": {
        "type": "String",
        "metadata": {
          "displayName": "Network Watcher RG",
          "description": "flowLog リソースが作成されるリソース グループの名前です。デプロイが必要な場合にのみ使用されます。これは、Network Watcher が配置されるリソース グループです。",
          "strongType": "existingResourceGroups"
        },
        "defaultValue": "NetworkWatcherRG"
      },
      "networkWatcherName": {
        "type": "String",
        "metadata": {
          "displayName": "Network Watcher",
          "description": "flowLog リソースが作成される Network Watcher のリソース ID です。VNet と同じリージョンに属していることを確認してください。",
          "strongType": "Microsoft.Network/networkWatchers"
        }
      },
      "retentionDays": {
        "type": "String",
        "metadata": {
          "displayName": "フローログを保持する日数",
          "description": "ストレージ アカウントにフローログ データが保持される日数。データを無期限に保持し、アイテム保持ポリシーを適用しない場合は、リテンション期間 (日数) を 0 に設定します。"
        },
        "defaultValue": "30"
      }
    },
    "policyRule": {
      "if": {
        "allOf": [
          {
            "field": "type",
            "equals": "Microsoft.Network/virtualNetworks"
          },
          {
            "field": "location",
            "equals": "[parameters('vnetRegion')]"
          }
        ]
      },
      "then": {
        "effect": "[parameters('effect')]",
        "details": {
          "type": "Microsoft.Network/networkWatchers/flowlogs",
          "resourceGroupName": "[if(empty(coalesce(field('Microsoft.Network/virtualNetworks/flowLogs'))), parameters('networkWatcherRG'), split(first(field('Microsoft.Network/virtualNetworks/flowLogs[*].id')), '/')[4])]",
          "name": "[if(empty(coalesce(field('Microsoft.Network/virtualNetworks/flowLogs[*].id'))), 'null/null', concat(split(first(field('Microsoft.Network/virtualNetworks/flowLogs[*].id')), '/')[8], '/', split(first(field('Microsoft.Network/virtualNetworks/flowLogs[*].id')), '/')[10]))]",
          "evaluationDelay": "AfterProvisioning",
          "existenceCondition": {
            "anyof": [
              {
                "field": "Microsoft.Network/networkWatchers/flowLogs/enabled",
                "equals": "false"
              },
              {
                "allof": [
                  {
                    "field": "Microsoft.Network/networkWatchers/flowLogs/enabled",
                    "equals": "true"
                  },
                  {
                    "field": "Microsoft.Network/networkWatchers/flowLogs/flowAnalyticsConfiguration.networkWatcherFlowAnalyticsConfiguration.enabled",
                    "equals": "true"
                  },
                  {
                    "field": "Microsoft.Network/networkWatchers/flowLogs/flowAnalyticsConfiguration.networkWatcherFlowAnalyticsConfiguration.trafficAnalyticsInterval",
                    "in": [
                      "10",
                      "60"
                    ]
                  }
                ]
              }
            ]
          },
          "roleDefinitionIds": [
            "/providers/microsoft.authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
          ],
          "deployment": {
            "properties": {
              "mode": "incremental",
              "template": {
                "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                "contentVersion": "1.0.0.0",
                "parameters": {
                  "storageId": {
                    "type": "string"
                  },
                  "timeInterval": {
                    "type": "string"
                  },
                  "workspaceRegion": {
                    "type": "string"
                  },
                  "workspaceResourceId": {
                    "type": "string"
                  },
                  "networkWatcherRG": {
                    "type": "string"
                  },
                  "networkWatcherName": {
                    "type": "string"
                  },
                  "flowlogName": {
                    "type": "string"
                  },
                  "location": {
                    "type": "string"
                  },
                  "targetResource": {
                    "type": "string"
                  },
                  "retentionDays": {
                    "type": "string"
                  }
                },
                "resources": [
                  {
                    "type": "Microsoft.Resources/deployments",
                    "name": "[concat('flowlogDeployment-', uniqueString(parameters('flowlogName')))]",
                    "apiVersion": "2022-09-01",
                    "resourceGroup": "[parameters('networkWatcherRG')]",
                    "properties": {
                      "mode": "incremental",
                      "parameters": {},
                      "template": {
                        "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                        "contentVersion": "1.0.0.0",
                        "parameters": {},
                        "resources": [
                          {
                            "type": "Microsoft.Network/networkWatchers/flowLogs",
                            "name": "[concat(parameters('networkWatcherName'), '/', parameters('flowlogName'))]",
                            "apiVersion": "2022-09-01",
                            "location": "[parameters('location')]",
                            "properties": {
                              "targetResourceId": "[parameters('targetResource')]",
                              "storageId": "[parameters('storageId')]",
                              "enabled": "true",
                              "flowAnalyticsConfiguration": {
                                "networkWatcherFlowAnalyticsConfiguration": {
                                  "enabled": true,
                                  "workspaceRegion": "[parameters('workspaceRegion')]",
                                  "workspaceResourceId": "[parameters('workspaceResourceId')]",
                                  "trafficAnalyticsInterval": "[parameters('timeInterval')]"
                                }
                              },
                              "retentionPolicy": {
                                "days": "[parameters('retentionDays')]",
                                "enabled": "true"
                              },
                              "format": {
                                "type": "JSON",
                                "version": 2
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                ]
              },
              "parameters": {
                "storageId": {
                  "value": "[parameters('storageId')]"
                },
                "timeInterval": {
                  "value": "[parameters('timeInterval')]"
                },
                "workspaceRegion": {
                  "value": "[parameters('workspaceRegion')]"
                },
                "workspaceResourceId": {
                  "value": "[parameters('workspaceResourceId')]"
                },
                "networkWatcherRG": {
                  "value": "[if(empty(coalesce(field('Microsoft.Network/virtualNetworks/flowLogs'))), parameters('networkWatcherRG'), split(first(field('Microsoft.Network/virtualNetworks/flowLogs[*].id')), '/')[4])]"
                },
                "networkWatcherName": {
                  "value": "[if(empty(coalesce(field('Microsoft.Network/virtualNetworks/flowLogs'))), last(split(parameters('networkWatcherName'), '/')), split(first(field('Microsoft.Network/virtualNetworks/flowLogs[*].id')), '/')[8])]"
                },
                "flowlogName": {
                  "value": "[if(empty(coalesce(field('Microsoft.Network/virtualNetworks/flowLogs'))), concat(take(concat(field('name'), '-', resourceGroup().name), 72), '-', 'flowlog'), split(first(field('Microsoft.Network/virtualNetworks/flowLogs[*].id')), '/')[10])]"
                },
                "location": {
                  "value": "[field('location')]"
                },
                "targetResource": {
                  "value": "[concat(resourceGroup().id, '/providers/Microsoft.Network/virtualNetworks/', field('name'))]"
                },
                "retentionDays": {
                  "value": "[parameters('retentionDays')]"
                }
              }
            }
          }
        }
      }
    },
    "versions": [
      "1.0.0"
    ]
  },
  "id": "/subscriptions/xxxxxxxxx/providers/Microsoft.Authorization/policyDefinitions/891dd95e-5a38-408f-8ba3-863119260d8a",
  "type": "Microsoft.Authorization/policyDefinitions",
  "name": "891dd95e-5a38-408f-8ba3-863119260d8a",
  "systemData": {
    "createdBy": "admin@xxxxxxxxx.onmicrosoft.com",
    "createdByType": "User",
    "createdAt": "2024-11-04T15:17:22.2605624Z",
    "lastModifiedBy": "admin@xxxxxxxxx.onmicrosoft.com",
    "lastModifiedByType": "User",
    "lastModifiedAt": "2024-11-04T15:17:22.2605624Z"
  }
}
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
{
  "properties": {
    "displayName": "フロー ログと Traffic Analytics を有効にするように仮想ネットワークを構成する",
    "policyType": "Custom",
    "mode": "Indexed",
    "description": "Traffic Analytics とフロー ログは、ポリシー作成時に指定された設定を使用して、特定のリージョンでホストされているすべての仮想ネットワークに対して有効にすることができます。仮想ネットワークで既にこれらの機能が有効になっている場合、ポリシーによって現在の設定が上書きされません。Traffic Analytics はクラウド ネットワークのユーザーとアプリケーションのアクティビティを視覚的に把握するためのクラウドベースのソリューションです。",
    "metadata": {
      "category": "Network",
      "createdBy": "3181ca0f-5876-4934-a248-cdcb86ac8ad5",
      "createdOn": "2024-11-04T15:21:37.437467Z",
      "updatedBy": null,
      "updatedOn": null
    },
    "version": "1.0.0",
    "parameters": {
      "effect": {
        "type": "String",
        "metadata": {
          "displayName": "効果",
          "description": "ポリシーの実行を有効または無効にします"
        },
        "allowedValues": [
          "DeployIfNotExists",
          "Disabled"
        ],
        "defaultValue": "DeployIfNotExists"
      },
      "vnetRegion": {
        "type": "String",
        "metadata": {
          "displayName": "仮想ネットワーク リージョン",
          "description": "選択したリージョンの仮想ネットワークに対してのみ構成します。",
          "strongType": "location"
        }
      },
      "storageId": {
        "type": "String",
        "metadata": {
          "displayName": "ストレージ アカウント",
          "description": "フローログの送信先となるストレージ アカウントのリソース ID。デプロイ目的でのみ使用されます。このストレージ アカウントが VNet と同じリージョンにあることを確認してください。",
          "strongType": "Microsoft.Storage/storageAccounts",
          "assignPermissions": true
        }
      },
      "timeInterval": {
        "type": "String",
        "metadata": {
          "displayName": "Traffic Analytics の処理間隔 (分)",
          "description": "Traffic Analytics では選択された頻度で BLOB を処理します。"
        },
        "allowedValues": [
          "10",
          "60"
        ],
        "defaultValue": "60"
      },
      "workspaceResourceId": {
        "type": "String",
        "metadata": {
          "displayName": "ワークスペースのリソース ID",
          "description": "Log Analytics ワークスペースのリソース ID",
          "strongType": "Microsoft.OperationalInsights/workspaces",
          "assignPermissions": true
        }
      },
      "workspaceRegion": {
        "type": "String",
        "metadata": {
          "displayName": "ワークスペースのリージョン",
          "description": "Log Analytics ワークスペースのリージョン",
          "strongType": "location"
        }
      },
      "networkWatcherRG": {
        "type": "String",
        "metadata": {
          "displayName": "Network Watcher RG",
          "description": "flowLog リソースが作成されるリソース グループの名前です。デプロイが必要な場合にのみ使用されます。これは、Network Watcher が配置されるリソース グループです。",
          "strongType": "existingResourceGroups"
        },
        "defaultValue": "NetworkWatcherRG"
      },
      "networkWatcherName": {
        "type": "String",
        "metadata": {
          "displayName": "Network Watcher",
          "description": "flowLog リソースが作成される Network Watcher のリソース ID です。VNet と同じリージョンに属していることを確認してください。",
          "strongType": "Microsoft.Network/networkWatchers"
        }
      },
      "retentionDays": {
        "type": "String",
        "metadata": {
          "displayName": "フローログを保持する日数",
          "description": "ストレージ アカウントにフローログ データが保持される日数。データを無期限に保持し、アイテム保持ポリシーを適用しない場合は、リテンション期間 (日数) を 0 に設定します。"
        },
        "defaultValue": "30"
      }
    },
    "policyRule": {
      "if": {
        "allOf": [
          {
            "field": "type",
            "equals": "Microsoft.Network/virtualNetworks"
          },
          {
            "field": "location",
            "equals": "[parameters('vnetRegion')]"
          }
        ]
      },
      "then": {
        "effect": "[parameters('effect')]",
        "details": {
          "type": "Microsoft.Network/networkWatchers/flowlogs",
          "resourceGroupName": "[if(empty(coalesce(field('Microsoft.Network/virtualNetworks/flowLogs'))), parameters('networkWatcherRG'), split(first(field('Microsoft.Network/virtualNetworks/flowLogs[*].id')), '/')[4])]",
          "name": "[if(empty(coalesce(field('Microsoft.Network/virtualNetworks/flowLogs[*].id'))), 'null/null', concat(split(first(field('Microsoft.Network/virtualNetworks/flowLogs[*].id')), '/')[8], '/', split(first(field('Microsoft.Network/virtualNetworks/flowLogs[*].id')), '/')[10]))]",
          "evaluationDelay": "PT00M",
          "existenceCondition": {
            "anyof": [
              {
                "field": "Microsoft.Network/networkWatchers/flowLogs/enabled",
                "equals": "false"
              },
              {
                "allof": [
                  {
                    "field": "Microsoft.Network/networkWatchers/flowLogs/enabled",
                    "equals": "true"
                  },
                  {
                    "field": "Microsoft.Network/networkWatchers/flowLogs/flowAnalyticsConfiguration.networkWatcherFlowAnalyticsConfiguration.enabled",
                    "equals": "true"
                  },
                  {
                    "field": "Microsoft.Network/networkWatchers/flowLogs/flowAnalyticsConfiguration.networkWatcherFlowAnalyticsConfiguration.trafficAnalyticsInterval",
                    "in": [
                      "10",
                      "60"
                    ]
                  }
                ]
              }
            ]
          },
          "roleDefinitionIds": [
            "/providers/microsoft.authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
          ],
          "deployment": {
            "properties": {
              "mode": "incremental",
              "template": {
                "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                "contentVersion": "1.0.0.0",
                "parameters": {
                  "storageId": {
                    "type": "string"
                  },
                  "timeInterval": {
                    "type": "string"
                  },
                  "workspaceRegion": {
                    "type": "string"
                  },
                  "workspaceResourceId": {
                    "type": "string"
                  },
                  "networkWatcherRG": {
                    "type": "string"
                  },
                  "networkWatcherName": {
                    "type": "string"
                  },
                  "flowlogName": {
                    "type": "string"
                  },
                  "location": {
                    "type": "string"
                  },
                  "targetResource": {
                    "type": "string"
                  },
                  "retentionDays": {
                    "type": "string"
                  }
                },
                "resources": [
                  {
                    "type": "Microsoft.Resources/deployments",
                    "name": "[concat('flowlogDeployment-', uniqueString(parameters('flowlogName')))]",
                    "apiVersion": "2022-09-01",
                    "resourceGroup": "[parameters('networkWatcherRG')]",
                    "properties": {
                      "mode": "incremental",
                      "parameters": {},
                      "template": {
                        "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                        "contentVersion": "1.0.0.0",
                        "parameters": {},
                        "resources": [
                          {
                            "type": "Microsoft.Network/networkWatchers/flowLogs",
                            "name": "[concat(parameters('networkWatcherName'), '/', parameters('flowlogName'))]",
                            "apiVersion": "2022-09-01",
                            "location": "[parameters('location')]",
                            "properties": {
                              "targetResourceId": "[parameters('targetResource')]",
                              "storageId": "[parameters('storageId')]",
                              "enabled": "true",
                              "flowAnalyticsConfiguration": {
                                "networkWatcherFlowAnalyticsConfiguration": {
                                  "enabled": true,
                                  "workspaceRegion": "[parameters('workspaceRegion')]",
                                  "workspaceResourceId": "[parameters('workspaceResourceId')]",
                                  "trafficAnalyticsInterval": "[parameters('timeInterval')]"
                                }
                              },
                              "retentionPolicy": {
                                "days": "[parameters('retentionDays')]",
                                "enabled": "true"
                              },
                              "format": {
                                "type": "JSON",
                                "version": 2
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                ]
              },
              "parameters": {
                "storageId": {
                  "value": "[parameters('storageId')]"
                },
                "timeInterval": {
                  "value": "[parameters('timeInterval')]"
                },
                "workspaceRegion": {
                  "value": "[parameters('workspaceRegion')]"
                },
                "workspaceResourceId": {
                  "value": "[parameters('workspaceResourceId')]"
                },
                "networkWatcherRG": {
                  "value": "[if(empty(coalesce(field('Microsoft.Network/virtualNetworks/flowLogs'))), parameters('networkWatcherRG'), split(first(field('Microsoft.Network/virtualNetworks/flowLogs[*].id')), '/')[4])]"
                },
                "networkWatcherName": {
                  "value": "[if(empty(coalesce(field('Microsoft.Network/virtualNetworks/flowLogs'))), last(split(parameters('networkWatcherName'), '/')), split(first(field('Microsoft.Network/virtualNetworks/flowLogs[*].id')), '/')[8])]"
                },
                "flowlogName": {
                  "value": "[if(empty(coalesce(field('Microsoft.Network/virtualNetworks/flowLogs'))), concat(take(concat(field('name'), '-', resourceGroup().name), 72), '-', 'flowlog'), split(first(field('Microsoft.Network/virtualNetworks/flowLogs[*].id')), '/')[10])]"
                },
                "location": {
                  "value": "[field('location')]"
                },
                "targetResource": {
                  "value": "[concat(resourceGroup().id, '/providers/Microsoft.Network/virtualNetworks/', field('name'))]"
                },
                "retentionDays": {
                  "value": "[parameters('retentionDays')]"
                }
              }
            }
          }
        }
      }
    },
    "versions": [
      "1.0.0"
    ]
  },
  "id": "/subscriptions/28e34c71-ead3-4e00-9027-2fbc94720b9c/providers/Microsoft.Authorization/policyDefinitions/095e257c-a225-46a3-9908-dd682d3ec68d",
  "type": "Microsoft.Authorization/policyDefinitions",
  "name": "095e257c-a225-46a3-9908-dd682d3ec68d",
  "systemData": {
    "createdBy": "admin@xxxxxxxxx.onmicrosoft.com",
    "createdByType": "User",
    "createdAt": "2024-11-04T15:21:37.3341501Z",
    "lastModifiedBy": "admin@xxxxxxxxx.onmicrosoft.com",
    "lastModifiedByType": "User",
    "lastModifiedAt": "2024-11-04T15:21:37.3341501Z"
  }
}

2. 作成した Policy の割り当て

作成した Policy を割り当てました
Policy は割り当てが完了し、環境に反映されるまでに30分程度時間が軽そうなので ゆっくり待ちます

3. リソースの作成

今回は Vnet Flow Log に関するポリシーなので、それぞれの環境に Vnet を作成してみます

パターン evaluationDelay 作成する Vnet
01 デフォルト (PT10M (10 分間)) vnet-policytest01
02 AfterProvisioningSuccess vnet-policytest02
03 PT00M vnet-policytest03

4. Policy 効果の確認

しばらく放置して deployIfNotExists で Vnet Flow Log が作成されたのを確認します

vnet-policytest01 は 14:03 に作成し、フローログが 14:14 に作成されています
およそ10分後に作成されていることが確認できました

image01
vnet-policytest01 のデプロイとポリシー適用:

vnet-policytest02 は 14:04 に作成し、フローログが 14:05 に作成されています
すぐに作成されていることが確認できました

image02
vnet-policytest02 のデプロイとポリシー適用:

vnet-policytest03 は 14:04 に作成し、フローログが 14:14 に作成されています
およそ10分後に作成されていることが確認できました
おそらく PT00M という表記方法を間違えています。勉強しなおしてきます。。

image03
vnet-policytest03 のデプロイとポリシー適用:

まとめ

evaluationDelay というプロパティで遅延時間をカスタムすることができることを確認しました

パターン evaluationDelay 作成する Vnet 遅延時間
01 デフォルト (PT10M (10 分間)) vnet-policytest01 10分
02 AfterProvisioningSuccess vnet-policytest02 0分
03 PT00M vnet-policytest03 10分(おそらく指定方法のミス)

DeployIfNotExists での検証に時間がかかってめんどくさいなーと思っていたので、遅延時間をカスタムできることを知ってよかったです!

参考

共有

Kento
著者
Kento
2020年に新卒で IT 企業に入社. インフラエンジニア(主にクラウド)として活動中