Azure CLI로 Azure 리소스를 태그로 검색해서 NSG 룰 추가

Azure 에서 사용하는 모든 리소스에 태그를 걸어 둘 수 있다. Key=value 쌍의 태그를 걸어놓고 사용할 수 있는데 Azure Portal에서는 태그 메뉴에서 추가할 수 있다.

이 태그를 잘 정의해 놓으면 스크립트에서 태그로 검색해서 관련된 리소스만 가져와서 특정 작업을 할 수 있다. 여기에 소개된스크립트에서는 ServerType=GameServer 태그가 들어 있는 Network Security Group을 찾아서 방화벽 룰을 추가한다. Azure CLI 로 작성되었다.

#!/bin/bash

# tag query 
tagQuery=ServerType=GameServer

# new rule
ruleName=http
description=http-inbound
access=Allow
protocol=Tcp
direction=Inbound
priority=102
sourceAddressPrefix=*
sourcePortRange=*
destinationAddressPrefix=*
destinationPortRange=443

az resource list --tag $tagQuery --query "[].{Name: name,Group: resourceGroup}" -o tsv | 
while read -r name resourceGroup; do
    printf "Add new rule"
    az network nsg rule create -g $resourceGroup --nsg-name $name \
    --name $ruleName \
    --description $description \
    --access $access \
    --protocol $protocol  \
    --direction $direction \
    --priority $priority \
    --source-address-prefix "$sourceAddressPrefix" \
    --source-port-range "$sourcePortRange" \
    --destination-port-range "$destinationPortRange" \
    --destination-address-prefix "$destinationAddressPrefix"
    

    printf "NSG: $name, ResourceGroup: $resourceGroup"
    az network nsg show -g $resourceGroup -n $name --query 'securityRules[].{Name:name,Desc:description,Access:access,Direction:direction,DestPortRange:destinationPortRange,DestAddrPrefix:destinationAddressPrefix,SrcPortRange:sourcePortRange,SrcAddrPrefix:sourceAddressPrefix}' -o table
done

실행결과

$ ./add-nsg-rule.sh
{
  "access": "Allow",
  "description": "http-inbound",
  "destinationAddressPrefix": "*",
  "destinationAddressPrefixes": [],
  "destinationApplicationSecurityGroups": null,
  "destinationPortRange": "443",
  "destinationPortRanges": [],
  "direction": "Inbound",
  "etag": "W/\"123427a1-855a-441b-8a79-4950326c043c\"",
  "id": "/subscriptions/12345bbb-cd59-41dc-86b7-2e239d536c04/resourceGroups/KaliGroup/providers/Microsoft.Network/networkSecurityGroups/KaliVM-nsg/securityRules/http",
  "name": "http",
  "priority": 102,
  "protocol": "Tcp",
  "provisioningState": "Succeeded",
  "resourceGroup": "KaliGroup",
  "sourceAddressPrefix": "*",
  "sourceAddressPrefixes": [],
  "sourceApplicationSecurityGroups": null,
  "sourcePortRange": "*",
  "sourcePortRanges": []
}
NSG: KaliVM-nsg, ResourceGroup: Kali
GroupName               Access    Direction      DestPortRange  DestAddrPrefix    SrcPortRange    SrcAddrPrefix    Desc
-----------------  --------  -----------  ---------------  ----------------  --------------  ---------------  ------------
default-allow-ssh  Allow     Inbound                   22  *                 *               *
Port_3389          Allow     Inbound                 3389  *                 *               *
http               Allow     Inbound                  443  *                 *               *                http-inbound