복구 계획에 Azure Automation Runbook 추가

이 문서에서는 Azure Automation Runbook을 통합하여 Azure Site Recovery 복구 계획을 확장하는 방법을 설명합니다. 수동 작업이 필요했을 기본 작업을 자동화하는 방법과 다단계 복구를 단일 클릭 작업으로 변환하는 방법을 보여 줍니다.

복구 계획

온-프레미스 컴퓨터 또는 Azure VM을 장애 조치할 때 복구 계획을 사용할 수 있습니다. 복구 계획은 컴퓨터 장애 조치(failover) 방법과 장애 조치(failover) 후의 시작 및 복구 방법을 정의하는 체계적인 복구 프로세스를 정의하는 데 도움이 됩니다.

규모가 큰 앱의 복구는 복잡할 수 있습니다. 복구 계획을 통해 순서가 적용되면 복구가 일관적으로 정확하고 반복 가능하며 자동화될 수 있습니다. 스크립트 및 Azure Automation Runbook을 사용하여 복구 계획 내에서 작업을 자동화할 수 있습니다. 일반적인 예로 장애 조치(failover) 후 Azure VM에서 설정을 구성하거나 VM에서 실행되는 앱을 다시 구성할 수 있습니다.

복구 계획의 Runbook

복구 계획에 Azure Automation 계정 및 Runbook을 추가합니다. Runbook은 복구 계획이 실행될 때 호출됩니다.

  • Automation 계정은 모든 Azure 지역에 있을 수 있으며 Site Recovery 자격 증명 모음과 동일한 구독에 있어야 합니다.
  • Runbook은 기본 위치에서 보조 위치로 장애 조치(failover) 중 또는 보조 위치에서 주 위치로 장애 복구하는 동안 복구 계획에서 실행할 수 있습니다.
  • 복구 계획의 Runbook은 집합 순서대로 순차적으로 실행됩니다.
  • 복구 계획의 Runbook이 다른 그룹에서 시작하도록 VM을 구성하는 경우 Azure가 모든 VM을 실행 중이라고 보고하는 경우에만 복구 계획이 계속됩니다.
  • 스크립트가 실패하더라도 복구 계획은 계속 실행됩니다.

복구 계획 컨텍스트

스크립트가 실행되면 복구 계획 컨텍스트가 Runbook으로 삽입됩니다. 컨텍스트는 테이블에 요약된 변수를 포함합니다.

변수 이름 설명
RecoveryPlanName 복구 계획 이름입니다. 이름에 따라 동작에 사용됩니다.
FailoverType 테스트인지 또는 프로덕션 장애 조치(failover)인지 여부를 지정합니다.
FailoverDirection 복구가 기본 또는 보조 위치인지 여부를 지정합니다.
GroupID 계획이 실행 중일 때 복구 계획에서 그룹 번호를 식별합니다.
Vmmap 그룹에 있는 모든 VM의 배열입니다.
VMMap 키 각 VM에 대한 고유 키(GUID)입니다.
SubscriptionId VM을 만든 Azure 구독 ID입니다.
ResourceGroupName VM이 있는 리소스 그룹의 이름입니다.
CloudServiceName VM이 만들어진 Azure 클라우드 서비스 이름입니다.
RoleName Azure VM의 이름입니다.
RecoveryPointId VM 복구에 대한 타임스탬프입니다.

참고 항목

'FailoverDirection' 변수의 값은 장애 조치의 경우 'PrimaryToSecondary'이고 장애 복구의 경우 'SecondaryToPrimary'입니다.

다음 예제에서는 컨텍스트 변수를 보여줍니다.

{
    "RecoveryPlanName": "hrweb-recovery",
    "FailoverType": "Test",
    "FailoverDirection": "PrimaryToSecondary",
    "GroupId": "1",
    "VmMap": {
        "7a1069c6-c1d6-49c5-8c5d-33bfce8dd183": {
            "SubscriptionId": "7a1111111-c1d6-49c5-8c5d-111ce8dd183",
            "ResourceGroupName": "ContosoRG",
            "CloudServiceName": "pod02hrweb-Chicago-test",
            "RoleName": "Fabrikam-Hrweb-frontend-test",
            "RecoveryPointId": "TimeStamp"
        }
    }
}

루프에서 VMMap의 모든 VM에 액세스하려면 다음 코드를 사용할 수 있습니다.

param (
    [parameter(Mandatory=$false)]
    [Object]$RecoveryPlanContext
)

$VMinfo = $RecoveryPlanContext.VmMap | Get-Member | Where-Object MemberType -EQ NoteProperty | select -ExpandProperty Name
$vmMap = $RecoveryPlanContext.VmMap
    foreach($VMID in $VMinfo)
    {
        $VM = $vmMap.$VMID                
            if( !(($VM -eq $Null) -Or ($VM.ResourceGroupName -eq $Null) -Or ($VM.RoleName -eq $Null))) {
            #this check is to ensure that we skip when some data is not available else it will fail
    Write-output "Resource group name ", $VM.ResourceGroupName
    Write-output "Rolename " = $VM.RoleName
            }
        }

수확 클라우드에서 Aman Sharma의 블로그에는 복구 계획 컨텍스트 스크립트의 유용한 예가 있습니다.

시작하기 전에

  • Azure Automation을 처음 접하는 경우 등록하여 샘플 스크립트를 다운로드할 수 있습니다. 자세한 내용은 Automation Runbook - 알려진 문제 및 제한 사항을 참조하세요.

  • Automation 계정에 다음 모듈이 있는지 확인합니다.

    • AzureRM.profile
    • AzureRM.Resources
    • AzureRM.Automation
    • AzureRM.Network
    • AzureRM.Compute

    모든 모듈은 호환되는 버전이어야 합니다. 가장 간단한 방법은 항상 모든 모듈의 최신 버전을 사용하는 것입니다.

복구 계획 사용자 지정

  1. 자격 증명 모음에서 복구 계획(Site Recovery)을 선택합니다.

  2. 복구 계획을 만들려면 +복구 계획을 선택합니다. 자세히 알아보기. 복구 계획이 이미 있는 경우 이를 선택하여 엽니다.

  3. 복구 계획 페이지에서 사용자 지정을 선택합니다.

    Select the Customize button

  4. 그룹 1: 시작>게시 작업 추가 옆에 있는 줄임표(...)를 선택합니다.

  5. 삽입 작업에서 스크립트선택되었는지 확인하고 스크립트의 이름을 지정합니다(헬로 월드).

  6. 자동화 계정을 지정하고 Runbook을 선택합니다. 스크립트를 저장하려면 확인을 선택합니다. 스크립트는 그룹 1: 사후 단계에 추가됩니다.

Runbook 스크립트 다시 사용

외부 변수를 사용하여 여러 복구 계획에서 단일 Runbook 스크립트를 사용할 수 있습니다.

  • Azure Automation 변수를 사용하여 복구 계획을 실행하기 위한 매개 변수를 저장합니다.
  • 복구 계획 이름을 변수에 접두사로 추가하여 각 복구 계획에 대한 개별 변수를 만들 수 있습니다. 그런 다음 변수를 매개 변수로 사용합니다.
  • 스크립트를 변경하지 않고도 매개 변수를 변경할 수 있지만 스크립트의 작동 방식을 변경할 수 있습니다.

Runbook 스크립트에서 간단한 문자열 변수 사용

이 예제에서 스크립트는 NSG(네트워크 보안 그룹)의 입력을 받아서 복구 계획의 VM에 적용합니다.

  1. 스크립트가 실행 중인 복구 계획을 검색할 수 있도록 다음 복구 계획 컨텍스트를 사용합니다.

    workflow AddPublicIPAndNSG {
        param (
              [parameter(Mandatory=$false)]
              [Object]$RecoveryPlanContext
        )
    
        $RPName = $RecoveryPlanContext.RecoveryPlanName
    }
    
  2. NSG 이름 및 리소스 그룹을 확인합니다. 이러한 변수는 복구 계획 스크립트에 대한 입력으로 사용합니다.

  3. Automation 계정 자산에서. NSG 이름을 저장할 변수를 만듭니다. 복구 계획의 이름을 사용하여 변수 이름에 접두사를 추가합니다.

    Create an NSG name variable

  4. NSG 리소스의 리소스 그룹 이름을 저장할 변수를 만듭니다. 복구 계획의 이름을 사용하여 변수 이름에 접두사를 추가합니다.

    Create an NSG resource group name

  5. 스크립트에서 다음 참조 코드를 사용하여 변수 값을 가져옵니다.

    Create an NSG resource group name

  6. 스크립트에서 다음 참조 코드를 사용하여 변수 값을 가져옵니다.

    $NSGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSG"
    $NSGRGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSGRG"
    
    $NSGnameVar = Get-AutomationVariable -Name $NSGValue
    $RGnameVar = Get-AutomationVariable -Name $NSGRGValue
    
  7. Runbook에서 변수를 사용하여 장애 조치된 VM의 네트워크 인터페이스에 NSG를 적용합니다.

    InlineScript {
    if (($Using:NSGname -ne $Null) -And ($Using:NSGRGname -ne $Null)) {
            $NSG = Get-AzureRmNetworkSecurityGroup -Name $Using:NSGname -ResourceGroupName $Using:NSGRGname
            Write-output $NSG.Id
            #Apply the NSG to a network interface
            #$vnet = Get-AzureRmVirtualNetwork -ResourceGroupName TestRG -Name TestVNet
            #Set-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $vnet -Name FrontEnd `
            #  -AddressPrefix 192.168.1.0/24 -NetworkSecurityGroup $NSG
        }
    }
    

각 복구 계획마다 개별 변수를 만들어 스크립트를 다시 사용할 수 있도록 합니다. 복구 계획 이름을 사용하여 접두사를 추가합니다.

복잡한 변수를 사용하여 자세한 정보 저장

일부 시나리오에서는 각 복구 계획에 대해 별도의 변수를 만들지 못할 수 있습니다. 단일 스크립트에서 특정 VM의 공용 IP 주소를 할당하는 시나리오를 고려해 보세요. 다른 시나리오에서는 다른 VM(모든 VM이 아님)에 다른 NSG를 적용할 수 있습니다. 다음 사항에 유의합니다.

  • 복구 계획에 재사용 가능한 스크립트를 만들 수 있습니다.
  • 각 복구 계획에는 가변 수의 VM이 있을 수 있습니다.
  • 예를 들어 SharePoint 복구에는 두 개의 프런트 엔드가 있습니다. 기본 LOB(기간 업무) 애플리케이션에는 하나의 프런트 엔드만 있습니다.
  • 이 시나리오에서는 각 복구 계획에 별도의 변수를 만들 수 없습니다.

다음 예제에서는 Azure Automation 계정에 복잡한 변수를 만듭니다.

Azure PowerShell을 사용하여 여러 값을 지정하여 이 작업을 수행합니다.

  1. PowerShell에서 Azure 구독에 로그인합니다.

    Connect-AzureRmAccount
    $sub = Get-AzureRmSubscription -Name <SubscriptionName>
    $sub | Select-AzureRmSubscription
    
  2. 매개 변수를 저장하려면 복구 계획의 이름을 사용하여 복합 변수를 만듭니다.

    $VMDetails = @{"VMGUID"=@{"ResourceGroupName"="RGNameOfNSG";"NSGName"="NameOfNSG"};"VMGUID2"=@{"ResourceGroupName"="RGNameOfNSG";"NSGName"="NameOfNSG"}}
        New-AzureRmAutomationVariable -ResourceGroupName <RG of Automation Account> -AutomationAccountName <AA Name> -Name <RecoveryPlanName> -Value $VMDetails -Encrypted $false
    
  3. 이 복잡한 변수 에서 VMDetails 는 보호된 VM의 VM ID입니다. VM ID를 가져오려면 Azure Portal에서 VM 속성을 확인합니다. 다음 스크린샷은 두 VM의 세부 정보를 저장하는 변수를 보여 줍니다.

    Use the VM ID as the GUID

  4. Runbook에서 이 변수를 사용합니다. 표시된 VM GUID가 복구 계획 컨텍스트에 있으면 VM에서 NSG를 적용합니다.

    $VMDetailsObj = (Get-AutomationVariable -Name $RecoveryPlanContext.RecoveryPlanName).ToObject([hashtable])
    
  5. Runbook에서 복구 계획 컨텍스트의 VM을 반복합니다. VM이 $VMDetailsObj 있는지 확인합니다. 있는 경우 변수의 속성에 액세스하여 NSG를 적용합니다.

        $VMinfo = $RecoveryPlanContext.VmMap | Get-Member | Where-Object MemberType -EQ NoteProperty | select -ExpandProperty Name
        $vmMap = $RecoveryPlanContext.VmMap
    
        foreach ($VMID in $VMinfo) {
            $VMDetails = $VMDetailsObj[$VMID].ToObject([hashtable]);
            Write-output $VMDetails
            if ($VMDetails -ne $Null) { #If the VM exists in the context, this will not be Null
                $VM = $vmMap.$VMID
                # Access the properties of the variable
                $NSGname = $VMDetails.NSGName
                $NSGRGname = $VMDetails.NSGResourceGroupName
    
                # Add code to apply the NSG properties to the VM
            }
        }
    

다른 복구 계획에 동일한 스크립트를 사용할 수 있습니다. 복구 계획에 해당하는 값을 다른 변수에 저장하여 다른 매개 변수를 입력합니다.

샘플 스크립트

Automation 계정에 샘플 스크립트를 배포하려면 Azure에 배포 단추를 선택합니다.

Deploy to Azure

다음 단계