Учетная запись службы автоматизации Azure - ошибка Runbook - ссылка на объект не установлена ​​на экземпляр объекта

На прошлой неделе я развернул сценарий для резервного копирования некоторых дисков с помощью командлета New-AzSnapshot. Я запланировал этот сценарий в учетной записи службы автоматизации Azure, и первые 2 дня он работал очень хорошо!

Сегодня я проанализировал логи и увидел, что в скрипте была следующая ошибка:

Connect-AzAccount: ссылка на объект не соответствует экземпляру объекта. В строке: 12 символов: 25 + $ connectionResult = Connect-AzAccount `+ ~~~~~~~~~~~~~~~~~~~ + CategoryInfo: CloseError: (:) [Connect-AzAccount], NullReferenceException + FullyQualifiedErrorId: Microsoft.Azure.Commands.Profile.ConnectAzureRmAccountCommand

Кто-нибудь знает, что может вызвать эту ошибку?

Ниже скрипта:

Param(
    [string]$resourceGroupName
)

$connection = Get-AutomationConnection -Name AzureRunAsConnection
while (!($connectionResult) -And ($logonAttempt -le 10)) {
    $LogonAttempt++
    # Logging in to Azure...
    $connectionResult = Connect-AzAccount `
        -ServicePrincipal `
        -Tenant $connection.TenantID `
        -ApplicationID $connection.ApplicationID `
        -CertificateThumbprint $connection.CertificateThumbprint

    Start-Sleep -Seconds 30
}

# Remove old snapshots
$snapshotnames = (Get-AzSnapshot -ResourceGroupName $resourceGroupName).name
foreach($snapname in $snapshotnames)
{
    Get-AzSnapshot -ResourceGroupName $resourceGroupName -SnapshotName $snapname | ?{($_.TimeCreated) -lt ([datetime]::UtcNow.AddMinutes(-10080))} | Remove-AzSnapshot -Force
} 

foreach ($VMs in Get-AzVM -ResourceGroupName $resourceGroupName) {  
    #Set local variables 
    $location = $VMs.Location 
    #$resourceGroupName = $vmInfo.ResourceGroupName 
    $timestamp = Get-Date -f MM-dd-yyyy_HH_mm_ss 

    #Snapshot name of OS data disk 
    $snapshotName = "bkp-" + $VMs.Name + "-" + $timestamp 

    #Create snapshot configuration 
    $snapshot = New-AzSnapshotConfig -SourceUri $VMs.StorageProfile.OsDisk.ManagedDisk.Id -Location $location  -CreateOption copy 

    #Take snapshot 
    New-AzSnapshot -Snapshot $snapshot -SnapshotName $snapshotName -ResourceGroupName $resourceGroupName  



    if ($VMs.StorageProfile.DataDisks.Count -ge 1) { 
        #Condition with more than one data disks 
        for ($i = 0; $i -le $VMs.StorageProfile.DataDisks.Count - 1; $i++) { 

            #Snapshot name of OS data disk 
            $snapshotName = "bkp-" + $VMs.StorageProfile.DataDisks[$i].Name + "-" + $timestamp

            #Create snapshot configuration 
            $snapshot = New-AzSnapshotConfig -SourceUri $VMs.StorageProfile.DataDisks[$i].ManagedDisk.Id -Location $location  -CreateOption copy 

            #Take snapshot 
            New-AzSnapshot -Snapshot $snapshot -SnapshotName $snapshotName -ResourceGroupName $resourceGroupName  

        } 
    } 
    else { 
        Write-Host $VMs.Name + " doesn't have any additional data disk." 
    } 
}

person Daniel Ribeiro    schedule 18.02.2020    source источник


Ответы (1)


У вас есть исключение с нулевой ссылкой, глядя на местоположение внутри сообщения об ошибке (в строке: 12 символов: 25). он показывает, что connection имеет значение NULL.

Вам нужно сначала объявить connection на той же странице, прежде чем вы сможете использовать переменные внутри.

См. Также: Что такое исключение NullReferenceException и как мне исправить?

РЕДАКТИРОВАТЬ: при втором уведомлении я думаю, что вы уже объявляете $connection в

$connection = Get-AutomationConnection -Name AzureRunAsConnection

но похоже, что это возвращает null. В этом случае вам нужно выяснить, почему он возвращает null, потому что он должен возвращать заполненный $connection, если он подключен.

Для безопасной проверки во избежание ошибок: вы должны сначала проверить, не является ли $connection нулевым, прежде чем вводить время (например, $connection != null может работать для Javascript). Таким образом, вы не получите ошибок, но имейте в виду, что вы не получите результата.

person Steven    schedule 18.02.2020
comment
Привет, Стивен, спасибо за ответ. В этом случае следует ли инициализировать переменную $ connectionResult следующим образом: $ connectionResult = $ null? - person Daniel Ribeiro; 18.02.2020
comment
Это не сработает, это $connection имеет значение null, а не $connectionResult. Я добавил в свой ответ дополнительную информацию. - person Steven; 18.02.2020