Я пытаюсь запустить несколько операторов SQL для своей базы данных SQL Azure с помощью модуля Runbook службы автоматизации Azure. Во всех примерах я могу найти https://docs.microsoft.com они используют учетные данные автоматизации и строку подключения, как в приведенном ниже коде:
$SqlCredential = Get-AutomationPSCredential -Name $SqlCredentialAsset
# Get the username and password from the SQL Credential
$SqlUsername = $SqlCredential.UserName
$SqlPass = $SqlCredential.GetNetworkCredential().Password
# Define the connection to the SQL Database
$Conn = New-Object System.Data.SqlClient.SqlConnection("Server=tcp:$SqlServer,$SqlServerPort;Database=$Database;User ID=$SqlUsername;Password=$SqlPass;Trusted_Connection=False;Encrypt=True;")
Достаточно просто, но запрос будет остановлен в моем брандмауэре Azure SQL, поскольку я не знаю, с какого IP-адреса он будет поступать!
Как я могу разрешить моему модулю Runbook PowerShell аутентифицировать и выполнять команды SQL в базе данных SQL Azure без включения флажка «Разрешить доступ к службам Azure», который вы видите на снимке экрана ниже (Это позволит использовать все ресурсы на лазурном сервере, а не только в рамках моей подписки.)
В примере, представленном на сайте MS, предполагается, что у вас включен параметр «Разрешить доступ к службам Azure». Если вы не хотите этого делать, вам нужно будет либо настроить свой сценарий для определения IP-адреса при его запуске, и добавить его в правило брандмауэра SQL как часть сценария, либо вам нужно будет посмотреть, как использовать работник гибридной автоматизации который вы можете разместить в своей виртуальной сети и назначить статический IP-адрес.
Если вы хотите добавить свой IP-адрес в скрипт, вы можете сделать что-то вроде:
$response = Invoke-WebRequest ifconfig.co/ip
$ip = $response.Content.Trim()
New-AzureSqlDatabaseServerFirewallRule -StartIPAddress $ip -EndIPAddress $ip -RuleName <Name of Rule> -ServerName <your database server name here>
Имея ту же проблему и принимая во внимание мнение Сэма, я разработал его предложение со следующей реализацией:
param(
[parameter(Mandatory=$true)]
[string] $resourceGroupName,
[parameter(Mandatory=$true)]
[string] $azureRunAsConnectionName,
[parameter(Mandatory=$true)]
[string] $serverName,
[parameter(Mandatory=$true)]
[string] $firewallRuleName
)
filter timestamp {"[$(Get-Date -Format G)]: $_"}
$runAsConnectionProfile = Get-AutomationConnection -Name $azureRunAsConnectionName
Add-AzureRmAccount -ServicePrincipal -TenantId $runAsConnectionProfile.TenantId `
-ApplicationId $runAsConnectionProfile.ApplicationId `
-CertificateThumbprint $runAsConnectionProfile.CertificateThumbprint | Out-Null
Write-Output "Authenticated with Automation Run As Account." | timestamp
$ipResponse = Invoke-WebRequest ifconfig.co/ip -UseBasicParsing
$ip = $ipResponse.Content.Trim()
Write-Output "Automation IP Address: $ip" | timestamp
Write-Output "Check for Firewall Rule For Server $serverName" | timestamp
$fwResponse = Get-AzureRmSqlServerFirewallRule -ResourceGroupName $resourceGroupName `
-ServerName $serverName -FirewallRuleName $firewallRuleName `
-ErrorAction SilentlyContinue
if ($fwResponse -ne $null -and $fwResponse.StartIpAddress -ne $ip)
{
$removeResponse = Remove-AzureRmSqlServerFirewallRule -ResourceGroupName $resourceGroupName `
-ServerName $serverName -FirewallRuleName $firewallRuleName
if ($removeResponse -ne $null)
{
Write-Output "Removed FW Rule For IP Address: $($removeResponse.StartIpAddress)" | timestamp
}
else
{
throw "Unable to Remove FW Rule For IP Address: $($removeResponse.StartIpAddress)" | timestamp
}
}
elseif ($fwResponse -ne $null)
{
Write-Output "FW Rule Already in Place for IP Address: $($fwResponse.StartIpAddress)" | timestamp
return
}
Write-Output "Adding Firewall Rule For IP Address $ip" | timestamp
$newResponse = New-AzureRmSqlServerFirewallRule -ResourceGroupName $resourceGroupName `
-ServerName $serverName -FirewallRuleName $firewallRuleName `
-StartIpAddress $ip -EndIpAddress $ip
if ($newResponse -ne $null)
{
Write-Output "Added FW Rule For IP Address: $($newResponse.StartIpAddress)" | timestamp
}
else
{
throw "Unable to Add FW Rule For IP Address: $($removeResponse.StartIpAddress)" | timestamp
}