When a template needs configuration that varies by environment/cloud/region or depends on real resource identifiers, do not hardcode endpoints/locations or fabricate subscription/RG paths. Instead:
Example (cloud endpoints):
{
"parameters": {
"cloudEnvironment": {
"type": "string",
"defaultValue": "Public",
"allowedValues": ["Public","USGovernment","China"]
}
},
"variables": {
"cloudConfig": {
"Public": { "graph": "https://graph.microsoft.com" },
"USGovernment": { "graph": "https://graph.microsoft.us" },
"China": { "graph": "https://microsoftgraph.chinacloudapi.cn" }
},
"cloud": "[variables('cloudConfig')[parameters('cloudEnvironment')]]"
},
"resources": [
{
"type": "Microsoft.Logic/workflows",
"properties": {
"definition": {
"parameters": {
"graphEndpoint": {
"type": "String",
"defaultValue": "[variables('cloud').graph]"
}
}
}
}
}
]
}
Example (resource IDs/paths): if a parameter is expected to be a full resource path, document it as a prerequisite and accept it as-is; do not attempt to construct subscription/RG IDs randomly in parameters—use ARM functions like resourceId() inside the template when you need IDs from context.