azure - Azure 自动化帐户 - Runbook 错误 - 对象引用未设置为对象的实例
问题描述
上周,我部署了一个脚本来使用 New-AzSnapshot cmdlet 备份一些磁盘。我在 Azure 自动化帐户中安排了这个脚本,前 2 天,这个脚本运行得非常好!
今天,我分析了日志,发现脚本有以下错误:
Connect-AzAccount :对象引用未设置为对象的实例。在 line:12 char: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."
}
}
解决方案
查看错误消息中的位置(在 line:12 char:25),您遇到了 nullreference 异常。它表明那connection
是空的。
您需要connection
先在同一页面上声明,然后才能使用其中的变量。
另请参阅:什么是 NullReferenceException,我该如何解决?
编辑:在第二次通知,我认为你已经宣布$connection
at
$connection = Get-AutomationConnection -Name AzureRunAsConnection
但它看起来像返回null。在这种情况下,您需要弄清楚为什么返回 null,因为$connection
如果已连接,它应该返回已填充。
为了安全检查以避免错误:您应该$connection
在输入 while 之前首先检查是否不为空,(例如$connection != null
,可以用于 Javascript)。这样你就不会得到错误,但请记住,你不会通过这个得到结果。
推荐阅读
- java - Mockito 测试 查看可见性
- javascript - 将 hasOwnProperty 作为键并且 while 循环会引发错误
- java - 导航抽屉后按片段不加载
- sonarqube - Sonarqube 和 SonarScanner 之间的区别
- java - Firestore 获得最喜欢的帖子
- javascript - 根据循环的选择框选择动态显示和隐藏字段
- java - Spring 验证 JSR-303 @NotNull 抛出 NotReadablePropertyException
- python - Python3 - txt 中的类和模拟输出。文件
- sql - SQL Server:从插入选择返回连接数据
- javascript - 更改刚刚创建的频道的权限