【问题标题】:Event Grid-triggered Function Keeps Triggering After Function Successfully Runs?事件网格触发的函数在函数运行成功后一直触发?
【发布时间】:2021-01-22 23:18:07
【问题描述】:

我有一个由事件网格事件触发的 Azure 函数。事件网格事件仅在将 blob 上传到存储帐户时创建。

尽管由于某种原因,即使成功处理,该函数仍不断被同一事件触发,但现在已部署并运行良好?

示例:

  • 昨天,8次成功的测试;都好:

  • 今天查看日志,功能继续执行!

  • 错误:“Blob 不存在”

  • 我昨天上次测试后删除了 blob。为什么事件网格仍在触发?

代码 sn-p:

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:这仍在发生,这次有点不同。

  • 现在,EventGrid 在成功传递消息并且函数运行后继续触发

如何调试?

【问题讨论】:

  • 您的堆栈似乎有问题。你用的是虚拟环境吗?你能发布一些细节,比如你的测试代码吗?
  • 我在本地开发环境中使用.venv,但此函数是在 Azure 中托管和触发的,而不是在本地。我没有任何测试代码要分享。该函数现已停止触发,但我想了解将来如何调试此问题。
  • 好的...由于我们看不到您的代码,我不相信原因。但是我看到有一个 _download.py 文件,你是要下载已经删除的 blob 吗?也许你应该检查一下。@ericOnline
  • 用于测试目的:设置 maxDeliveryAttempts = 3dead-lettering,这将为您提供有关失败交付的更多详细信息,docs.microsoft.com/en-us/azure/event-grid/…
  • 这种情况仍在发生。这很烦人(特别是因为我们按函数调用收费)。为什么EventGrid在成功传递消息后一直触发?

标签: azure-functions azure-eventgrid


【解决方案1】:

我终于弄清楚了问题所在...在使用 Azure 存储资源管理器测试 blob 上传时,使用 BlobClient.from_blob_url 方法效果很好。但是在使用 Azure 数据工厂时,会使用不同的 API,并且 EventGrid 消息中的 data.url 属性不是实际的 blob url(包含 dfs 而不是 blob)。

奇怪的是,在我将此问题提交给支持团队后不久,EventGrid data 对象中添加了一个新的 blobUrl 属性。

在我的代码中,我只是将“url”更改为“blobUrl”,该方法成功了。 (我还改进了 Python 代码的错误处理,以适应未来的此类错误。)

DocumentedEventGrid 消息(截至 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"
}]

现在通过的实际 EventGrid 消息:

  • 通知blobUrl 已添加到架构中
{
    "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"
}

这里还有一个警告......请注意上面消息中的Content-Length

  • CreateFile API 不是指示 blob 已创建的实际消息。
  • FlushWithClose API 是

文档中有关于此的注释。所以我还必须设置一个 EventGrid 高级过滤器,它只在生成 FlushWithClose 事件时触发(!)

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多