我有一个由事件网格事件触发的Azure函数。仅当blob上载到存储帐户时,才会创建事件网格事件。
虽然由于某些原因,该函数仍然会被同一事件触发,即使它已成功处理,但它现在已部署并运行良好?
例子:
今天我查看了日志,该函数已继续执行!
错误:“Blob不存在”
代码片段:
def main(event: func.EventGridEvent):
result = json.dumps({
'id' : event.id,
'data' : event.get_json(),
'topic' : event.topic,
'subject' : event.subject,
'event_type' : event.event_type
})
logging.info('EventGrid trigger processing an event: %s', result)
credential = DefaultAzureCredential()
download_start_time = datetime.datetime.now()
logging.info(f'######## Starting downloading blob from storage at ' + str(download_start_time) + ' ########')
# =============================
# Download blob from storage container:
# =============================
blob_client = BlobClient.from_blob_url(event.get_json()["url"], credential)
blob_data = blob_client.download_blob().readall()
blob_byte_stream = io.BytesIO(blob_data)
编辑1:这仍在发生,这次有点不同。
我如何调试它?
我终于弄清楚了问题是什么...使用 Azure 存储资源管理器测试 blob 上传时,使用BlobClient.from_blob_url
方法工作正常。但是,使用 Azure 数据工厂时,将使用不同的 API,并且 EventGrid 消息中的 data.url
属性不是实际的 blob url(包含 dfs
而不是 blob
)。
奇怪的是,在我向支持团队提出这个问题后不久,一个新的< code>blobUrl属性被添加到EventGrid data
对象中。
在我的代码中,我简单地将“url”改为“blobUrl”,方法成功了。(我还改进了Python代码的错误处理,以适应将来的错误。)
记录的事件网格消息(截至2020年12月10日):
blobUrl
属性[{
"topic": "/subscriptions/{subscription-id}/resourceGroups/Storage/providers/Microsoft.Storage/storageAccounts/my-storage-account",
"subject": "/blobServices/default/containers/my-file-system/blobs/new-file.txt",
"eventType": "Microsoft.Storage.BlobCreated",
"eventTime": "2017-06-26T18:41:00.9584103Z",
"id": "831e1650-001e-001b-66ab-eeb76e069631",
"data": {
"api": "CreateFile",
"clientRequestId": "6d79dbfb-0e37-4fc4-981f-442c9ca65760",
"requestId": "831e1650-001e-001b-66ab-eeb76e000000",
"eTag": "\"0x8D4BCC2E4835CD0\"",
"contentType": "text/plain",
"contentLength": 0,
"contentOffset": 0,
"blobType": "BlockBlob",
"url": "https://my-storage-account.dfs.core.windows.net/my-file-system/new-file.txt",
"sequencer": "00000000000004420000000000028963",
"storageDiagnostics": {
"batchId": "b68529f3-68cd-4744-baa4-3c0498ec19f0"
}
},
"dataVersion": "2",
"metadataVersion": "1"
}]
实际事件网格消息现在通过:
bobUrl
已添加到架构{
"id": "long-string",
"data": {
"api": "CreateFile",
"requestId": "long-string",
"eTag": "0x8D89B4FF7150079",
"contentType": "application/octet-stream",
"contentLength": 0,
"contentOffset": 0,
"blobType": "BlockBlob",
"blobProperties": [{
"acl": [{
"access": "u::rw,u:long-string:rwx,u:long-string:rwx,g::rx,g:long-string:rx,m::rw,o::",
"permission": "0660",
"owner": "long-string",
"group": "$superuser"
}]
}],
"blobUrl": "https://myfunction.blob.core.windows.net/container/20201208/730420201208080239.csv",
"url": "https://myfunction.dfs.core.windows.net/container/20201208/730420201208080239.csv",
"sequencer": "0000000000000000000000000000692c00000000000e1a99",
"identity": "long-string",
"storageDiagnostics": {
"batchId": "long-string"
}
},
"topic": "/subscriptions/long-string/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/storageAccount",
"subject": "/blobServices/default/containers/container/blobs/20201208/730420201208080239.csv",
"event_type": "Microsoft.Storage.BlobCreated"
}
这里还有一个警告…请注意上面消息中的内容长度
CreateFile
API 不是指示已创建 Blob 的实际消息。FlushWithClose
API 是关于这一点,文档中有一个注释。所以我还必须设置一个EventGrid高级过滤器,它只在生成< code>FlushWithClose事件时触发(!idspninfopath _ NV)。)
我已经实现了一个EventGrid触发器来响应Blob存储事件,其逻辑简化如下: 外部API的响应时间不长(1秒或更短),我对主机的配置设置为默认(因此允许无限数量的并发调用)。 当同时添加多个blob(从只有2个blob开始)时,我在日志中得到了很多重复的事件(脚本正在快速地一个接一个地上传blob,中间没有等待时间)。 我觉得这可能是由于我从不承认收到事件,我不知道我是否应该在我的代码中执行此
我的Azure Functions事件网格触发器没有触发。我是这么做的。 Key Vault设置为将事件报告给EventGrid系统主题 此主题由将事件传递到Azure Function的订阅订阅 函数有一个事件网格触发器(见下文,默认由门户创建): 我用谷歌搜索了一下,对于这样的入门级方案,没有更多的指导。我想的也许是授权...订阅如何触发该函数?在此过程中(通过GUI /门户配置),没有任何关
我们有一个 Azure 设置,其中包含一个 Azure 事件网格主题,并且我们有一个 Azure 函数服务,其中包含大约 15 个函数,这些函数通过不同的前缀筛选器订阅该主题。Azure 函数服务设置为基于消耗的资源,应该能够根据需要进行缩放。 每个订阅都设置为在最多4小时内尝试交付10次,然后放弃活动。到目前为止一切顺利,设置大部分时间都按预期工作。 在某些情况下,对于我们未知的情况,事件网格主
在Azure function中,你可以创建一个函数来监听某个事件的变化,比如消息总线、blob存储等等... 如果您正在使用azure功能,并且您的目标是通过侦听事件(如消息总线、blob存储或任何其他内置触发器)来处理某些事情,那么您有什么理由希望将事件网格放在中间层吗?即,您不希望azure函数直接侦听blob存储更改,而是希望azure函数侦听正在侦听blob存储器更改事件的事件网格。 谢
我实现了AWS Eventbridge规则和Lambda函数的基本组合作为其目标。假设该规则基于所有AWS自动缩放事件创建一个事件,并调用Lambda。当触发现有ASG的缩放操作时,此操作效果良好,但当创建具有相同前缀的新ASG时,规则不会做出反应。旧ASG名称:test-ASG-lc-123新ASG名称:test-ASG-lc-124 甚至可以使用通配符吗?
我知道对于http触发函数,您可以设置context.res.status = 501,因此appInsight中的结果代码将更改为501。想知道如何为eventGrid触发的azure函数做同样的事情吗?我们想要一些自定义的结果代码,以便以后可以运行统计数据。