Microsfot Azure Cloud 플랫폼에서 파워쉘을 사용하여 리눅스 가상머신을 만듭니다. 이 글에 있는 코드는 복사-붙여넣기로 그대로 사용할 수 있습니다. Azure는 AWS보다 레퍼런스가 빈약해서 내용도 그와 마찬가지일 수 있습니다. 댓글을 달아주시면 보충 설명 하겠습니다. 이 글에 나온 파워쉘 스크립트는 제가 직접 실무에서 사용하고 있으며, Azure Doc 문서를 가장 많이 참조하여 작성하였습니다. Azure Doc 문서는 여기를 참조해주세요. 대부분 코드이므로 powershell 설치 방법은 여기서 생략하겠습니다. powershell 설치는 여기를 참조해주세요.
- Azure 자격증명을 통해 로그인합니다.
Login-AzAccount
- 자신의 구독 이름을 가져옵니다.
Get-AzSubscription
- 자신의 구독ID를 설정합니다.
Set-AzContext -SubscriptionId "yourSubscriptionID"
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 -Name $ResourceGroupName -Location $location
$subnetConfig = New-AzVirtualNetworkSubnetConfig `
-Name $subnet_name `
-AddressPrefix 192.168.1.0/24
$vnet = New-AzVirtualNetwork `
-ResourceGroupName $ResourceGroupName `
-Location $location `
-Name $vnet_name `
-AddressPrefix 192.168.0.0/16 `
-Subnet $subnetConfig
$pip = New-AzPublicIpAddress `
-ResourceGroupName $ResourceGroupName `
-Location $location `
-AllocationMethod Static `
-IdleTimeoutInMinutes 4 `
-Name $pip_name
$nsgRuleHTTP = New-AzNetworkSecurityRuleConfig `
-Name "TestHTTPNSG" `
-Protocol "Tcp" `
-Direction "Inbound" `
-Priority 1001 `
-SourceAddressPrefix * `
-SourcePortRange * `
-DestinationAddressPrefix * `
-DestinationPortRange 80 `
-Access "Allow"
$nsg = New-AzNetworkSecurityGroup `
-ResourceGroupName $ResourceGroupName `
-Location $location `
-Name $nsg_name `
-SecurityRules $nsgRuleHTTP
$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
$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-keygen -m PEM -t rsa -b 4096
$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
Get-AzPublicIpAddress -ResourceGroupName $ResourceGroupName -Name $pip_name | select ipAddress
ssh -i ~/.ssh/id_rsa azureuser@IPaddress
지금까지 작성한 코드는 아래와 같습니다. 빈 파일에 복사하여 붙여넣은 다음 파일 확장자를 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
끝
공부하는데에 도움이 많이 됐습니다. 감사합니다!