Прием данных Kusto из приложения-функции Azure заканчивается ошибкой 403

Я пытаюсь загрузить данные из приложения-функции Azure в базу данных ADX. Я следовал инструкциям, приведенным в статье здесь.

Разница в том, что я хочу вставить данные в таблицу. Я борюсь с ошибкой 403 "Принципал 'aadapp=;' не авторизован для доступа к таблице "

Что я сделал: я создал приложение AAD со следующими разрешениями API: Разрешение, настроенное для приложения AAD

Я настроил базу данных через Kusto Explorer:

.add база данных myDB ingestors ('aadapp=;') 'theAADAppname'

.add таблица Ingestors PressureRecords ('aadapp=;') 'theAADAppname'

.add table ингесторы TemperatureRecords ('aadapp=;') 'theAADAppname'

Мой код:

 var kcsbDM = new KustoConnectionStringBuilder($"https://ingest-{serviceNameAndRegion}.kusto.windows.net:443/").WithAadApplicationKeyAuthentication(
            applicationClientId: "<my AD app Id>",
            applicationKey: "<my App Secret from Certificates & secrets>",
            authority: "<my tenant Id>");

        using (var ingestClient = KustoIngestFactory.CreateQueuedIngestClient(kcsbDM))
        {

            var ingestProps = new KustoQueuedIngestionProperties(databaseName, tableName);
            ingestProps.ReportLevel = IngestionReportLevel.FailuresAndSuccesses;
            ingestProps.ReportMethod = IngestionReportMethod.Queue;
            ingestProps.JSONMappingReference = mappingName;
            ingestProps.Format = DataSourceFormat.json;

            using (var memStream = new MemoryStream())
            using (var writer = new StreamWriter(memStream))
            {
                var messageString = JsonConvert.SerializeObject(myObject); // maps to the table / mapping 
                writer.WriteLine(messageString);
                writer.Flush();
                memStream.Seek(0, SeekOrigin.Begin);

                // Post ingestion message
                ingestClient.IngestFromStream(memStream, ingestProps, leaveOpen: true);
            }

2 ответа

Решение

Обновление: проблема исправлена ​​в системе, и теперь она работает должным образом.

Авнера благодарит за подсказку, возможно, это проблема из-за реального и двойного перевода. В одной из своих первых попыток я использовал удвоение в таблице, и это сработало. Это невозможно, похоже, поддерживаемые типы данных изменились.

Моя текущая конфигурация:

.create table PressureRecords ( Timestamp:datetime, DeviceId:guid, Pressure:real )

.create-or-alter table PressureRecords ingestion json mapping "PressureRecords"
'['
'{"column":"TimeStamp","path":"$.DateTime","datatype":"datetime","transform":null},'
'{"column":"DeviceId","path":"$.DeviceId","datatype":"guid","transform":null},'
'{"column":"Pressure","path":"$.Pressure","datatype":"real","transform":null}'
']'

public class PressureRecord
{
    [JsonProperty(PropertyName = "Pressure")]
    public double Pressure { get; set; }
    [JsonProperty(PropertyName = "DateTime")]
    public DateTime DateTime { get; set; } = DateTime.Now;
    [JsonProperty(PropertyName = "DeviceId")]
    [Key]
    public Guid DeviceId { get; set; }
}

Проблема в том, что отображение, которое вы используете в этой команде приема, не соответствует существующей схеме таблицы (в ней есть дополнительные столбцы). В этих случаях обозреватель данных Azure (Kusto) пытается добавить дополнительные столбцы, которые он находит в сопоставлениях. Поскольку приложение имеет разрешение "приемник", оно не может изменять структуру таблицы, и, следовательно, прием не выполняется.

В вашем конкретном случае в вашей таблице есть столбец, который записан в определенном регистре, а в сопоставлении приема один и тот же столбец имеет другой регистр (для одного символа), поэтому он рассматривается как новый столбец.

В этом случае мы постараемся предоставить более подробное сообщение об ошибке.

Другие вопросы по тегам