建立PowerShell Azure Durable Function,執行大量的PowerShell指令碼操作Azure Resource,遇見了一個非常非常奇怪的問題:
Function 'Hello1 (Activity)' failed with an error. Reason: Newtonsoft.Json.JsonReaderException: The reader's MaxDepth of 64 has been exceeded. Path '[9].Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.StorageAccount.BlobStorageUri', line 1, position 103037.
at Newtonsoft.Json.JsonReader.Push(JsonContainerType value)
at Newtonsoft.Json.JsonTextReader.ParseValue()
at Newtonsoft.Json.JsonWriter.WriteToken(JsonReader reader, Boolean writeChildren, Boolean writeDateConstructorAsDate, Boolean writeComments)
at Newtonsoft.Json.Linq.JTokenWriter.WriteToken(JsonReader reader, Boolean writeChildren, Boolean writeDateConstructorAsDate, Boolean writeComments)
Stack: .
Function 'Hello1 (Activity)' failed with an error. Reason: Newtonsoft.Json.JsonReaderException: The reader's MaxDepth of 64 has been exceeded.
Path '[9].Context.
Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.
Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.
Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.
Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.
Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.
Context.Context.Context.Context.Context.Context.Context.Context.Context.Context.
StorageAccount.BlobStorageUri', line 1, position 103037. at Newtonsoft.Json.JsonReader.Push(JsonContainerType value)
因為異常中的Stack並沒有指明是那一句程式碼引起的異常,所以只好使用最笨的辦法。
一行程式碼一行程式碼的偵錯。
最終,在對程式碼進行逐句逐句的註釋後執行,定位到是 New-AzStorageAccount的問題。當註釋掉這一句後,問題消失。
New-AzStorageAccount -ResourceGroupName $rgName -Name $storageName -SkuName Standard_LRS -Location $region -AllowBlobPublicAccess $false
但是,為什麼它會導致Function App執行出現如此詭異的問題呢?
(單獨執行 New-AzStorageAccount 程式碼,發現它的輸出資訊為一個表格物件)
Durable Function會把執行的輸出進行轉換為JSON Object並儲存在Activity 函數的紀錄檔中。
因為Function Runtime在轉換這個物件時,觸發了Newtonsoft.Json.JsonReaderException: The reader's MaxDepth of 64 has been exceeded. 異常。 就是這個物件的深度達到了JSON的最大深度64。
基於問題原因,可以主動修改New-AzStorageAccount 的結果輸出,可以把輸出到檔案中,或者轉換為 JSON格式,來避免問題。
New-AzStorageAccount -ResourceGroupName $rgName -Name $storageName -SkuName Standard_LRS -Location $region -AllowBlobPublicAccess $false *> script.log
New-AzStorageAccount -ResourceGroupName $rgName -Name $storageName -SkuName Standard_LRS -Location $region -AllowBlobPublicAccess $false | ConvertTo-Json
經測試,兩種方式都可以解決問題。
當在複雜的環境中面臨問題,格物之道需:濁而靜之徐清,安以動之徐生。 雲中,恰是如此!