Прием данных 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) пытается добавить дополнительные столбцы, которые он находит в сопоставлениях. Поскольку приложение имеет разрешение "приемник", оно не может изменять структуру таблицы, и, следовательно, прием не выполняется.
В вашем конкретном случае в вашей таблице есть столбец, который записан в определенном регистре, а в сопоставлении приема один и тот же столбец имеет другой регистр (для одного символа), поэтому он рассматривается как новый столбец.
В этом случае мы постараемся предоставить более подробное сообщение об ошибке.