Powershell을 이용한 복수의 Azure NSG 정책 추가 또는 삭제하기

Azure에서는 CloudShell을 제공합니다. CloudShell은 Linux 기반으로 Bash와 PowerShell 2종류를 제공합니다. 그래서 사용자는 리소스를 GUI로도 구성할 수 있지만, CLI로도 구성할 수 있습니다.

이번에는 Powershell을 이용해서 여러개의 NetworkSecurityGroup(NSG, 네트워크보안그룹)에 정책을 추가하고, 제거하는 스크립트를 만들어 봅시다.

참고URL: https://docs.microsoft.com/ko-kr/powershell/module/az.network/?view=azps-2.4.0#networking

# 받아야할 파라메터 값이 많다. 이중에 실제로 필요한 것은 크게 없다. 쫄지 말자.
Param (
    # 전체를 설정할 것이라면 그냥 두면되고, 아니면 필요한 NSG 이름을 입력하도록 한다.
    [Parameter(Mandatory=$false)] [string]$NSGName = '*',
    # 정책을 추가할지 아니면, 삭제할지 입력한다.
    [Parameter(Mandatory=$true)] [string]$RuleSet,
    # 정책의 이름
    [Parameter(Mandatory=$true)] [string]$RuleName,
    # 정책 추가시 Access 유형을 입력한다. Allow 또는 Deny
    [Parameter(Mandatory=$false)] [string]$Access = 'Allow',
    # 정책의 프로토콜 Tcp, Udp, * 이다.
    [Parameter(Mandatory=$false)] [string]$Protocol = '*',
    # 정책이 어디로 입력될지 선택한다. Inbound 또는 Outbound
    [Parameter(Mandatory=$false)] [string]$Bound = 'Inbound',
    # 정책의 가중치를 설정한다.
    [Parameter(Mandatory=$true)] [Int32]$Priority,
    # 출발지의 IP제한 필요시 CIDR로 입력한다.
    [Parameter(Mandatory=$false)] [string]$SourceAddrPrefix = '*',
    # 출발지 Port 제한 필요시 0-65535 혹은 범위로 입력한다.
    [Parameter(Mandatory=$false)] [string]$SourPRange = '*',
    # 목적지 IP 제한 필요시 CIDR로 입력한다.
    [Parameter(Mandatory=$false)] [string]$DesAddrPrefix = '*',
    # 목적지 Port 제한 필요시 0-65535 혹은 범위로 입력한다.
    [Parameter(Mandatory=$true)] [string]$DesPRange
)

# AzNSGs 변수에 현재 구독에 존재하는 모든 NSG를 가져온다. 만약 -NSGName 파라메터로 입력한 경우에는 해당 NSG만 선택한다.
$AzNSGs = Get-AzNetworkSecurityGroup | Where-Object {$_.Name -like $NSGName}
# AzNSG 변수를 초기화 한다.
$AzNSG = @()

# RuleSet에 Add라고 적혀있으면 정책 추가로 진행하고, Add 제외한 다른 문구 입력시 삭제로 진행
if($RuleSet -eq "Add") {
    # 목록이 여러개일 경우 순차적으로 #AzNSG에 적재하여 명령 수행
    foreach ($AzNSG in $AzNSGs) {
        try{
            # 룰 추가 명령어
            $AzNSG | Add-AzNetworkSecurityRuleConfig `
            # 앞서 받은 파라메터값 혹은 기본값을 대입해서 정책 설정 진행
            -Name $RuleName `
            -Access $Access `
            -Protocol $Protocol `
            -Direction $Bound `
            -Priority $Priority `
            -SourceAddressPrefix $SourceAddrPrefix `
            -SourcePortRange $SourPRange `
            -DestinationAddressPrefix $DesAddrPrefix `
            -DestinationPortRange $DesPRange
            # 정책 추가 후 최종 Update 진행
            $AzNSG | Set-AzNetworkSecurityGroup
        }
        # 실패하면 메시지 뿌리기
        catch
        {
            echo $('Line ' + $_.InvocationInfo.ScriptLineNumber + ' : ' + $_.Exception.Message)
        }
    }
}
else {
    foreach ($AzNSG in $AzNSGs) {
        try {
            # 룰 삭제 명령어
            $AzNSG | Remove-AzNetworkSecurityRuleConfig `
            # 앞에서 받은 값은 크게 필요 없고, 정책 이름만 있으면 수행
            -Name $RuleName
            # 정책 삭제 후 최종 Update 진행
            $AzNSG | Set-AzNetworkSecurityGroup
        }
        catch
        {
            echo $('Line ' + $_.InvocationInfo.ScriptLineNumber + ' : ' + $_.Exception.Message)
        }
    }
}