Azure / Azure/arm-ttk

extensionResourceId from Bicep flagged in ARM-TTK

Open
#765 0 comments 0 reactions 0 assignees View on GitHub
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.