PowerShell을 활용한 Azure 가상머신 만들기

좌충우돌·2020년 8월 24일
0

Azure

목록 보기
1/1
post-thumbnail

Microsfot Azure Cloud 플랫폼에서 파워쉘을 사용하여 리눅스 가상머신을 만듭니다. 이 글에 있는 코드는 복사-붙여넣기로 그대로 사용할 수 있습니다. Azure는 AWS보다 레퍼런스가 빈약해서 내용도 그와 마찬가지일 수 있습니다. 댓글을 달아주시면 보충 설명 하겠습니다. 이 글에 나온 파워쉘 스크립트는 제가 직접 실무에서 사용하고 있으며, Azure Doc 문서를 가장 많이 참조하여 작성하였습니다. Azure Doc 문서는 여기를 참조해주세요. 대부분 코드이므로 powershell 설치 방법은 여기서 생략하겠습니다. powershell 설치는 여기를 참조해주세요.

파워쉘을 실행하고 Azure 자격 증명을 통해 로그인


  1. Azure 자격증명을 통해 로그인합니다.
Login-AzAccount
  1. 자신의 구독 이름을 가져옵니다.
Get-AzSubscription
  1. 자신의 구독ID를 설정합니다.
Set-AzContext -SubscriptionId "yourSubscriptionID"

시작합니다

변수를 정의합니다.


  • 변수만 변경하면 코드를 재사용할 수 있습니다.
  • 변수는 "$"로 시작하고 "$변수 = 값" 형식으로 만듭니다.
  • 변수명은 편의상 "TEST"를 사용합니다. 똑같이 하지 않아도 됩니다.

1. 리눅스 가상머신의 사용자 계정

$VMLocalAdminUser = "azureUser"

2. 리눅스 가상머신의 사용자 계정의 패스워드(이 글에서는 패스워드는 사용하지 않고 key로 접근합니다.)

$VMLocalAdminSecurePassword = ConvertTo-SecureString 'azureUser!@#123' -AsPlainText -Force

3. AWS에서 사용하는 region 이름으로 이해합니다.

$location = "koreacentral"

4. 하나의 프로젝트 단위이며, 여러 리소스 그룹이 있을 수 있고 네트워크를 통해 서로 연결할 수 있습니다.

$ResourceGroupName = "Test-RSG"

5. AWS에서 사용하는 VPC 이름이라고 이해합니다.

$vnet_name = "TEST-vnet"

6. 공인(또는 공용, public) IP 이름입니다.

$pip_name = "TEST-PIP"

7. 네트워크 보안그룹(방화벽이라고 이해합니다.)

$nsg_name = "TEST-NSG"

8. 가상머신의 네트워크 인터페이스의 이름입니다.(랜카드)

$nicName = "TEST-VM-NIC"

9. 리눅스 호스트네임

$HostName = "TEST-VM"

10. 가상머신 이름

$vmName = "TEST-VM"

11. 가상머신의 하드웨어 규격(AWS는 EC2가 있죠)

$vmSize = "Standard_D2s_v3"

12. OS 디스크의 이름으로 사용합니다.

$osDiskName = "TEST-OS-DIsk"

13. 디스크 성능에 따라 프리미엄 SSD 디스크, SSD 디스크, 일반 하드디스크로 구분합니다. 여기서는 일반 하드디스크를 사용합니다. 디스크에 관한 자세한 내용을 여기를 참조해주세요.

$StorageAccountType = "Standard_LRS"
  • 변수를 정의하기 위한 완전한 코드는 아래와 같습니다.
# Variables
$VMLocalAdminUser           = "azureUser"
$VMLocalAdminSecurePassword = ConvertTo-SecureString 'azureUser!@#123' -AsPlainText -Force
$location                   = "koreacentral"
$ResourceGroupName          = "Test-RSG"
$vnet_name                  = "TEST-vnet"
$pip_name                   = "TEST-PIP"
$nsg_name                   = "TEST-NSG"
$nicName                    = "TEST-VM-NIC"
$HostName                   = "TEST-VM"
$vmName                     = "TEST-VM"
$subnet_name				= "TEST-Subnet"
$vmSize                     = "Standard_D2s_v3"
$osDiskName                 = "TEST-OS-DIsk"
$StorageAccountType         = "Standard_LRS"

리소스 만들기


  • 변수 정의가 끝났으므로 본격적으로 리소스를 만듭니다.

리소스 그룹 만들기

  • "New-AzResourceGroup 명령어를 통해 리소스 그룹을 만듭니다.
New-AzResourceGroup -Name $ResourceGroupName -Location $location

서브넷 만들기

  • 서브넷 이름과 서브넷 주소 범위를 설정합니다.
$subnetConfig = New-AzVirtualNetworkSubnetConfig `
  -Name $subnet_name `
  -AddressPrefix 192.168.1.0/24

가상네트워크(vnet) 만들기

  • 바로 위에서 만든 서브넷을 포함하는 가상네트워크를 만듭니다. 자세히 보면 서브넷은 C클래스 IP 주소 대역을 가지며, 가상네트워크는 그보다 범위가 큰 B클래스 대역의 IP 주소 범위를 가집니다. 다시 말해서 가상네트워크는 서브넷을 포함합니다.
$vnet = New-AzVirtualNetwork `
-ResourceGroupName $ResourceGroupName `
-Location $location `
-Name $vnet_name `
-AddressPrefix 192.168.0.0/16 `
-Subnet $subnetConfig

공인IP(public ipaddress) 만들기

  • 외부에서 서비스 또는 원격으로 접근할 때 필요한 공인 IP를 만듭니다.
  • "AllocationMethod Static"은 공인 IP를 만들 때 고정 IP로 만들겠다는 의미입니다.
  • 생성할 리소스를 정의할 때 ResourceGroupName은 언제나 빠지지 않습니다.
 $pip = New-AzPublicIpAddress `
  -ResourceGroupName $ResourceGroupName `
  -Location $location `
  -AllocationMethod Static `
  -IdleTimeoutInMinutes 4 `
  -Name $pip_name

네트워크 보안그룹 Rule 만들기(NSG)

HTTP 포트 개방

  • SourceAddressPrefix : 출발지(예: 10.10.10.10/32 or 10.10.10.0/24)
  • DestinationAddressPrefix : 목적지(VM의 IP 여기서는 편의상 와일드 카드를 사용합니다.)
  • Protocol은 "TCP"를 사용합니다.
  • Direction은 이 규칙이 아웃바운드인가 인바운드인가를 정의합니다. 여기선 인바운드죠.
$nsgRuleHTTP = New-AzNetworkSecurityRuleConfig `
  -Name "TestHTTPNSG"  `
  -Protocol "Tcp" `
  -Direction "Inbound" `
  -Priority 1001 `
  -SourceAddressPrefix * `
  -SourcePortRange * `
  -DestinationAddressPrefix * `
  -DestinationPortRange 80 `
  -Access "Allow"

NSG 만들기

  • 위에서 설정한 규칙대로 네트워크보안그룹을 만듭니다.
  • 마지막에 "$nsgRuleHTTP"이 위에서 설정한 인바운드 규칙입니다.
$nsg = New-AzNetworkSecurityGroup `
  -ResourceGroupName $ResourceGroupName `
  -Location $location `
  -Name $nsg_name `
  -SecurityRules $nsgRuleHTTP

네트워크 인터페이스(NIC) 만들기

$nic = New-AzNetworkInterface `
  -Name $nicName `
  -ResourceGroupName $ResourceGroupName `
  -Location $location `
  -SubnetId $vnet.Subnets[0].Id `
  -PublicIpAddressId $pip.Id `
  -NetworkSecurityGroupId $nsg.Id

가상머신의 사용자 계정 패스워드 설정

  • 여기서 설정은 하나 실제로는 사용하지 않습니다.
$cred = New-Object System.Management.Automation.PSCredential ($VMLocalAdminUser, $VMLocalAdminSecurePassword)

가상머신 설정

가상머신의 이름, 가상머신의 사이즈를 설정

  • 가상머신을 만들기 위한 정보를 가상머신을 생성할 때 적용하기 위한 작업
$vmConfig = New-AzVMConfig `
  -VMName $vmName `
  -VMSize $vmSize

가상머신의 OS 타입(Linux), 호스트네임, 계정 정보, 패스워드 활성화 유무

  • DisablePasswordAuthentication은 실제로 패스워드를 통합 로그인을 비활성화한다는 설정입니다.
$vmConfig = Set-AzVMOperatingSystem `
  -VM $vmConfig `
  -Linux `
  -ComputerName $HostName `
  -Credential $cred `
  -DisablePasswordAuthentication

OS 디스크 설정

$vmConfig = Set-AzVMOSDisk `
  -VM $vmConfig `
  -Name $osDiskName `
  -CreateOption fromImage `
  -StorageAccountType $StorageAccountType

가상머신 소스 이미지 정보 설정

$vmconfig = Set-AzVMSourceImage `
  -VM $vmConfig `
  -PublisherName "OpenLogic" `
  -Offer "CentOS" `
  -Skus "7.7" `
  -Version "latest"

가상머신에 네트워크 카드를 연결하는 설정

$vmconfig = Add-AzVMNetworkInterface `
  -VM $vmConfig `
  -Id $nic.Id

ssh key를 통해 VM에 접속하기 위한 설정

  • 로컬 PC에서 SSH 키페어를 생성합니다.
ssh-keygen -m PEM -t rsa -b 4096
  • 가상머신에 접속하기 위해 자신의 퍼블릭키를 cat 명령어로 열어서 $sshPublicKey에 저장하고 이 Keydayta를 가상머신의 authorized_keys에 저장합니다.
$sshPublicKey = cat ~/.ssh/id_rsa.pub
Add-AzVMSshPublicKey `
  -VM $vmconfig `
  -KeyData $sshPublicKey `
  -Path "/home/azureUser/.ssh/authorized_keys"

가상머신 생성

New-AzVM `
  -ResourceGroupName $ResourceGroupName `
  -Location $location -VM $vmConfig

생성한 가상머신의 IP를 출력

Get-AzPublicIpAddress -ResourceGroupName $ResourceGroupName -Name $pip_name | select ipAddress

SSH 키페어를 사용하여 가상머신에 접속

ssh -i ~/.ssh/id_rsa azureuser@IPaddress

지금까지 작성한 코드는 아래와 같습니다. 빈 파일에 복사하여 붙여넣은 다음 파일 확장자를 ps1로 변경해서 실행해서 실행하거나, 각각의 블록을 별도로 복사하여 파워쉘 콘솔창에 붙여넣기 하셔도 됩니다.

  • ex: example_azure_vm_create.ps1

완전한 코드

# Ref : https://docs.microsoft.com/ko-kr/azure/virtual-machines/linux/quick-create-powershell
# Login-AzAccount
# Get-AzSubscription
# Set-AzContext -SubscriptionId "yourSubscriptionID"
################################################################################
#                                   변수 설정                                    #
################################################################################
$VMLocalAdminUser           = "azureUser"
$VMLocalAdminSecurePassword = ConvertTo-SecureString 'azureUser!@#123' -AsPlainText -Force
$location                   = "koreacentral"
$ResourceGroupName          = "TEST-RSG"
$vnet_name                  = "TEST-vNet"
$pip_name                   = "TEST-PIP"
$nsg_name                   = "TEST-NSG"
$nicName                    = "TEST-VM-NIC"
$HostName                   = "TEST-VM"
$vmName                     = "TEST-VM"
$vmSize                     = "Standard_D2s_v3"
$osDiskName                 = "TEST-OS-DIsk"
$StorageAccountType         = "Standard_LRS"

# 리소스 그룹 만들기
New-AzResourceGroup -Name $ResourceGroupName -Location $location

# 서브넷 만들기
$subnetConfig = New-AzVirtualNetworkSubnetConfig `
  -Name $subnet_name `
  -AddressPrefix 192.168.1.0/24

# vnet 만들기
$vnet = New-AzVirtualNetwork `
-ResourceGroupName $ResourceGroupName `
-Location $location `
-Name $vnet_name `
-AddressPrefix 192.168.0.0/16 `
-Subnet $subnetConfig

# 공인IP(public ipaddress) 만들기
 $pip = New-AzPublicIpAddress `
  -ResourceGroupName $ResourceGroupName `
  -Location $location `
  -AllocationMethod Static `
  -IdleTimeoutInMinutes 4 `
  -Name $pip_name"

#네트워크 보안그룹 Rule 만들기(NSG) : HTTP 포트 개방
$nsgRuleHTTP = New-AzNetworkSecurityRuleConfig `
  -Name "TestHTTPNSG"  `
  -Protocol "Tcp" `
  -Direction "Inbound" `
  -Priority 1001 `
  -SourceAddressPrefix * `
  -SourcePortRange * `
  -DestinationAddressPrefix * `
  -DestinationPortRange 80 `
  -Access "Allow"

# NSG 만들기
$nsg = New-AzNetworkSecurityGroup `
  -ResourceGroupName $ResourceGroupName `
  -Location $location `
  -Name $nsg_name `
  -SecurityRules $nsgRuleHTTP

# 네트워크 인터페이스(NIC) 만들기
$nic = New-AzNetworkInterface `
  -Name $nicName `
  -ResourceGroupName $ResourceGroupName `
  -Location $location `
  -SubnetId $vnet.Subnets[0].Id `
  -PublicIpAddressId $pip.Id `
  -NetworkSecurityGroupId $nsg.Id

# 가상머신의 사용자 계정 패스워드 설정(여기서 설정은 하지만 실제로 사용하지 않습니다.)
# $securePassword = ConvertTo-SecureString ' ' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ($VMLocalAdminUser, $VMLocalAdminSecurePassword)

# 가상머신 설정(가상머신을 만들기 위한 정보를 가상머신을 생성할 때 적용하기 위한 작업)
$vmConfig = New-AzVMConfig `
  -VMName $vmName `
  -VMSize $vmSize
$vmConfig = Set-AzVMOperatingSystem `
  -VM $vmConfig `
  -Linux `
  -ComputerName $HostName `
  -Credential $cred `
  -DisablePasswordAuthentication
$vmConfig = Set-AzVMOSDisk `
  -VM $vmConfig `
  -Name $osDiskName `
  -CreateOption fromImage `
  -StorageAccountType $StorageAccountType
$vmconfig = Set-AzVMSourceImage `
  -VM $vmConfig `
  -PublisherName "OpenLogic" `
  -Offer "CentOS" `
  -Skus "7.7" `
  -Version "latest"
$vmconfig = Add-AzVMNetworkInterface `
  -VM $vmConfig `
  -Id $nic.Id

# SSH Key 설정
$sshPublicKey = cat ~/.ssh/id_rsa.pub
Add-AzVMSshPublicKey `
  -VM $vmconfig `
  -KeyData $sshPublicKey `
  -Path "/home/azureUser/.ssh/authorized_keys"

# 가상머신 생성
New-AzVM `
  -ResourceGroupName $ResourceGroupName `
  -Location $location `
  -VM $vmConfig `
  -Verbose

# IP 출력하기
Get-AzPublicIpAddress -ResourceGroupName $ResourceGroupName -Name $pip_name | select ipAddress

profile
좌충우돌 회사생활

2개의 댓글

comment-user-thumbnail
2020년 11월 11일

공부하는데에 도움이 많이 됐습니다. 감사합니다!

1개의 답글