Was ist das Problem?
Will man eine SQL Datenbank im Azure betreiben und auf diese mittels Azure Data Studio, oder ähnlichem, zugreifen scheitert man an den Firewall Einstellungen des SQL Server im Azure. In der Standardkonfiguration sind keine Freigaben erteilt und somit kein Zugriff auf diese Art möglich.
Eine Art der Lösung
Wir übergeben dem ARM Skript eine Liste von Freigaben als Parameter und diese werden dann automatisch während des Deployments.
parameters.json
In die Parameter Datei kann folgendes eingetragen werden:
"SQLFirewallRuleList": {
"value": [
{
"name": "Company Intern",
"startIpAddress": "195.13.40.75",
"endIpAddress": "195.13.40.77"
},
{
"name": "Company HomeOffice",
"startIpAddress": "195.13.40.70",
"endIpAddress": "195.13.40.70"
}
]
}
Es können weitere Freigaben in diese Liste eingetragen werden. Diese werde dann automatisch beim Deployment mit eingetragen.
template.json
Parameter
In den parameters Knoten wird dieser Punkt hinzugefügt:
"SQLFirewallRuleList": {
"type": "array",
"metadata": {
"description": "A list of firewall rules for the SQL server."
}
}
Dieser Eintrag erlaubt es die Liste der Freigaben von außen in das Template zu übergeben.
Firewall Loop
In das oberste resources Element wird folgendes hinzugefügt:
{
"type": "Microsoft.Sql/servers/firewallrules",
"name": "[concat(variables('SQLServerName'), '/', parameters('SQLFirewallRuleList')[copyIndex()].name)]",
"apiVersion": "2014-04-01-preview",
"location": "[resourceGroup().location]",
"properties": {
"startIpAddress": "[parameters('SQLFirewallRuleList')[copyIndex()].startIpAddress]",
"endIpAddress": "[parameters('SQLFirewallRuleList')[copyIndex()].endIpAddress]"
},
"resources": [],
"dependsOn": [
"[concat('Microsoft.Sql/servers/', variables('SQLServerName'))]"
],
"copy": {
"name": "FirewallLoop",
"count": "[length(parameters('SQLFirewallRuleList'))]"
}
}
Zu Beachten ist, dass die Variable SQLServerName vorhanden sein muss oder durch einen entsprechenden Wert ersetzt werden muss.
Die copy Anweisung sorgt dafür, dass dieser Block für jeden Eintrag in der Liste SQLFirewallRuleList wiederholt wird.
"Allow access to Azure services"
Möchte man auch die Option "Allow access to Azure services" per ARM Skript setzen ist der folgende Block im obersten resources Element einzufügen:
{
"name": "[concat(variables('SQLServerName'),'/', 'AllowAllWindowsAzureIps')]",
"type": "Microsoft.Sql/servers/firewallrules",
"location": "[resourceGroup().location]",
"apiVersion": "2014-04-01-preview",
"dependsOn": [
"[resourceId('Microsoft.Sql/servers', variables('SQLServerName'))]"
],
"properties": {
"startIpAddress": "0.0.0.0",
"endIpAddress": "0.0.0.0"
}
}
Das Geheimnis hier ist der Name AllowAllWindowsAzureIps sowie das Setzen der IP Adressen auf 0.0.0.0.
Info: Man kann natürlich diese Freigabe auch in die Liste des Parameters
SQLFirewallRuleListeintragen, was zum gleichen Ergebnis führt