Ошибка при запуске кода PowerShell в автоматизации Azure.

Я установил политику Azure, добавив два тега: CreatedTime и Type. Значение CreatedTime равно utcNow(), формат по умолчанию — 'yyyy-MM-ddTHH:mm:ss.fffffffZ'..

Моя цель — удалить все ресурсы, чей Тип равен private, а время создания превышает 2 дня, запустив powershell. код в автоматизации Azure.

Я сделал это в Power Shell локально, но когда я запустил код в автоматизации, это не удалось. Я опубликую код и страницу с ошибкой ниже.

Кто-нибудь может сказать мне, что не так с моим кодом? Или я что-то пропустил?

Это мой код в службе автоматизации Azure:

   $connectionName = "AzureRunAsConnection"
try
{
    # Get the connection "AzureRunAsConnection "
    $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName         

    "Logging in to Azure..."
    Add-AzureRmAccount `
        -ServicePrincipal `
        -TenantId $servicePrincipalConnection.TenantId `
        -ApplicationId $servicePrincipalConnection.ApplicationId `
        -CertificateThumbprint 
$servicePrincipalConnection.CertificateThumbprint 
}
catch {
    if (!$servicePrincipalConnection)
    {
        $ErrorMessage = "Connection $connectionName not found."
        throw $ErrorMessage
    } else{
        Write-Error -Message $_.Exception
        throw $_.Exception
    }
}

    $AllRes = (get-AzureRMResource).ResourceId
    $TimeOutDays=2
    foreach ($Res in $AllRes){
    $Resource = Get-AzureRMResource -ResourceId $Res
    $Tags=$Resource.Tags
    $TypeInTags=$Tags['Type']
    $CreatedTimeInTags=$Tags['CreatedTime']
try{
    $CreatedTime=[Datetime]::ParseExact($CreatedTimeInTags, 'MM/dd/yyyy HH:mm:ss', $null)
}
catch{
    $CreatedTime=[Datetime]::ParseExact($CreatedTimeInTags, 'yyyy-MM-ddTHH:mm:ss.fffffffZ', $null)
}
finally
{
    $CreatedTime
}
    $daypan=((get-date)-$CreatedTime).Days
    if($TypeInTags -eq 'private')
    {
    if($daypan -gt $TimeOutDays)
        {
            $daypan
            Remove-AzureRMResource -ResourceId $Res -Force
        }
    }
}

Это страница с ошибкой: Suspended

The runbook job was attempted 3 times, but it failed each time.  Common reasons that runbook jobs fail can be found here:  https://docs.microsoft.com/en-us/azure/automation/automation-troubleshooting-automation-errors

введите здесь описание изображения

Фрагмент сообщения об ошибке:

Get-AzureRMResource : ResourceNotFound : The Resource 
'microsoft.alertsmanagement/smartDetectorAlertRules/Failure+Anomalies+-+arrowbottest2-config' under resource group 
'arrowbot2' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix
At line:28 char:17
+     $Resource = Get-AzureRMResource -ResourceId $Res
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Get-AzureRmResource], ErrorResponseMessageException
    + FullyQualifiedErrorId : 
ResourceNotFound,Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.GetAzureResourceCmdlet
 
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
At line:34 char:5
+     $CreatedTime=[Datetime]::ParseExact($Tags['CreatedTime'], 'yyyy-M ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FormatException
 
Cannot find an overload for "op_Subtraction" and the argument count: "2".
At line:35 char:5
+     $daypan=((get-date)-$CreatedTime).Days
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest
 

Cannot find an overload for "op_Subtraction" and the argument count: "2".
At line:35 char:5
+     $daypan=((get-date)-$CreatedTime).Days
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest
 
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
At line:34 char:5
+     $CreatedTime=[Datetime]::ParseExact($Tags['CreatedTime'], 'yyyy-M ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FormatException

Для типа $Tags['CreatedTime'] я сделал это для теста: $Tags['CreatedTime'].GetType().FullName.

введите здесь описание изображения


person Doris Lv    schedule 04.08.2020    source источник
comment
Вы можете опубликовать вывод $CreatedTimeInTags   -  person Martin Brandl    schedule 04.08.2020
comment
Вы имеете в виду вывод $CreatedTimeInTags в автоматизации?   -  person Doris Lv    schedule 04.08.2020
comment
Да. Похоже, что синтаксический анализ даты не удается, поэтому вы можете просто опубликовать вывод переменной?   -  person Martin Brandl    schedule 04.08.2020
comment
Может быть, все работает, если просто заменить строку, где вы разбираете дату, на это: [datetime]$CreatedTime = $Tags['CreatedTime']   -  person Martin Brandl    schedule 04.08.2020
comment
Хорошо, я перезапускаю этот код, и это займет некоторое время, подождите, пожалуйста.   -  person Doris Lv    schedule 04.08.2020
comment
Не повезло, это не сработало. @МартинБрэндл   -  person Doris Lv    schedule 04.08.2020
comment
Извините, сообщения об ошибке слишком много, чтобы опубликовать их все, я взял его часть. @DanielBjörk   -  person Doris Lv    schedule 04.08.2020


Ответы (2)


Поскольку вы говорите, что значение CreatedTime равно utcNow(), это значение уже является объектом DateTime, и вы не должны рассматривать его как строку. (вы думаете, что это строка, потому что когда вы записываете ее в консоль, она показывает ее ToString() представление)

Просто сделайте

$CreatedTime=$Tags['CreatedTime']

Вы можете проверить это с помощью хоста записи $Tags['CreatedTime'].GetType().FullName

person Theo    schedule 04.08.2020
comment
@DorisLv Итак, что раскрывает Write-Host $Tags['CreatedTime'].GetType().FullName? (Пожалуйста, не комментируйте каждый раз такие вещи, как не работает. Объясните, что происходит, и добавьте ПОЛНОЕ исключение в вопрос в виде форматированного текста.) - person Theo; 05.08.2020
comment
Я обновил свой код в своем вопросе. Я пробовал ваше предложение раньше, и появляется та же ошибка. Несмотря на то, что я установил значение тега utcNow(), оно приходит к строке, отличной от объекта DateTime, когда я делаю это: $CreatedTimeInTags=$Tags['CreatedTime'] . - person Doris Lv; 06.08.2020
comment
@DorisLv Пожалуйста, покажите нам, что вы получаете, делая Write-Host $Tags['CreatedTime'].GetType().FullName. Я по-прежнему считаю, что это НЕ строка, а объект DateTime. Вы просто не проверяете тип и поэтому видите только строковое представление даты. - person Theo; 07.08.2020
comment
Я обновляю изображение в своем теле вопроса, вы это ясно видите. @Тео - person Doris Lv; 10.08.2020

Есть две вещи неправильные.

1.Не указал нужный мне ресурс.

Подробнее:

Вот причина сообщения об ошибке: Can not index to a null array. Я просматриваю весь ресурс в своей подписке, но ресурсы, созданные до того, как я установил политику, не имеют тега с именем "CreatedTime" или "Type", поэтому, когда я запускаю $Tags=$Resource.Tags, он говорит Can not index to a null array.

Мое решение:

Выполните $AllRes = (get-AzResource -TagName "CreatedTime").ResourceId, кроме $AllRes = (get-AzureRMResource).ResourceId. Я обнаружил, что модуль AzureRM не распознает -TagName как переменную, поэтому я импортирую модуль Az и заменяю каждый модуль AzureRM на модуль Az.

2. Путают с utcNow().

Подробности:

Как я уже сказал, с помощью функции utcNow() я получаю объект DateTime с форматом по умолчанию 'yyyy-MM-ddTHH:mm:ss.fffffffZ', после большого тестирования я обнаружил, что некоторые специальные ресурсы, такие как значение тега Application Insight, не отформатированы с 'yyyy-MM-ddTHH:mm:ss.fffffffZ', и когда я вызываю его, он приходит к строка.

Мое решение:

Поэтому, когда я использую его по сравнению с get-date, мне нужно сделать две вещи:

(1) Измените строку на объект DateTime;

(2) Используйте try-catch для соответствия двум типам форматов.

person Doris Lv    schedule 06.08.2020