我正在使用Azure函数来处理存储在Azure存储表中的数据。Azure函数是在PowerShell中编写的,由计时器触发,每分钟运行一次。每次运行时,它将获取前10个未处理的行,处理这些行中的每一行,然后通过将字段“已处理”设置为true将该行标记为已处理。但是,似乎通过使用输出绑定我不能更新一行。
我尝试使用以下配置和代码更新行。
函数绑定:
{
"tableName": "tobeprocessed",
"connection": "ProcessStorage",
"name": "InProcessStorageTableBinding",
"type": "table",
"direction": "in"
},
{
"tableName": "tobeprocessed",
"connection": "ProcessStorage",
"name": "OutProcessStorageTableBinding",
"type": "table",
"direction": "out"
}
功能代码:
param($Timer, $InProcessStorageTableBinding)
# Get first ten unprocessed rows
$InProcessStorageTableBinding | Where-Object { $_.Processed -eq $false } | Select-Object -First 10 | ForEach-Object {
# Logic for processing the values in the row
# left out for the sake of brevity
# Update the row
$_.Processed = $true
Push-OutputBinding -Name OutProcessStorageTableBinding -Value $_
}
在Azure门户上的Azure函数的日志中显示的消息是:
指定的实体已存在。RequestId:da 4224 dd-0002-0071-0671- 70 a732000000时间:2023-04- 16 T14:38:05.4671520Z
在互联网上搜索可能的解决方案时,我发现人们正在使用PowerShell模块AzTable
中的Get-AzStorageTable
和Update-AzTableRow
来更新Azure存储表中的行。但这样做需要更多的配置(证书、租户和应用ID,等等),因为似乎通过使用Update-AzTableRow
我们不能使用out绑定。绑定是Azure Functions的一个很好的功能,因为它在后台处理所有的身份验证和连接设置,所以如果可能的话,我真的更喜欢使用外装订。
更新:正如Peter Bons在下面的回答中指出的,关于Azure Tables output bindings的文档非常清楚地表明,使用绑定是不可能进行更新的。
那么,是否有可能重用由绑定设置的连接(部分),以减少所需的管道,以便能够使用(例如)PowerShell模块AzTable
来更新行?
所以我们可以做这样的事情:
$table = Get-AzStorageTable –Connection $InProcessStorageTableBinding.Connection
$cloudTable = $table.CloudTable
$rowToProcess = Get-AzTableRow `
-table $cloudTable `
-customFilter <filter to retrieve row>
$rowToProcess.Processed = $true
$rowToProcess | Update-AzTableRow -table $cloudTable
1条答案
按热度按时间yizd12fk1#
你的运气恐怕不好。The docs证实你的怀疑:
此输出绑定仅支持在表中创建新实体。如果需要从函数代码更新现有实体,请直接使用Azure Tables SDK。