본문 바로가기
Azure & Windows/PowerShell

Try Azure PowerShell for fun (for 2018 Global Azure Boot Camp)

by 강철 벼룩 2018. 4. 21.

Azure PowerShell 맛보기 실습 가이드

<실무에서 바로쓰는 파워셸> 저자가 2018년 4월 21일 Global Azure Boot Camp 발표를 위해 전날 밤새가며 만든 실습 가이드 입니다.
효율적인 실습을 위해 이 글의 PowerShell 구문을 직접 입력해 실행해보기 바랍니다. 명령 구문 복사는 막아 놓았습니다.

실습하는 방법.

1. 아래의 다운로드 파일을 먼저 내려받아 C:\AzureBC라는 폴더에 저장 해 놓습니다.
2. PowerShell ISE를 관리자 권한으로 실행합니다.
3. Azure 구독을 준비합니다.
4. 모든 PowerShell 구문을 ISE 편집 창에 직접 입력하고, 구문단위로 실행합니다(F8, 선택 실행).
5. Azure 포털에서 결과를 확인합니다. 구문을 수행한 후 바로 확인이 안될 수 있습니다. 그 이유는 해당 구문 다음의 몇 가지 구문이 실행되어야 비로소 해당 작업이 완성되는 경우입니다.
6. 가급적 주석을 달도록 노력해보세요. 주석 표시는 해당 구문 앞에 #을 붙이면 됩니다.

1. Azure 구독 연결 및 리소스 관리

1.1 Azure PowerShell을 사용해 Azure 구독 연결하기

1. PowerShell ISE를 관리자 권한으로 실행합니다.




2. PowerShell ISE의 콘솔 창에서 다음 명령을 입력해 Azure PowerShell을 설치합니다. (인터넷 연결 필수)


Install-Module -Name AzureRm


3. PowerShell ISE의 콘솔 창에서 다음 명령을 입력하고 실행한다.


Connect-AzureRmAccount


4. PowerShell ISE의 콘솔 창에서 다음 명령을 입력해 현재 Azure 구독의 정보를 확인합니다.


Get-AzureRmSubscription


5. 여러개의 구독이 있다면, 현재 세션에서 사용하려는 구독을 선택합니다.


Select-AzureRmSubscription -SubscriptionId 'Your SubscriptionId'


6. PowerShell ISE의 콘솔 창에서 다음 명령을 입력해 리소스 공급자 정보를 확인합니다.


Get-AzureRmResourceProvider


1.2 Azure PowerShell을 사용해 Azure 리소스와 리소스 그룹 관리하기

1. 첫 번째 리소스 그룹을 만듭니다. 자신의 구독을 선택하고, 위치는 EastUS로 합니다.


$rg1=New-AzureRmResourceGroup -Name AzureBCKorRG01 -Location EastUS


2. 뒤에서 사용하기 위해 리소스 그룹의 위치를 변수에 저장합니다.


$locName = (Get-AzureRmResourceGroup -Name $rg1.ResourceGroupName).Location


3. 첫 번째 리소스 그룹과 동일한 위치에 두 번째 리소스 그룹(AzureBCKorRG02)을 만듭니다.


$rg2 = New-AzureRmResourceGroup -Name AzureBCKorRG02 -Location $locName


4. Azure 리소스의 예로 라우트 테이블(AzureBCKor01-rt)을 하나 만듭니다.


$resName = "AzureBCKor01-rt"


New-AzureRmRouteTable -ResourceGroupName $rg1.ResourceGroupName -Location $locName -Name $resName


5. 앞서 만든 리소스를 나타내는 개체를 조회해서 변수($res)에 저장합니다.


$res = Get-AzureRmResource -ResourceName $resName -ResourceGroupName $rg1.ResourceGroupName


6. 라우트 테이블 리소스($res)를 새로운 리소스 그룹($rg2.ResourceGroupName)으로 이동합니다.


Move-AzureRmResource -DestinationResourceGroupName $rg2.ResourceGroupName -ResourceId $res.ResourceId


7. 새로운 리소스 그룹에서 이동한 리소스를 확인합니다.


Get-AzureRmResource | Where-Object ResourceGroupName -eq $rg2.ResourceGroupName


*요약
AzureBCKorRG01와 AzureBCKorRG02라는 두 개의 리소스 그룹을 만들었으며, AzureBCKorRG01에 네트워크 리소스 중 하나인 AzureBCKor01-rt라는 라우터 테이블을 만들었다가, AzureBCKorRG02라는 리소스 그룹으로 이동했습니다.


2. Azure 가상 네트워킹과 가상 머신

2.1 2개의 가상 네트워크와 가상 네트워크 피어링 구성하기.

1. 첫 번째 가상 네트워크에 추가할 서브넷을 2개 만듭니다. 서브넷의 이름은 각각 VNet1SubNet1와 VNet1SubNet2 주소 공간은 각각 10.11.0.0/24와 10.11.1.0/24로 합니다.


$subnet1=New-AzureRmVirtualNetworkSubnetConfig -Name 'VNet1SubNet1' -AddressPrefix '10.11.0.0/24'

$subnet2=New-AzureRmVirtualNetworkSubnetConfig -Name 'VNet1SubNet2' -AddressPrefix '10.11.1.0/24'


2. 주소 공간이 10.11.0.0/16인 AzureBCKor01-VNet1이라는 이름의 첫 번째 가상 네트워크를 만들고 이 리소스에 대한 참조를 $vnet1 변수에 저장합니다.


$vnet1 = New-AzureRmVirtualNetwork -ResourceGroupName $rg1.ResourceGroupName -Name 'AzureBCKor01-VNet1' -AddressPrefix '10.11.0.0/16' -Location $locName -Subnet $subnet1,$subnet2


3. 가상 네트워크의 구성을 업데이트 합니다. 다음 명령을 수행하고 Azure 포털에서 확인해봅니다.


Set-AzureRmVirtualNetwork -VirtualNetwork $vnet1


4. 두 번째 가상 네트워크에 추가할 서브넷을 1개 만듭니다. 서브넷의 이름은 VNet2SubNet1 주소 공간은 10.10.0.0/24로 합니다.


$subnet3=New-AzureRmVirtualNetworkSubnetConfig -Name 'VNet2SubNet1' -AddressPrefix '10.10.0.0/24'


5. 주소 공간이 10.10.0.0/16인 AzureBCKor01-VNet2라는 이름의 두 번째 가상 네트워크를 만들고 이 리소스에 대한 참조를 $vnet2 변수에 저장합니다.


$vnet2 = New-AzureRmVirtualNetwork -ResourceGroupName $rg1.ResourceGroupName -Name 'AzureBCKor01-VNet2' -AddressPrefix '10.10.0.0/16' -Location $locName -Subnet $subnet3


6. 가상 네트워크의 구성을 업데이트 합니다.


Set-AzureRmVirtualNetwork -VirtualNetwork $vnet2

2.2 AzureBCKor01-vnet1 가상 네트워크를 사용하는 가상 머신 만들기

1. 가상 머신을 만드는데 필요한 기본 변수를 선언합니다.


$rgName  = 'AzureBCKorRG01'               #리소스 그룹 이름
$vmName  = 'AzureBCKorVM1'                #가상머신 이름
$pubName = 'MicrosoftWindowsServer'      #운영체제 제조사
$offerName = 'WindowsServer'                #운영체제 타입
$skuName = '2016-Datacenter'                #운영체제 버전
$vmSize  = 'Standard_D1_v2'                    #VM 규모
$subnetName = 'VNet1SubNet1'                #서브넷 이름
$nsgName    = "$vmName-nsg"                 #네트워크 보안그룹
$pipName    = "$vmName-pip"                 #공인 IP 이름
$nicName    = "$vmName-nic"                 #네트워크카드 이름
$osDiskName = "$vmName-osdisk"            #운영체제 디스크이름
$osDiskSize = 128                                   #운영체제 디스크 크기
$osDiskType = 'Standard_LRS'                    #운영체제 디스크 복제


2. AzureBCKor01-vnet1 가상 네트워크의 첫번째 서브넷 ID를 변수($subnetid1)에 저장합니다.


$subnetid1 = (Get-AzureRmVirtualNetworkSubnetConfig -Name $subnetName -VirtualNetwork $vnet1).Id


3. 진단 저장소 계정(azurebckor[Your Name Initial]sa)을 만듭니다. 저장소 이름은 반드시 소문자로 합니다.


$storageAccount = New-AzureRmStorageAccount -Name azurebckor[Your Name Initial]sa -ResourceGroupName $rgName -SkuName Standard_LRS -Location $locName -Kind Storage


4. 관리자 자격증명을 만듭니다.


$adminUsername = 'azureman'
$adminPassword = 'Pa55w.rd1234'
$adminCreds = New-Object PSCredential $adminUsername, ($adminPassword | ConvertTo-SecureString -AsPlainText -Force)


5. 네트워크 보안 그룹에서 먼저 RDP를 허용하는 규칙을 만듭니다.


$nsgRuleRDP = New-AzureRmNetworkSecurityRuleConfig -Name 'default-allow-rdp' -Protocol Tcp -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 3389 -Access Allow


6. 앞서 만든 규칙을 적용한 네트워크 보안 그룹을 만듭니다.


$nsg = New-AzureRmNetworkSecurityGroup -ResourceGroupName $rgName -Location $locName -Name $nsgName -SecurityRules $nsgRuleRDP


7. 공인 IP를 만듭니다.


$pip = New-AzureRmPublicIpAddress -Name $pipName -ResourceGroupName $rgName -Location $locName -AllocationMethod Dynamic


8. 공인 IP를 사용하는 NIC를 만듭니다.


$nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $rgName -Location $locName -SubnetId $subnetid1 -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id


9. VM 기본 구성을 설정합니다.


$vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize


10. 네트워크 카드를 설정합니다.


Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $nic.Id


11. VM 부트 진단을 활성화 합니다.


Set-AzureRmVMBootDiagnostics -Enable -ResourceGroupName $rgName -VM $vmConfig -StorageAccountName $storageAccount[0].StorageAccountName


12. VM 운영체제와 원본 이미지, OS 디스크를 설정합니다.


Set-AzureRmVMOperatingSystem -VM $vmConfig -Windows -ComputerName $vmName -Credential $adminCreds

Set-AzureRmVMSourceImage -VM $vmConfig -PublisherName $pubName -Offer $offerName -Skus $skuName -Version 'latest'

Set-AzureRmVMOSDisk -VM $vmConfig -Name $osDiskName -DiskSizeInGB $osDiskSize -StorageAccountType $osDiskType -CreateOption fromImage


13. 지금까지의 설정을 바탕으로 VM을 만듭니다.


New-AzureRmVM -ResourceGroupName $rgName -Location $locName -VM $vmConfig


2.3 AzureBCKor01-vnet2 가상 네트워크를 사용하는 가상 머신 만들기

1. 가상 머신을 만드는데 필요한 기본 변수를 선언합니다.

$rgName  = 'AzureBCKorRG01'        #리소스 그룹 이름
$vmName  = 'AzureBCKorVM2'        #가상머신 이름
$subnetName = 'VNet2SubNet1'        #서브넷 이름
$nsgName    = "$vmName-nsg"         #네트워크 보안그룹
$pipName    = "$vmName-pip"         #공인 IP 이름
$nicName    = "$vmName-nic"         #네트워크카드 이름
$osDiskName = "$vmName-osdisk"    #운영체제 디스크이름


2. AzureBCKor01-vnet2 가상 네트워크의 첫번째 서브넷 ID를 변수($subnetid2)에 저장합니다.


$subnetid2 = (Get-AzureRmVirtualNetworkSubnetConfig -Name $subnetName -VirtualNetwork $vnet2).Id


3. 2.2의 6~7까지를 다시 수행합니다.


4. 공인 IP를 사용하는 NIC를 만듭니다.


$nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $rgName -Location $locName -SubnetId $subnetid2 -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id


5. 2.2의 9~13까지를 다시 수행합니다.



2.4 가상네트워크 피어링과 서로 다른 네트워크의 가상머신 테스트


1. AzureBCKor01-vnet1 -> AzureBCKor01-vnet2로의 가상 네트워크 피어링을 추가합니다.


Add-AzureRmVirtualNetworkPeering -Name VNet1ToVNet2 -VirtualNetwork $vnet1 -RemoteVirtualNetworkId $vnet2.Id


2. AzureBCKor01-vnet2 -> AzureBCKor01-vnet1로의 가상 네트워크 피어링을 추가합니다.


Add-AzureRmVirtualNetworkPeering -Name VNet2ToVNet1 -VirtualNetwork $vnet2 -RemoteVirtualNetworkId $vnet1.Id


3. 가상 네트워크 양방향 피어링 결과를 확인합니다.


Get-AzureRmVirtualNetworkPeering -VirtualNetworkName AzureBCKor01-VNet1  -ResourceGroupName $rgName -Name VNet1ToVNet2

Get-AzureRmVirtualNetworkPeering -VirtualNetworkName AzureBCKor01-VNet2  -ResourceGroupName $rgName -Name VNet2ToVNet1


4. Azure 포털에서 리소스그룹 AzureBCKorRG01내의 AzureBCKorVM1을 클릭하고  [개요] 블레이드에서 상단의 [공용 IP 주소]를 확인하고 mstsc를 실행해 원격데스크톱으로 접속합니다.




5. AzureBCKorVM1에서 AzureBCKorVM2로 ICMP 테스트를 수행합니다.

AzureBCKorVM2에서 방화벽을 해제하고 테스트 한 후, 다시 방화벽을 원래대로 복구하세요.


Test-NetConnection -ComputerName [AzureBCKorVM2의 사설 IP]


*요약
2개의 서브넷이 있는 가상 네트워크 하나와 1개의 서브넷이 있는 가상 네트워크를 만들었습니다. 각 가상 네트워크에서 동작하는 가상 머신을 하나씩 만들어 배치했습니다. 또한 두 개의 가상 네트워크를 피어링 기능으로 양방향 연결해, 앞서 만든 서로 다른 네트워크의 가상 머신이 서로 통신이 가능함을 확인했습니다.


3. Azure 웹앱

3.1 서로 다른 지역에 Azure 웹앱 만들기

1. 한국 중부에 새로운 리소스 그룹을 하나 만듭니다.


$rg3=New-AzureRmResourceGroup -Name AzureBCKorRG03 -Location koreacentral


2. 한국 중부에 배치할 웹 앱의 앱 서비스 계획을 만들고 변수에 저장합니다.


$rg03asp=New-AzureRmAppServicePlan -Location 'Korea Central' -ResourceGroupName AzureBCKorRG03 -Name AzureBCKorAS -Tier Standard -WorkerSize Small -NumberofWorkers 1


3. AzureBCKorRG03 리소스 그룹에 웹 앱(azurebckorweb1-[Your Name Initial])을 하나 만듭니다. 위치는 한국 중부를 지정합니다.


New-AzureRmWebApp -ResourceGroupName $rg3.ResourceGroupName -Name azurebckorweb-[Your Name Initial] -Location 'Korea Central' -AppServicePlan AzureBCKorAS


4. 미국 동부에 배치할 웹 앱의 앱 서비스 계획을 만들고 변수에 저장합니다.


$rg01asp=New-AzureRmAppServicePlan -Location 'East US' -ResourceGroupName AzureBCKorRG01 -Name AzureBCEastUSAS -Tier Standard -WorkerSize Small -NumberofWorkers 1


5. AzureBCKorRG01 리소스 그룹에 웹 앱(azurebckorweb2-[Your Name Initial])을 하나 더 만듭니다. 위치는 미국 동부를 지정합니다.


New-AzureRmWebApp -ResourceGroupName $rg1.ResourceGroupName -Name azurebcusweb-[Your Name Initial] -Location 'East US' -AppServicePlan AzureBCEastUSAS


6. 실습 가이드에 게시된 webapp-korpub.zip파일과 webapp-uspub.zip 파일을 다운로드해 C:\AzureBC 폴더 아래에 저장합니다.


7. 이번엔 Azure 클래식 모델을 사용하기 위해, 다시 기본 구독 환경을 바꿉니다. 다음 명령을 실행하고 다시 로그인합니다.


Add-AzureAccount


8. 한국 중부에 배포한 웹 앱에 webapp-korpub.zip을 게시합니다.


Publish-AzureWebsiteProject -Package C:\Azurebc\webapp-korpub.zip -Name azurebckorweb1-[Your Name Initial]


9. 배포한 웹 앱의 동작을 확인합니다.


Show-AzureWebsite -Name azurebckorweb1


10. 미국 동부에 배포한 웹 앱에 webapp-uspub.zip을 게시합니다.


Publish-AzureWebsiteProject -Package C:\Azurebc\webapp-uspub.zip -Name azurebckorweb2-[Your Name Initial]


11. 배포함 웹 앱의 동작을 확인합니다.


Show-AzureWebsite -Name azurebckorweb2


3.2 트래픽 관리자를 이용해 접속 지역을 기반으로 웹 앱서비스하기

1. AzureBCKorRG03 리소스 그룹에 트래픽 관리자 프로필(azurebctm)을 만듭니다. 이때 DNS 이름은 bctm[Your Name Initial]로 합니다. 모니터링 프로토콜은 HTTP, 모니터링 포트는 80, TTL 값은 30으로 지정합니다.


New-AzureRmTrafficManagerProfile -ResourceGroupName AzureBCKorRG02 -Name azurebctm -TrafficRoutingMethod Geographic -RelativeDnsName "bctm[Your Name Initial]" -Ttl 30 -MonitorProtocol HTTP -MonitorPort 80 -MonitorPath "/"


2. 끝점을 만드는데 필요한 트래픽 관리자 프로필 리소스 개체와 앞서 만든 웹 앱 개체를  변수에 저장합니다.


$tmprofile=Get-AzureRmTrafficManagerProfile -Name azurebctm -ResourceGroupName AzureBCKorRG02
$korweb = Get-AzureRmWebApp -Name azurebckorweb1
$usweb = Get-AzureRmWebApp -Name azurebckorweb2


3. 트래픽 관리자에서 라우팅할 첫 번째 끝점을 지정합니다. 먼저, 앞서 만든 한국 중부의 웹 앱으로 라우팅하는 끝점을 등록합니다.

-끝점 이름: korweb
-지리적 매핑: KR
-형식: Azure끝점
-상태: 사용


Add-AzureRmTrafficManagerEndpointConfig -EndpointName korweb -EndpointStatus Enabled -TargetResourceId $korweb.id -TrafficManagerProfile $tmprofile -GeoMapping KR -Type AzureEndpoints


4. 트래픽 관리자에서 라우팅할 두 번째 끝점을 지정합니다. 앞서 만든 미국 동부의 웹 앱으로 라우팅하는 끝점을 등록합니다.

-끝점 이름: usweb
-지리적 매핑: US
-형식: Azure끝점
-상태: 사용


Add-AzureRmTrafficManagerEndpointConfig -EndpointName usweb -EndpointStatus Enabled -TargetResourceId $usweb.id -TrafficManagerProfile $tmprofile -GeoMapping US -Type AzureEndpoints


5. 이제 트래픽 관리자 [개요] 블레이드에서 DNS 이름을 클릭해 어떤 웹사이트로 접속되는지 확인합니다. 한국에서 접속한다면, azurebckorweb.azurewebsites.net으로 라우팅되어야 합니다.



*요약

한국 중부와 미국 동부에 각각 웹앱을 만들고 개발한 웹 사이트를 각 웹 앱에 배포했습니다. 지리적 기반으로 부하를 분산하는 트래픽 관리자를 만들어 각 웹 앱을 끝점으로 등록하고, 한국에서 접속했을 때 한국 중부의 웹 앱이 응답하는 것을 확인했습니다.


4. 리소스 정리

실습 가이드 웹 페이지에서 RemoveAllResources.ps1 파일을 다운로드해 C:\Azurebc 폴더에 저장하고 다음과 같이 실행합니다. 스크립트에 정의한 Remove-AzureBCResources 함수가 현재 세션에 로드됩니다.


주의) 계속 사용해야 하는 리소스 그룹이 있다면, 이 명령을 실행하지 마시고, 각 리소스 그룹을 별도로 삭제하세요.


. C:\AzureBC\RemoveAllResources.ps1


이제, 지금까지 만든 모든 리소스를 지우기 위해 Remove-AzureBCResources 명령을 실행합니다.