์์ง๋์ด์ IT ๊ด๋ฆฌ์๋ PowerShell์ ์ฌ์ฉํ์ฌ ์จ-ํ๋ ๋ฏธ์ค๋ฟ๋ง ์๋๋ผ ํด๋ผ์ฐ๋ ์ธํ๋ผ, ํนํ Azure์์ ์์ ํ ๋ ๋ค์ํ ์์ ์ ์ฑ๊ณต์ ์ผ๋ก ์๋ํํฉ๋๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ PowerShell์ ํตํด ์์ ํ๋ ๊ฒ์ด Azure Portal์ ํตํด ์์ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ํธ๋ฆฌํ๊ณ ๋น ๋ฆ ๋๋ค. ํฌ๋ก์ค ํ๋ซํผ ํน์ฑ ๋๋ถ์ PowerShell์ ๋ชจ๋ ์ด์ ์ฒด์ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Ubuntu, Red Hat ๋๋ Windows๋ฅผ ์คํ ์ค์ด๋ผ๋ฉด PowerShell์ ์ฌ์ฉํ์ฌ ํด๋ผ์ฐ๋ ๋ฆฌ์์ค๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. ๋ชจ๋ ์ฌ์ฉ
์ด ๋ฌธ์์์๋ PowerShell์ ์ฌ์ฉํ์ฌ Azure ํด๋ผ์ฐ๋์์ VM ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ณ VM ๋ฐ ๊ด๋ จ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ค์! ์์
์ค๋น๋ฅผ ์ํด ์์ ์๋
์ ๋ก ๋ฆ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
- ๋ชจ๋์ด ํ์ํฉ๋๋ค Azure PowerShell ๋ชจ๋ - ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ PowerShell ๊ฐค๋ฌ๋ฆฌ์์ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.
Install-Module Az
. - ๋ค์ ๋ช
๋ น์ ์คํํ์ฌ ๊ฐ์ ๋จธ์ ์ด ์คํ ์ค์ธ Azure ํด๋ผ์ฐ๋์์ ์ธ์ฆํด์ผ ํฉ๋๋ค.
Connect-AzAccount
.
๋จผ์ Azure VM์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. VS Code๋ฅผ ์ด๊ณ ๋ค์๊ณผ ๊ฐ์ ์ PowerShell ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ฅํด ๋ณด๊ฒ ์ต๋๋ค. ํฌ๊ธฐ ์กฐ์ -AzVirtualMachine.ps1 โ ์์ ๊ฐ ์งํ๋จ์ ๋ฐ๋ผ ์ฝ๋ ์กฐ๊ฐ์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
์ฌ์ฉ ๊ฐ๋ฅํ VM ํฌ๊ธฐ๋ฅผ ์์ฒญํฉ๋๋ค.
VM ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ ์ Azure ํด๋ผ์ฐ๋์ ๊ฐ์ ๋จธ์ ์ ํ์ฉ๋๋ ํฌ๊ธฐ๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋ช
๋ น์ ์คํํด์ผ ํฉ๋๋ค. Get-AzVMSize
.
๋ฐ๋ผ์ ๊ฐ์ ๋จธ์ ์ ๊ฒฝ์ฐ devvm01 ๋ฆฌ์์ค ๊ทธ๋ฃน์์ DEV ๊ฐ๋ฅํ ๋ชจ๋ ํ์ฉ ๊ฐ๋ฅํ ํฌ๊ธฐ๋ฅผ ์์ฒญํฉ๋๋ค.
Get-AzVMSize -ResourceGroupName dev -VMName devvm01
(๋ฌผ๋ก ์ค์ ๋ฌธ์ ์์๋ ๋ฆฌ์์ค๊ทธ๋ฃน์ด๋ฆ=dev ะธ VM์ด๋ฆ=devvm01 ์ด๋ฌํ ๋งค๊ฐ๋ณ์์ ๋ํ ๊ณ ์ ํ ๊ฐ์ ์ง์ ํฉ๋๋ค.)
์ด ๋ช ๋ น์ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ๋ฐํํฉ๋๋ค.
์ด๋ ํน์ ๊ฐ์ ๋จธ์ ์ ๋ํด ์ค์ ํ ์ ์๋ ๊ฐ๋ฅํ ๋ชจ๋ ํฌ๊ธฐ ์ต์
์
๋๋ค.
์๋์ฐจ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด ๋ด ์๋ค
์๋ฅผ ๋ค์ด ์๋ก์ด ํฌ๊ธฐ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ฒ ์ต๋๋ค. Standard_B1ls - ๊ทธ๋ ์ ๋ชฉ๋ก์์ XNUMX์๋ฅผ ์ฐจ์งํ์ต๋๋ค. (๋ฌผ๋ก ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ์์๋ ํ์ํ ํฌ๊ธฐ๋ฅผ ์ ํํฉ๋๋ค.)
- ๋จผ์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ
Get-AzVM
์ฐ๋ฆฌ๋ ๊ฐ์ฒด(๊ฐ์ ๋จธ์ )์ ๋ํ ์ ๋ณด๋ฅผ ๋ณ์์ ์ ์ฅํ์ฌ ์ป์ต๋๋ค.$virtualMachine
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
- ๊ทธ๋ฐ ๋ค์ ์ด ๊ฐ์ฒด์์ ์์ฑ์ ๊ฐ์ ธ์ต๋๋ค.
.HardwareProfile.VmSize
์ํ๋ ์ ๊ฐ์ ์ค์ ํฉ๋๋ค.$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
- ์ด์ VM ์
๋ฐ์ดํธ ๋ช
๋ น์ ์คํํ๋ฉด ๋ฉ๋๋ค.
Update-AzVm
:Update-AzVM -VM devvm01 -ResourceGroupName dev
- ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ด ์ ์งํ๋์๋์ง ํ์ธํฉ๋๋ค. ์ด๋ฅผ ์ํด ๊ฐ์ฒด์ ๋ํ ์ ๋ณด๋ฅผ ๋ค์ ์์ฒญํ๊ณ ์์ฑ์ ์ดํด๋ด
๋๋ค.
$virtualMachine.HardwareProfile
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
๊ฑฐ๊ธฐ์ ๋ณด๋ฉด Standard_B1ls - ์ด๋ ๋ชจ๋ ๊ฒ์ด ์ ์์ด๊ณ ์๋์ฐจ์ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋ฒ์ ์ฌ๋ฌ VM์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ฉด ๋ ๋์๊ฐ ์ฑ๊ณต์ ๊ฑฐ๋ ์ ์์ต๋๋ค.
Azure์์ VM์ ์ญ์ ํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
์ญ์ ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๋ณด์ด๋ ๊ฒ์ฒ๋ผ ๊ฐ๋จํ๊ณ ๊ฐ๋จํ์ง๋ ์์ต๋๋ค. ๊ฒฐ๊ตญ ๋ค์์ ํฌํจํ์ฌ ์ด ์์คํ ๊ณผ ๊ด๋ จ๋ ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
- ๋ถํ ์ง๋จ ์คํ ๋ฆฌ์ง ์ปจํ ์ด๋
- ๋คํธ์ํฌ ์ธํฐํ์ด์ค
- ๊ณต์ฉ IP ์ฃผ์
- ์ํ๊ฐ ์ ์ฅ๋๋ ์์คํ ๋์คํฌ ๋ฐ Blob
- ๋ฐ์ดํฐ ๋์คํฌ
๋ฐ๋ผ์ ํจ์๋ฅผ ์์ฑํ๊ณ ํธ์ถํ๊ฒ ์ต๋๋ค. Remove-AzrVirtualMachine
- Azure VM๋ฟ๋ง ์๋๋ผ ์์ ๋ชจ๋ ํญ๋ชฉ๋ ์ญ์ ๋ฉ๋๋ค.
ํ์ค ๋ฐฉ์์ผ๋ก ๋จผ์ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด(VM)๋ฅผ ๊ฐ์ ธ์ต๋๋ค. Get-AzVm
. ์๋ฅผ ๋ค์ด ์๋์ฐจ๋ผ๊ณ ํด๋ณด์. WINSRV19 ๋ฆฌ์์ค ๊ทธ๋ฃน์์ MyTestVM.
์ด ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ์์ฑ๊ณผ ํจ๊ป ๋ณ์์ ์ ์ฅํด ๋ณด๊ฒ ์ต๋๋ค. $vm
:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMs
๋ถํ ์ง๋จ ํ์ผ์ด ํฌํจ๋ ์ปจํ ์ด๋ ์ ๊ฑฐ
Azure์์ VM์ ์์ฑํ ๋ ์ฌ์ฉ์๋ ๋ถํ ์ง๋จ์ ์ ์ฅํ๊ธฐ ์ํ ์ปจํ ์ด๋(๋ถํ ์ง๋จ ์ปจํ ์ด๋)๋ ์์ฑํ๋ผ๋ ๋ฉ์์ง๋ฅผ ๋ฐ์ต๋๋ค. ๋ฐ๋ผ์ ๋ถํ ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฌธ์ ํด๊ฒฐ์ ์ํด ์์งํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ VM์ด ์ญ์ ๋๋ฉด ์ด ์ปจํ ์ด๋๋ ์ด์ ๋ชฉ์ ์ด ์๋ ์ํ๋ก ๊ณ์ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค. ์ด ์ํฉ์ ํด๊ฒฐํด ๋ด ์๋ค.
- ๋จผ์ ์ด ์ปจํ
์ด๋๊ฐ ์ด๋ค ์คํ ๋ฆฌ์ง ๊ณ์ ์ ์ํ๋์ง ์์ ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ ์์ฑ์ ์ฐพ์์ผ ํฉ๋๋ค.
storageUri
๋ฌผ์ฒด์ ๋ด๋ถ์์DiagnosticsProfile
์ฐ๋ฆฌ VM. ์ด๋ฅผ ์ํด ๋ค์ ์ ๊ท์์ ์ฌ์ฉํฉ๋๋ค.$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
- ์ด์ ์ปจํ
์ด๋ ์ด๋ฆ์ ์ฐพ์์ผ ํ๋ฉฐ ์ด๋ฅผ ์ํด์๋ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ VM ID๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
Get-AzResource
:if ($vm.Name.Length -gt 9) { $i = 9 } else { $i = $vm.Name.Length - 1 } $azResourceParams = @{ 'ResourceName' = WINSRV 'ResourceType' = 'Microsoft.Compute/virtualMachines' 'ResourceGroupName' = MyTestVMs } $vmResource = Get-AzResource @azResourceParams $vmId = $vmResource.Properties.VmId $diagContainerName = ('bootdiagnostics-{0}-{1}' -f $vm.Name.ToLower().Substring(0, $i), $vmId)
- ๋ค์์ผ๋ก ์ปจํ
์ด๋๊ฐ ์ํ ๋ฆฌ์์ค ๊ทธ๋ฃน์ ์ด๋ฆ์ ๊ฐ์ ธ์ต๋๋ค.
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
- ์ด์ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ปจํ
์ด๋๋ฅผ ์ญ์ ํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ด ์ค๋น๋์์ต๋๋ค.
Remove-AzStorageContainer
:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
VM ์ ๊ฑฐ
์ด์ ์ด๋ฏธ ๋ณ์๋ฅผ ์์ฑํ์ผ๋ฏ๋ก ๊ฐ์ ๋จธ์ ์์ฒด๋ฅผ ์ญ์ ํ๊ฒ ์ต๋๋ค. $vm
ํด๋น ๊ฐ์ฒด์ ๋ํด. ์, ๋ช
๋ น์ ์คํํด ๋ด
์๋ค Remove-AzVm
:
$null = $vm | Remove-AzVM -Force
๋คํธ์ํฌ ์ธํฐํ์ด์ค ๋ฐ ๊ณต์ฉ IP ์ฃผ์ ์ ๊ฑฐ
VM์๋ ์ฌ์ ํ ํ๋(๋๋ ์ฌ๋ฌ ๊ฐ)์ ๋คํธ์ํฌ ์ธํฐํ์ด์ค(NIC)๊ฐ ์์ต๋๋ค. ๋ถํ์ํ ๊ฒ์ผ๋ก ์ ๊ฑฐํ๋ ค๋ฉด ์์ฑ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. NetworkInterfaces
VM ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๊ณ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ NIC๋ฅผ ์ญ์ ํฉ๋๋ค. Remove-AzNetworkInterface
. ๋คํธ์ํฌ ์ธํฐํ์ด์ค๊ฐ ๋ ๊ฐ ์ด์์ธ ๊ฒฝ์ฐ ๋ฃจํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋์์ ๊ฐ NIC์ ๋ํด ์์ฑ์ ํ์ธํฉ๋๋ค. IpConfiguration
์ธํฐํ์ด์ค์ ๊ณต์ฉ IP ์ฃผ์๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. ๋ฐ๊ฒฌ๋๋ฉด ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ ๊ฑฐํฉ๋๋ค. Remove-AzPublicIpAddress
.
๋ค์์ ๋ฃจํ์ ๋ชจ๋ NIC๋ฅผ ์ดํด๋ณด๊ณ ์ญ์ ํ๊ณ ๊ณต์ฉ IP๊ฐ ์๋์ง ํ์ธํ๋ ์ด๋ฌํ ์ฝ๋์ ์์
๋๋ค. ์๋ ๊ฒฝ์ฐ ์์ฑ์ ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค. PublicIpAddress
, ID๋ก ํด๋น ๋ฆฌ์์ค์ ์ด๋ฆ์ ์ฐพ์ ์ญ์ ํฉ๋๋ค.
foreach($nicUri in $vm.NetworkProfile.NetworkInterfaces.Id) {
$nic = Get-AzNetworkInterface -ResourceGroupName $vm.ResourceGroupName -Name $nicUri.Split('/')[-1]
Remove-AzNetworkInterface -Name $nic.Name -ResourceGroupName $vm.ResourceGroupName -Force
foreach($ipConfig in $nic.IpConfigurations) {
if($ipConfig.PublicIpAddress -ne $null) {
Remove-AzPublicIpAddress -ResourceGroupName $vm.ResourceGroupName -Name $ipConfig.PublicIpAddress.Id.Split('/')[-1] -Force
}
}
}
์์คํ ๋์คํฌ ์ ๊ฑฐ
OS ๋์คํฌ๋ ์ญ์ ๋ช
๋ น์ด ์๋ blob์
๋๋ค. Remove-AzStorageBlob
- ๋จ, ์คํํ๊ธฐ ์ ์ ํด๋น ๋งค๊ฐ๋ณ์์ ํ์ํ ๊ฐ์ ์ค์ ํด์ผ ํฉ๋๋ค. ํนํ ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์์คํ
๋์คํฌ๊ฐ ํฌํจ๋ ์คํ ๋ฆฌ์ง ์ปจํ
์ด๋์ ์ด๋ฆ์ ๊ฐ์ ธ์จ ๋ค์ ํด๋น ์คํ ๋ฆฌ์ง ๊ณ์ ๊ณผ ํจ๊ป ์ด ๋ช
๋ น์ ์ ๋ฌํด์ผ ํฉ๋๋ค.
$osDiskUri = $vm.StorageProfile.OSDisk.Vhd.Uri
$osDiskContainerName = $osDiskUri.Split('/')[-2]
$osDiskStorageAcct = Get-AzStorageAccount | where { $_.StorageAccountName -eq $osDiskUri.Split('/')[2].Split('.')[0] }
$osDiskStorageAcct | Remove-AzStorageBlob -Container $osDiskContainerName -Blob $osDiskUri.Split('/')[-1]
์์คํ ๋์คํฌ ์ํ Blob ์ ๊ฑฐ
์ด๋ฅผ ์ํด ์ด๋ฏธ ์ง์ํ์
จ๊ฒ ์ง๋ง ์ด ๋์คํฌ๊ฐ ์ ์ฅ๋ ์คํ ๋ฆฌ์ง ์ปจํ
์ด๋๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๋ง์ง๋ง ๋ธ๋กญ์ ๋ค์์ด ํฌํจ๋์ด ์์์ ์์ํฉ๋๋ค. status
, ํด๋น ๋งค๊ฐ๋ณ์๋ฅผ ์ญ์ ๋ช
๋ น์ ์ ๋ฌํฉ๋๋ค. Remove-AzStorageBlob
:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlob
๋ง์ง๋ง์ผ๋ก ๋ฐ์ดํฐ ๋์คํฌ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
VM์๋ ๋ฐ์ดํฐ๊ฐ ์ฐ๊ฒฐ๋ ๋์คํฌ๊ฐ ๊ณ์ ์์ ์ ์์ต๋๋ค. ํ์ํ์ง ์์ ๊ฒฝ์ฐ ํด๋น ํญ๋ชฉ๋ ์ญ์ ํ๊ฒ ์ต๋๋ค. ๋จผ์ ๋ถ์ํด๋ณด์ StorageProfile
VM์ ์ฐพ์ ์์ฑ์ ์ฐพ์ต๋๋ค. Uri
. ๋์คํฌ๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ๊ธฐ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. URI
. ๊ฐ URI์ ๋ํด ๋ค์์ ์ฌ์ฉํ์ฌ ํด๋น ์คํ ๋ฆฌ์ง ๊ณ์ ์ ์ฐพ์ต๋๋ค. Get-AzStorageAccount
. ๊ทธ๋ฐ ๋ค์ ์คํ ๋ฆฌ์ง URI๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ ์ํ๋ Blob ์ด๋ฆ์ ์ถ์ถํ๊ณ ์ญ์ ๋ช
๋ น์ ์ ๋ฌํฉ๋๋ค. Remove-AzStorageBlob
์คํ ๋ฆฌ์ง ๊ณ์ ๊ณผ ํจ๊ป. ์ฝ๋์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
if ($vm.DataDiskNames.Count -gt 0) {
foreach ($uri in $vm.StorageProfile.DataDisks.Vhd.Uri) {
$dataDiskStorageAcct = Get-AzStorageAccount -Name $uri.Split('/')[2].Split('.')[0]
$dataDiskStorageAcct | Remove-AzStorageBlob -Container $uri.Split('/')[-2] -Blob $uri.Split('/')[-1]
}
}
๊ทธ๋ฆฌ๊ณ ์ด์ โํดํผ์๋ฉ์ ์ด๋ฅด๋ ์ต๋๋ค!โ ์ด์ ์ฐ๋ฆฌ๋ ์ด ๋ชจ๋ ์กฐ๊ฐ๋ค๋ก๋ถํฐ ํ๋์ ์ ์ฒด๋ฅผ ๋ชจ์์ผ ํฉ๋๋ค. ์น์ ํ ์๊ฐ Adam Bertram์ด ์ค๊ฐ์ ์ฌ์ฉ์๋ค์ ๋ง๋ ์ง์ ํด๋์ต๋๋ค. ๋ค์์ ์ต์ข ์คํฌ๋ฆฝํธ์ ๋ํ ๋งํฌ์ ๋๋ค. ์ ๊ฑฐ-AzrVirtualMachine.ps1:
โ
Azure VM์ผ๋ก ์์
ํ ๋ ๋
ธ๋ ฅ, ์๊ฐ ๋ฐ ๋น์ฉ์ ์ ์ฝํ๋ ๋ฐ ์ด๋ฌํ ์ค์ฉ์ ์ธ ํ์ด ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ถ์ฒ : habr.com