🦁

NSG のルールを 2 つの NSG でコピーする

2023/04/12に公開

Network Security Group (NSG) のルールを 2 つの NSG でコピーする

特に難しいものでも何でもないのですが、ちゃんと考えるのめんどかったので、ChatGPT にお願いして作ってもらいました。
提示された関数名も PowerShell コマンドに承認されている動詞 に従っているので完璧です!

自分のアカウントでは複数の Azure AD およびそれに紐づいている subscription に権限を持っているため、Connect-AzAccount-t オプションなしで実行すると多要素認証がうんぬんとかでめんどいことになります。
そのため、PowerShell の関数としても $TenantId を引数に取るようにしています。

NSG って region に紐づくリソースなので、東日本と西日本で使いまわしできないんですよね。
単に論理的なデータ (Azure VM みたいに実態がないというか) なので使いまわしできてもいいとは思うんですけどねぇ。
んで、作業するときには両方に適用すればいい話ではあるんですが、まぁそもそも同期用の、というかコピーする PowerShell script を Azure Functions とかで定期的に回す、とかもありかなと。

最初 Mandatory = $true の部分がないものを提示してもらっていたのですが、$TenantId 以外を必須にしてくれ、と言ったらここまで書いてくれました、頭いい。。。

function Copy-NsgRules {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]$SourceNsgName,

        [Parameter(Mandatory = $true)]
        [string]$SourceResourceGroupName,

        [Parameter(Mandatory = $true)]
        [string]$DestinationNsgName,

        [Parameter(Mandatory = $true)]
        [string]$DestinationResourceGroupName,

        [string]$TenantId
    )

    # Validate required parameters
    if (-not $SourceNsgName) { throw "SourceNsgName is required" }
    if (-not $SourceResourceGroupName) { throw "SourceResourceGroupName is required" }
    if (-not $DestinationNsgName) { throw "DestinationNsgName is required" }
    if (-not $DestinationResourceGroupName) { throw "DestinationResourceGroupName is required" }

    # Connect to Azure
    if ($TenantId) { Connect-AzAccount -TenantId $TenantId } else { Connect-AzAccount }

    # Get the NSG rules from the source NSG
    $sourceNsg = Get-AzNetworkSecurityGroup -Name $SourceNsgName -ResourceGroupName $SourceResourceGroupName
    $sourceNsgRules = $sourceNsg.SecurityRules

    # Remove the existing rules from the destination NSG
    $destinationNsg = Get-AzNetworkSecurityGroup -Name $DestinationNsgName -ResourceGroupName $DestinationResourceGroupName
    $destinationNsg.SecurityRules.Clear()

    # Add the rules from the source NSG to the destination NSG
    foreach ($rule in $sourceNsgRules) {
        $destinationNsg.SecurityRules.Add($rule)
    }

    # Update the destination NSG
    Set-AzNetworkSecurityGroup -NetworkSecurityGroup $destinationNsg
}

使い方

オプションの名前も ChatGPT がいい感じに考えてくれたので、使い方も分かりやすいと思います。
追加するというわけではなく、置き換えるので、注意してください。

Copy-NsgRules -SourceNsgName "nsg1" -SourceResourceGroupName "mySourceResourceGroup" -DestinationNsgName "nsg2" -DestinationResourceGroupName "myDestinationResourceGroup" -TenantId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

参考

https://learn.microsoft.com/powershell/scripting/developer/cmdlet/approved-verbs-for-windows-powershell-commands

Microsoft (有志)

Discussion