Сбой функции Powershell Azure

Прежде всего, я новичок в функциях Azure и работаю с ними всего пару недель, поэтому, пожалуйста, потерпите меня. Мне было поручено взять один из наших сценариев Powershell, который получает пользователей и лицензии от наших клиентов Office 365, вывести их в CSV, а затем отправить по электронной почте в отслеживаемый почтовый ящик и перенести его в функцию Azure.

После большой работы мне удалось заставить его работать, используя вызов Powershell.exe из моего скрипта из-за того, что некоторые объекты возвращаются «несериализованными», что предотвращает их итерацию. (Известная проблема на GitHub)

Все работало через Test + Code, и я установил триггер времени на 12:00, однако, когда я проверил свой почтовый ящик на следующий день, у меня не было писем. Когда я проверил функцию мониторинга, у меня было перечислено следующее для каждого итерированного арендатора, что, по-видимому, связано с ошибкой при вызове Powershell.exe:

HResult : -2146233087 CategoryInfo : OperationStopped: (:) [], CryptographicException FullyQualifiedErrorId : System.Security.Cryptography.CryptographicException InvocationInfo : ScriptLineNumber : 77 OffsetInLine : 5 HistoryId : -1 ScriptName : C:\home\site\wwwroot\License_Report_a-f\run.ps1 Line : $ScriptResult = (&$64bitPowerShellPath -WindowStyle Hidden -NonInteractive -Command $Script -Args $ApplicationId,$credential,$refreshToken,$tenantID,$client.TenantID) PositionMessage : At C:\home\site\wwwroot\License_Report_a-f\run.ps1:77 char:5 + $ScriptResult = (&$64bitPowerShellPath -WindowStyle Hidden -NonIn … +

PSScriptRoot : C:\home\site\wwwroot\License_Report_a-f PSCommandPath : C:\home\site\wwwroot\License_Report_a-f\run.ps1 CommandOrigin : Internal ScriptStackTrace : at , C:\home\site\wwwroot\License_Report_a-f\run.ps1: line 77

Я провел некоторое расследование по этому поводу и обнаружил, что кто-то ускользнул от того, что были случаи, когда функция не могла прочитать «Profile.ps1», и именно здесь я хотел, но объявление переменной env Powershell.exe, поэтому в качестве теста я переместил задание локально в скрипте. Затем я установил почасовой график на TimeTrigger, и он работал нормально в течение часа. Однако, изменив TimeTrigger обратно на запуск только в 00:00, сегодня утром меня снова не встретили по электронной почте и с той же ошибкой, что, по-видимому, исключило проблему «Profile.ps1».

На данный момент я разочарован тем, что функция отлично работает в Code + Test, но кажется, что если функция простаивает в течение длительного периода времени, когда она снова запускается, она не может загрузить что-то должным образом. У меня был успешный прогон часа вчера в 10:00, 11:00, 12:00, 13:00, 14:00 и 15:00. Затем он оставался без раскрутки в течение 9 часов, а затем вышел из строя. Этим утром я снова обновил TimeTrigger, чтобы он запускался каждый час, чтобы посмотреть, что происходит, и теперь я снова получаю электронные письма, поэтому я сбит с толку. Опять же, я внес изменения и почти «разбудил машину», и теперь все снова работает нормально.

Кто-нибудь видел это раньше или что-то подобное, так как я не уверен, где искать дальше. Может быть, есть какой-то кеш, который очищается, если вы не запускаете функцию в течение x минут / x часов, которая вызывает проблему? Я пару часов искал в сети, но ничего похожего не нашел. Любая помощь / баллы с благодарностью.

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Таким образом, похоже, что я сам обнаружил проблему, однако на самом деле это не объясняет, что именно происходит, но, похоже, это связано с созданием «токенов доступа к графу» для доступа к самому Office 365.

Поиграв на прошлой неделе, я дошел до того, что больше не мог запускать скрипт без вышеуказанной ошибки, даже в «Тестировать + выполнить» в интерфейсе функций Azure. Я решил провести некоторое тестирование сценария, запускаемого внешним вызовом PowerShell, и когда я удалил код, который генерировал «токены доступа к графу», сценарий успешно выполнился. Затем я реструктурировал весь код, чтобы генерировать токены перед вызовом внешнего скрипта PS, а затем вместо этого передавать токены доступа.

После тестирования на выходных я могу подтвердить, что правильно сгенерировал и отправил файлы экспорта по электронной почте, так что теперь все работает нормально. Ниже приведен примерный план начала сценария, просто чтобы продемонстрировать, что у меня получилось.

# Import Modules
Import-Module MsOnline -UseWindowsPowershell
Import-Module PartnerCenter -UseWindowsPowershell
# Get Tokens
$aadGraphToken = New-PartnerAccessToken -ApplicationId $ApplicationId -Credential $credential -RefreshToken $refreshToken -Scopes 'https://graph.windows.net/.default' -ServicePrincipal -Tenant $tenantID
$graphToken = New-PartnerAccessToken -ApplicationId $ApplicationId -Credential $credential -RefreshToken $refreshToken -Scopes 'https://graph.microsoft.com/.default' -ServicePrincipal -Tenant $tenantID
#Connect to Msol
Connect-MsolService -AdGraphAccessToken $aadGraphToken.AccessToken -MsGraphAccessToken $graphToken.AccessToken
# Get Client List
$clientList = Get-MsolPartnerContract -All | Sort-Object -Property Name
# Loop Clients
ForEach ($client in $clientList)
{
    $Script = {
        param (
            [Object]$aadGraphTkn,
            [Object]$graphTkn,
            [string]$clientTenantID
        )        
        # Import Modules
        Import-Module MsOnline
        Import-Module PartnerCenter
        #Connect to Msol
        Connect-MsolService -AdGraphAccessToken $aadGraphTkn.AccessToken -MsGraphAccessToken $graphTkn.AccessToken
        
        # DO OTHER THINGS HERE AND RETURN SOMETHING
    }
    $ScriptResult = (&$env:64bitPowerShellPath -WindowStyle Hidden -NonInteractive -Command $Script -Args $aadGraphToken,$graphTkn)
}

Другие вопросы по теме