【Azure環(huán)境】使用ARM Template部署Policy模板時候報錯不支持filed函數(shù): The template function 'field' is not valid.
問題描述
Azure Policy可以幫助治理Azure上的資源, 也可以通過ARM 模板部署。只是當(dāng)Policy中包含了field 函數(shù)的時候,會出現(xiàn)錯誤!
"parameters": { "keyVaultName": { "value": "[field('name')]" } }
錯誤信息:
Unable to process template language expressions for resource '/subscriptions/xx-x-x-xxx/providers/Microsoft.Authorization/policyDefinitions/xxxxxxxx' at line '38' and column '9'. 'The template function 'field' is not valid. Please see https://aka.ms/arm-functions for usage details.'. Click here for details
部署錯誤截圖:

但是Policy Rule中又必須使用field 方法,如果通過ARM Template來部署Policy,是否又辦法使得ARM模板部署成功呢?
問題解答
當(dāng)然可以解決這個問題。 為 [field('name')] 添加一個嵌套的中括號 [ 就可以解決這個問題。
在ARM Template的正確使用方式為:
"KeyVaultName": { "value": "[[field('name')]" }
這樣做的原理是:
- field() 函數(shù)是 Azure Policy 的專用函數(shù),用于引用正在評估的資源的屬性(如名稱、類型、標(biāo)簽等)。
- 在 ARM 模板中,field() 并不是一個有效的函數(shù),因此直接寫 [field('name')] 會導(dǎo)致部署失敗,提示 “The template function 'field' is not valid”。
為什么 [[field('name')] 能生效呢?
- 如果寫的是
[[field('name')],ARM 模板引擎會識別這是一個嵌套表達式,不會嘗試解析它,而是將其原樣傳遞給 Azure Policy 引擎。 - Azure Policy 引擎在策略評估階段才會解析
field(),此時它是合法的。
參考資料
GitHub ARM Template Example : https://github.com/Azure/Azure-Lighthouse-samples/blob/master/templates/policy-enforce-keyvault-monitoring/enforceAzureMonitoredKeyVault.json
當(dāng)在復(fù)雜的環(huán)境中面臨問題,格物之道需:濁而靜之徐清,安以動之徐生。 云中,恰是如此!

浙公網(wǎng)安備 33010602011771號