我在powershell中创建了一个azure自动化帐户,以获取特定容器中文件的名称和大小。
我通过Azure Data通过Web钩子活动运行这段代码。
对于中小型容器来说,代码运行得非常好。
问题是,当我试图为一个已经有大量文件的容器运行代码时,它会尝试3次,然后被挂起,什么也不会发生。我看到了日志我看到了这样的信息:
由于沙箱内存不足,运行簿作业失败。每个Azure自动化沙箱分配400 MB内存。这项工作在暂停之前曾尝试过三次。在https://aka.ms/AAMemoryLimit上看到一些解决这一问题的常用方法
有没有人知道如何解决这种情况,或者是否有可能增加内存?谢谢!
PS代码:
#define parameters
param (
[Parameter (Mandatory = $false)]
[object] $WebHookData,
[string]$StorageAccountName,
[string]$StorageAccountKey
)
$Parameters = (ConvertFrom-Json -InputObject $WebHookData.RequestBody)
<#If ($Parameters.callBackUri)
{
$callBackUri = $Parameters.callBackUri
}#>
$containerName = $Parameters.containerName
"->"+$StorageAccountName
"->"+$StorageAccountKey
$connectionName = "AzureRunAsConnection"
try
{
# Get the connection "AzureRunAsConnection "
$servicePrincipalConnection=Get-AutomationConnection -Name $connectionName
"Logging in to Azure..."
Connect-AzAccount `
-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
}
}
#storage account
$StorageAccountName = $StorageAccountName
#storage key
$StorageAccountKey = $StorageAccountKey
#Container name - change if different
$containerName = $containerName
#get blob context
$Ctx = New-AzStorageContext $StorageAccountName -StorageAccountKey $StorageAccountKey
# get a list of all of the blobs in the container
$listOfBlobs = Get-AzStorageBlob -Container $containerName -Context $Ctx
# zero out our total
$length = 0
# this loops through the list of blobs and retrieves the length for each blob
# and adds it to the total
$listOfBlobs | ForEach-Object {$length = $length + $_.Length}
# output the blobs and their sizes and the total
Write-Host "List of Blobs and their size (length)"
Write-Host " "
$select = $listOfBlobs | Select-Object -Property @{Name='ContainerName';Expression={$containerName}}, Name, @{name="Size";expression={$($_.Length)}}, LastModified
#$listOfBlobs | select Name, Length, @{Name='ContainerName';Expression={$containerName}}
Write-Host " "
Write-Host "Total Length = " $length
#Define location and Export to CSV file
$SourceLocation = Get-Location
$select | Export-Csv $SourceLocation'File-size/File-size-'$containerName'.csv' -NoTypeInformation -Force -Encoding UTF8
$Context = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
Set-AzureStorageBlobContent -Context $Context -Container "Name" -File $SourceLocation"File-size/File-size-$containerName.csv" -Blob "File-Size/File-size-$containerName.csv" -Force发布于 2022-08-09 11:49:38
我也有过同样的情况..。
不能增加运行时的内存。您可以下载一个混合工人代理(或者不管现在重命名它),以使azure自动化帐户在您的本地计算机或您设置的服务器上运行您的脚本。
内存问题是由$listOfBlobs = Get-AzStorageBlob ...引起的。
您不能一次全部拉出它们,必须使用分页(或者换句话说,按批列出)。
$MaxReturn = 10000
$ContainerName = "abc"
$Total = 0
$Token = $Null
do
{
$Blobs = Get-AzStorageBlob -Container $ContainerName -MaxCount $MaxReturn -ContinuationToken $Token
$Total += $Blobs.Count
if($Blobs.Length -le 0) { Break;}
$Token = $Blobs[$blobs.Count -1].ContinuationToken;
}
While ($null -ne $Token)
Echo "Total $Total blobs in container $ContainerName"发布于 2022-08-20 16:48:05
默认情况下,runbooks在Azure沙箱上执行,这些沙箱是MS管理的机器,每个帐户/执行都有特定的资源配额,作为合理使用策略。
对于资源短缺和长期运行的作业,建议采用用户混合工作模式执行.
在这种模式下,您可以将机器添加为混合工作节点(可以是or或cloud ),这些节点有足够的资源来执行工作负载。
您可以在这里参考我的博客,以了解如何配置用于工作负载执行的混合工作节点和本地/云机器。
https://stackoverflow.com/questions/73289720
复制相似问题