Microsoft/Azure

Automation Account 을 사용하여 Disk Snapshot 생성

megapain 2021. 1. 31. 03:29

Azure Automation Account를 사용하면 특정 시간에 특정 PowerShell Script를 실행할 수 있습니다.

어쩌다보니, 특정 VM의 Data Disk Snapshot을 새벽에 생성해야 할 일이 있어서 Automation Account를 사용했습니다.

 

테스트 시나리오

Azure Automation을 사용하여 Test-VM의 4개의 Data Disk의 Snapshot을 새벽 1시 50분에 생성합니다.

Test-VM의 Data Disk

 


1. Automation Accout 생성
Automation Account - +Add



Name : 원하는 이름 입력
Location : VM이 위치한 지역
Create Azure Run As account : Yes



*참고 - Run As account 
Create Azure Run As account를 Yes로 설정하면, Azure Active Directory에 App Registration (Service principal)이 생성되고, 구독에 대한 Contributor로 자동으로 등록된다. 


 

Automation Account 생성 완료



2. 필요한 Powershell 모듈 가져오기 (AzureRm.Compute)

Disk Snapshot을 생성하는 스크립트를 Automation Account에서 사용하여 위해서는 필요한 PowerShell 모듈을 가져오기 해야 합니다..

Snapshot을 생성하기 위해서는 AzureRm.Compute 모듈의  New-AzureRMSnapshotConfig, New-AzureRMSnapshot 명령을 사용합니다.
Automation Account의 AzureRm.Compute 모듈을 확인해보면 Snapshot에 필요한 명령이 보이지 않습니다.

 

 


AzureRm.Compute 모듈 가져오기 (Import)
Automation Account - Module gallery 에서 "AzureRm.Compute" 검색하고 AzureRm.Compute 모듈을 선택합니다.



Import를 클릭하고 I agree to update all of the Azure modules에 체크하고 [OK] 버튼을 클릭합니다.
*[OK] 버튼을 클릭해도 알람으로 표시되는 것이 없기 때문에 Import가 안 된 것으로 착각할 수도 있습니다. Backgroupd 작업으로 Import가 진행 중이므로 다시 Import를 누르지 말고, Automation Account 첫 화면으로 돌아갑니다.



Modules 를 클릭해보면 "Azure modules are being updated" 라고 표시되는 것을 확인할 수 있으며, 관련된 모듈들이 Import 되고 있는 중인 것을 확인 할 수 있습니다.



가져오기가 완료되면 "Azure modules have been updated" 라고 표시됩니다.
*Azure 모듈이 Failed로 표시될 수도 있습니다. Azure 모듈이 Failed로 표시되는 이유는 알 수 없지만, Snapshot을 생성 작업에는 영향이 없습니다.



AzureRm.Compute 모듈에 Snapshot 관련 명령이 포함된 것을 확인할 수 있습니다.



3. Runbook 생성
Azure Automation Account에서 PowerShell Script를 실행하기 위해서는 Runbook을 생성해야 합니다.

Automation Account - Runbooks - +Create a runbook



Name : 원하는 이름 입력
Runbook type : PowerShell
[Create]

 

PowerShell Script를 붙여 넣고 Save 합니다. (변수들은 상황에 맞게 수정해야 합니다.)

# Ensures you do not inherit an AzContext in your runbook
Disable-AzureRMContextAutosave –Scope Process

$connection = Get-AutomationConnection -Name AzureRunAsConnection

# Wrap authentication in retry logic for transient network failures
$logonAttempt = 0
while(!($connectionResult) -and ($logonAttempt -le 10))
{
    $LogonAttempt++
    # Logging in to Azure...
    $connectionResult = Connect-AzureRMAccount `
                            -ServicePrincipal `
                            -Tenant $connection.TenantID `
                            -ApplicationId $connection.ApplicationID `
                            -CertificateThumbprint $connection.CertificateThumbprint

    Start-Sleep -Seconds 30
}

$AzureContext = Get-AzureRMSubscription -SubscriptionId $connection.SubscriptionID

$snapshotResourceGroup = "Test-VM-RG"
$snapshotType = "Standard_LRS"
$location = "koreacentral"
$datePrefix = Get-Date -Format yyyyMMddHHmm

for ( $i=21; $i -le 24; $i++) {

    $diskName = "Test-VM_DATA" + $i
    $diskURI = "/subscriptions/subscriptionID/resourceGroups/Test-VM-RG/providers/Microsoft.Compute/disks/" + $diskName
    $snapshotName = $diskName + "-SNAPSHOT-" + $datePrefix
    $snapshotDATA = New-AzureRMSnapshotConfig -SkuName $snapshotType -Location $location -SourceUri $diskURI -CreateOption Copy
    New-AzureRMSnapshot -ResourceGroupName $snapshotResourceGroup -SnapshotName $snapshotName -Snapshot $snapshotDATA -AsJob
}

 

*참고 - Test 
Test pane에서 Script가 정상 동작하는지 테스트 해 볼 수도 있습니다. Test pane에서 Script를 실행하면 실제로 VM에 영향을 줄 수도 있습니다. 
예를 들어, Test pane에서 스크립트를 실행하면, 실제로 Disk Snapshot이 생성됩니다.

 


Publish



[Yes]




4. Schedule (예약)
특정 시간에 Runbook이 실행되도록 Schedule을 등록합니다.
대상 Runbook - Schedules - +Add a schedule



Schedule - Create a new schedule - Script 실행 시간 설정 - [Create] - [OK]
*Recurrence 옵션을 사용하면 Runbook을 반복적으로 실행할 수도 있습니다.



Schedule 등록 완료




5. 결과 확인
Runbook의 jobs에서 Script 실행 결과를 확인할 수 있습니다.

 




실제로 Snapshot이 생성되었습니다.

 

-끝-