I got through this with local-exec.
provisioner "local-exec" {
command = <<COMMAND
az login --service-principal --username #{APP_ID}# --password #{SP_PASSWORD}# --tenant #{TENANT_ID}#
az webapp config access-restriction add --resource-group ${azurerm_resource_group.example.name} --name ${azurerm_app_service.example.name} --rule-name developers --action Allow --ip-address 130.220.0.0/27 --priority 200
COMMAND
interpreter = ["PowerShell", "-Command"]
}
Unfortunately I had to create another service principal for this purpose as I didn't want to reset the one used by Azure DevOps (but you can give it a try and reuse this one).
I used these commands:
az ad sp create-for-rbac --name sp-for-cli
az role assignment create --assignee APP_ID --role Contributor
As next I declared variables APP_ID, SP_PASSWORD and TENANT_ID on my release pipeline with values given by command above.
As last step I added token replace step:
steps:
- task: qetza.replacetokens.replacetokens-task.replacetokens@3
displayName: 'Replace tokens in main.tf'
inputs:
rootDirectory: '$(System.DefaultWorkingDirectory)/terraform/drop'
targetFiles: main.tf
Now when I run az webapp config access-restriction show --resource-group example-resources --name example-app-service-for-cli I get:
"ipSecurityRestrictions": [
{
"action": "Allow",
"additional_properties": {},
"description": null,
"ip_address": "130.220.0.0/27",
"name": "developers",
"priority": 200,
"subnet_mask": null,
"subnet_traffic_tag": null,
"tag": "Default",
"vnet_subnet_resource_id": null,
"vnet_traffic_tag": null
},
The whole code you can find here.