extensionResourceId from Bicep flagged in ARM-TTK
- Dominant language
- PowerShell
- Stars
- 468
- Forks
- 208
- PR merge metrics
- No merged PRs in 30d
Description
> Bicep generates code which gets rejected by ARM-TTK; unclear how to work around that.
In a Bicep template, I'm using the `getSecret` function to [fetch a secret from an existing KeyVault](https://github.com/microsoft/metered-billing-accelerator/blob/main/managed-app/src/mainTemplate.bicep#L47-L62), to get [KeyVault access](https://learn.microsoft.com/en-us/azure/azure-resource-manager/managed-applications/key-vault-access), and pass it as parameter to a nested template:
```bicep
resource publisherKeyVaultWithBootstrapSecret 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
name: meteringConfiguration.publisherVault.vaultName
scope: resourceGroup(meteringConfiguration.publisherVault.publisherSubscription, meteringConfiguration.publisherVault.vaultResourceGroupName)
}
module setupMeteredBillingConfigurationModule './nestedtemplates/meteredBillingDependencies.bicep' = {
name: '...'
params: {
bootstrapSecretValue: publisherKeyVaultWithBootstrapSecret.getSecret(meteringConfiguration.publisherVault.bootstrapSecretName)
}
}
```
When Bicep compiles this, it results in the following ARM template, which uses the `extensionResourceId` function to reference the KeyVault:
```json
"parameters": {
"bootstrapSecretValue": {
"reference": {
"keyVault": {
"id": "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', variables('meteringConfiguration').publisherVault.publisherSubscription, variables('meteringConfiguration').publisherVault.vaultResourceGroupName), 'Microsoft.KeyVault/vaults', variables('meteringConfiguration').publisherVault.vaultName)]"
},
"secretName": "[variables('meteringConfiguration').publisherVault.bootstrapSecretName]"
}
}
```
Unfortunately, this Bicep-generated code is flagged by ARM-TTK validation tool as not OK, because it calls `concat()` or `format()` within `extensionResourceId()`. This regex in ARM TTK flags it as an error:
https://github.com/Azure/arm-ttk/blob/master/arm-ttk/testcases/deploymentTemplate/ResourceIds-should-not-contain.test.ps1#L31
As a workaround, I can replace
```arm
extensionResourceId(
format('/subscriptions/{0}/resourceGroups/{1}',
variables('meteringConfiguration').publisherVault.publisherSubscription,
variables('meteringConfiguration').publisherVault.vaultResourceGroupName
),
'Microsoft.KeyVault/vaults',
variables('meteringConfiguration').publisherVault.vaultName
)
```
with
```arm
resourceId(
variables('meteringConfiguration').publisherVault.publisherSubscription,
variables('meteringConfiguration').publisherVault.vaultResourceGroupName,
'Microsoft.KeyVault/vaults',
variables('meteringConfiguration').publisherVault.vaultName
)
```
So in JSON:
```json
{
"old": "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', parameters('meteringConfiguration').publisherVault.publisherSubscription, parameters('meteringConfiguration').publisherVault.vaultResourceGroupName), 'Microsoft.KeyVault/vaults', parameters('meteringConfiguration').publisherVault.vaultName)]"
"new": "[resourceId(variables('meteringConfiguration').publisherVault.publisherSubscription, variables('meteringConfiguration').publisherVault.vaultResourceGroupName, 'Microsoft.KeyVault/vaults', variables('meteringConfiguration').publisherVault.vaultName)]"
}
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.