Функция Azure. Как добавить строку в облачную таблицу при создании блоба? - PullRequest
1 голос
/ 08 июля 2019

Я разрабатываю функцию Azure, которая должна добавлять новую строку в таблицу Azure при добавлении нового большого двоичного объекта.У приложения есть много контейнеров в хранилище BLOB-объектов, и моя функция Azure должна обрабатывать все BLOB-объекты из всех контейнеров.

Я пытался реализовать получение событий с помощью EventGrid, но выдает ошибку.

Моя функция Azure:

#r "D:\home\site\wwwroot\BlobCreatedFunction\Microsoft.Azure.EventGrid.dll"
#r"D:\home\site\wwwroot\BlobCreatedFunction\Microsoft.WindowsAzure.Storage.dll"
    using Microsoft.Azure.EventGrid.Models;
    using Microsoft.WindowsAzure.Storage.Table;
    using System;
public class TemporaryBlobEntity : TableEntity
{
    public TemporaryBlobEntity(string partitionKey, string rowKey)
    {
        this.PartitionKey = partitionKey;
        this.RowKey = rowKey;
    }

    public string BlobUrl { get; set; }
    public DateTime BlobUploaded { get; set; }

}
public static TemporaryBlobEntity Run(EventGridEvent eventGridEvent, ILogger log)
{
    if (eventGridEvent.Data is StorageBlobCreatedEventData eventData)
    {
        log.LogInformation(eventData.Url);

        log.LogInformation(eventGridEvent.Data.ToString());

        var temporaryBlob = new TemporaryBlobEntity("blobs", eventData.Url)
        {
            BlobUrl = eventData.Url,
            BlobUploaded = DateTime.UtcNow
        };

        return temporaryBlob;
    }

    return null;
}

Здесьмоя интеграция JSON:

{
  "bindings": [
    {
      "type": "eventGridTrigger",
      "name": "eventGridEvent",
      "direction": "in"
    },
    {
      "type": "table",
      "name": "$return",
      "tableName": "temporaryBlobs",
      "connection": "AzureWebJobsStorage",
      "direction": "out"
    }
  ]
}

В настройках функции Azure я добавил значение для AzureWebJobsStorage.

Когда я нажимаю Выполнить в раздел теста , логи показывают:

2019-07-08T13:52:16.756 [Information] Executed 'Functions.BlobCreatedFunction' (Succeeded, Id=6012daf1-9b98-4892-9560-932d05857c3e)

Выглядит хорошо, но в облачной таблице нет нового элемента.Почему?

Затем я попытался связать свою функцию с темой EventGrid.Я заполнил новую форму подписки, выбрал «Web Hook» в качестве типа конечной точки и установил конечную точку подписчика: https://<azure-function-service>.azurewebsites.net/runtime/webhooks/EventGrid?functionName=<my-function-name>.Затем я получил следующее сообщение об ошибке:

Deployment has failed with the following error: {"code":"Url validation","message":"The attempt to validate the provided endpoint https://####.azurewebsites.net/runtime/webhooks/EventGrid failed. For more details, visit https://aka.ms/esvalidation."}

Насколько я понимаю, приложению требуется своего рода проверка запроса.Действительно ли мне нужно реализовать проверку в каждой из моих функций Azure?Или я должен использовать другой тип конечной точки?

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Когда вы вводите webhook в Event Grid, он отправляет запрос, чтобы убедиться, что у вас действительно есть разрешения для этой конечной точки.Самый простой способ подключить функцию к сетке событий - создать подписку из приложения «Функции» вместо блейда «Сетка событий».

При открытии функции на портале вверху вы найдете ссылку «Добавить»Подписка на Event Grid ".Даже если приложение «Функции» было создано локально и опубликовано в Azure, поэтому код недоступен для просмотра, ссылка будет доступна.enter image description here

Откроется экран для создания подписки на сетку событий.Разница в том, что вместо того, чтобы предварительно заполнять информацию о теме таблицы событий, вам будет предварительно заполнена информация о веб-хуке.Заполните информацию о теме «Сетка событий», чтобы завершить создание подписки.

enter image description here

Если вы по какой-либо причине решите реализовать ответ проверки,это можно сделать, проверив тип сообщения.

// Validate whether EventType is of "Microsoft.EventGrid.SubscriptionValidationEvent"
if (eventGridEvent.EventType == "Microsoft.EventGrid.SubscriptionValidationEvent")
{
    var eventData = (SubscriptionValidationEventData)eventGridEvent.Data;
    // Do any additional validation (as required) such as validating that the Azure resource ID of the topic matches
    // the expected topic and then return back the below response
    var responseData = new SubscriptionValidationResponse()
    {
        ValidationResponse = eventData.ValidationCode
    };


    if (responseData.ValidationResponse != null)
    {

        return Ok(responseData);
    }
}
else
{
    //Your code here
}

Существует также возможность проверить ссылку вручную , получив ссылку проверки из сообщения проверки иперейдя к нему в вашем браузере.Этот метод предназначен в первую очередь для сторонних служб, где вы не можете добавить проверочный код.

1 голос
/ 10 июля 2019

Ниже перечислены изменения в вашей функции EventGridTrigger:

#r "Microsoft.WindowsAzure.Storage"
#r "Microsoft.Azure.EventGrid"
#r "Newtonsoft.Json"

using System;
using Newtonsoft.Json.Linq;
using Microsoft.Azure.EventGrid.Models;
using Microsoft.WindowsAzure.Storage.Table;

public static TemporaryBlobEntity Run(EventGridEvent eventGridEvent, ILogger log)
{
    log.LogInformation(eventGridEvent.Data.ToString());

    var eventData = (eventGridEvent.Data as JObject)?.ToObject<StorageBlobCreatedEventData>();
    if(eventData?.Api == "PutBlob")
    {  
        log.LogInformation(eventData.Url);

        return new TemporaryBlobEntity("blobs", eventData.Sequencer)   
        {
            BlobUrl = eventData.Url,
            BlobUploaded = DateTime.UtcNow
        };   
    }
    return null;     
}

public class TemporaryBlobEntity : TableEntity
{
    public TemporaryBlobEntity(string partitionKey, string rowKey)
    {
        this.PartitionKey = partitionKey;
        this.RowKey = rowKey;
    }

    public string BlobUrl { get; set; }
    public DateTime BlobUploaded { get; set; }
}

Примечания:

  1. Вам не нужно проверять функцию EventGridTrigger для конечной точки подписки AEG webhook.Эта проверка является встроенной предварительной обработкой функции EventGridTrigger.
  2. Свойство eventGridEvent.Data является объектом JObject и должно быть преобразовано (десериализовано) в StorageBlobCreatedEventData объект, см. здесь .
  3. Для RowKey PartitionKey ) см. Символы ограничения в здесь , поэтому в этом примере я изменил его на значение Sequencer.
  4. Конечная точка webhook подписки AEG для функции EventGridTrigger имеет следующий формат:

    https://{azure-function-service}.azurewebsites.net/runtime/webhooks/EventGrid?functionName={my-function-name}&code={systemkey}
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...