>source

Event Grid Events에 의해 트리거되는 Azure 함수가 있습니다. Event Grid 이벤트는 Blob이 Storage 계정에 업로드 될 때만 생성됩니다.

어떤 이유로 든 함수가 성공적으로 처리 된 경우에도 동일한 이벤트에 의해 계속 트리거되지만 이제 배포되고 잘 작동합니다.

예:

  • 어제 8 번의 성공적인 테스트;문제 없다:

  • 오늘은 로그를 검토하고 기능이 계속 실행되었습니다!

  • 오류 : "Blob이 존재하지 않습니다"

  • 어제 마지막 테스트 후에 blob을 삭제했습니다. Event Grid가 여전히 실행되는 이유는 무엇입니까?

코드 조각 :

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는 메시지를 성공적으로 전달하고 함수가 실행 된 후에도 계속 실행됩니다.

이것을 어떻게 디버깅합니까?

  • 답변 # 1

    나는 마침내 문제가 무엇인지 알아 냈습니다. BlobClient.from_blob_url Azure Storage Explorer를 사용하여 Blob 업로드를 테스트 할 때 메서드가 제대로 작동했습니다. 그러나 Azure Data Factory를 사용할 때 다른 API가 사용되며 data.url EventGrid 메시지의 속성이 실제 Blob URL이 아닙니다 (포함 된 dfs 대신에 blob ).

    이상하게도 지원팀에이 문제를 제기 한 직후 새로운 blobUrl 속성이 EventGrid에 추가되었습니다. data 목적.

    내 코드에서 "url"을 "blobUrl"로 변경하고 메서드가 성공했습니다. (또한 향후 이러한 오류를 수용하기 위해 Python 코드의 오류 처리를 개선했습니다.)

    문서화 된 EventGrid 메시지 (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는

    이것에 대한 문서에 메모가 있습니다. 그래서 저는 이벤트 그리드 고급 필터를 설정해야했습니다. FlushWithClose 이벤트가 생성됩니다 (!)

  • 이전 apache spark - 하나의 DF 행을 다른 DF의 여러 행으로 나누기
  • 다음 ios - 뷰가로드 될 때 컨트롤 페이드 인 (상태 변경 후 삽입되지 않음)