来自 Azure Function App 的 Kusto 数据引入以 403 结束
Kusto data ingestion from an Azure Function App ends with a 403
我尝试将 Azure 函数应用程序中的数据提取到 ADX 数据库中。我按照文章 中的说明进行操作。
区别在于,我想将数据插入table。我遇到了 403 错误 "Principal 'aadapp=;' is not authorized to access table"
我做了什么:
我创建了一个具有以下 API 权限的 AAD 应用程序:
AAD App configured permission
我通过 Kusto 资源管理器配置了数据库:
.add database myDB ingestors ('aadapp=;')
'theAADAppname'
.add table PressureRecords ingestors ('aadapp=;') 'theAADAppname'
.add table TemperatureRecords ingestors ('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);
}
问题是您在此摄取命令中使用的映射与现有的 table 模式不匹配(它有额外的列)。在这些情况下,Azure 数据资源管理器 (Kusto) 会尝试添加它在映射中找到的其他列。由于应用程序拥有的权限是 'ingestor',它无法修改 table 结构,因此摄取失败。
在您的特定情况下,您的 table 有一列以特定的大小写书写,并且在摄取映射中,同一列具有不同的大小写(对于一个字符),因此它被视为新的列。
我们会研究在这种情况下提供更好的错误消息。
更新:问题已在系统中修复,现在可以正常使用了。
Avnera 感谢您的提示,这可能是一个问题,因为 Real 与双重翻译。在我的第一次尝试中,我在 table 中使用了 double 并且成功了。这不再可能,看起来支持的数据类型发生了变化。
我目前的配置:
.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 函数应用程序中的数据提取到 ADX 数据库中。我按照文章
区别在于,我想将数据插入table。我遇到了 403 错误 "Principal 'aadapp=;' is not authorized to access table"
我做了什么: 我创建了一个具有以下 API 权限的 AAD 应用程序: AAD App configured permission
我通过 Kusto 资源管理器配置了数据库:
.add database myDB ingestors ('aadapp=;') 'theAADAppname'
.add table PressureRecords ingestors ('aadapp=;') 'theAADAppname'
.add table TemperatureRecords ingestors ('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);
}
问题是您在此摄取命令中使用的映射与现有的 table 模式不匹配(它有额外的列)。在这些情况下,Azure 数据资源管理器 (Kusto) 会尝试添加它在映射中找到的其他列。由于应用程序拥有的权限是 'ingestor',它无法修改 table 结构,因此摄取失败。
在您的特定情况下,您的 table 有一列以特定的大小写书写,并且在摄取映射中,同一列具有不同的大小写(对于一个字符),因此它被视为新的列。
我们会研究在这种情况下提供更好的错误消息。
更新:问题已在系统中修复,现在可以正常使用了。
Avnera 感谢您的提示,这可能是一个问题,因为 Real 与双重翻译。在我的第一次尝试中,我在 table 中使用了 double 并且成功了。这不再可能,看起来支持的数据类型发生了变化。
我目前的配置:
.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; }
}