Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@justinyoo
Created November 17, 2017 00:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save justinyoo/505379a4df1f071ded762f892d3e3f91 to your computer and use it in GitHub Desktop.
Save justinyoo/505379a4df1f071ded762f892d3e3f91 to your computer and use it in GitHub Desktop.
Outbound IP Registration to Azure SQL Using Azure Functions
[FunctionName("UpdateFirewallRulesHttpTrigger")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = "firewall/rules")]HttpRequestMessage req,
TraceWriter log)
{
...
log.Info($"Firewall rules on database servers in {resourceGroupName} are updating...");
...
var tasks = new List<Task>();
var servers = await azure.SqlServers
.ListByResourceGroupAsync(resourceGroupName)
.ConfigureAwait(false);
foreach (var server in servers)
{
var registeredIps = server.FirewallRules
.List()
.ToDictionary(p => p.Name, p => p.StartIPAddress);
var ipsToExclude = registeredIps.Where(p => !outboundIps.Contains(p.Value))
.Select(p => p.Key)
.ToList();
var IpsToInclude = outboundIps.Where(p => !registeredIps.ContainsValue(p))
.ToList();
var tasksToExclude = ipsToExclude.Select(ip => server.FirewallRules
.DeleteAsync(ip));
var tasksToInclude = IpsToInclude.Select(ip => server.FirewallRules
.Define($"webapp-{ip.Replace(".", "-")}")
.WithIPAddressRange(ip, ip)
.CreateAsync());
tasks.AddRange(tasksToExclude);
tasks.AddRange(tasksToInclude);
}
await Task.WhenAll(tasks).ConfigureAwait(false);
log.Info($"Firewall rules on database servers in {resourceGroupName} have been updated.");
return req.CreateResponse(HttpStatusCode.OK);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment