Доступ модулей Runbook автоматизации Azure к базе данных SQL Azure

Я пытаюсь запустить некоторые операторы 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 », флажок, который вы видите на снимке экрана ниже ( Это позволит использовать все ресурсы в Azure, а не только в рамках моей подписки )

enter image description here

2
задан 29 March 2017 в 13:27
2 ответа

В примере, представленном на сайте 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>
2
ответ дан 3 December 2019 в 11:29

Имея ту же проблему и принимая данные Сэма, я развил его предложение со следующей реализацией:

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
}
0
ответ дан 3 December 2019 в 11:29

Теги

Похожие вопросы