使用托管标识身份验证,对 Blob 进行排队以进行引入

当您将 Blob 排队以从自己的存储帐户引入时,请使用托管标识作为共享访问签名(SAS)令牌和共享密钥身份验证方法的替代方法。 托管标识提供了一种更安全的方式来引入数据,因为无需与服务共享客户 SAS 令牌或共享密钥。 而是将托管身份分配给群集,并向其授予用于引入数据的存储账户的读取权限。 你可随时撤销这些权限。

注意事项

  • 此身份验证方法仅适用于驻留在客户拥有的 storage 帐户中的 Azure blob 和 Azure Data Lake 文件。 它不适用于使用 Kusto SDK 上传的本地文件。
  • 仅支持排队引入。 不支持 Kusto 查询语言中的内联引入和使用 SDK API 直接引入。

为集群分配托管身份

请按照托管标识概述将系统或用户分配的托管标识添加到群集。 如果群集已分配了所需的托管标识,请使用以下步骤复制其对象 ID:

  1. 使用与包含群集的 Azure 订阅关联的帐户登录到 Azure portal

  2. 导航到集群并选择

  3. 选择相应的标识类型、系统或用户分配,然后复制所需标识的对象 ID。

概述页面的屏幕截图,显示了系统托管的标识对象 ID

向托管身份授予权限

  1. 在 Azure 门户中,转到包含要引入数据的存储帐户。

  2. 选择 Access Control,然后选择 + Add>Add Role Assignment

  3. 请授予托管标识Storage Blob 数据读取者Storage Blob 数据参与者权限访问存储帐户,如果您打算使用DeleteSourceOnSuccess源选项。

注意事项

授予 所有者参与者 权限是不够的,导致引入失败。

“添加角色分配”页面的屏幕截图,显示了使用托管标识的系统分配的引入角色

重要

如果出现网络问题,Azure Storage可能会返回 Download Forbidden 错误。 如果您使用私有链接来访问存储帐户,则可能会发生此错误。 在这种情况下,如果权限正确,请检查与存储账户的连接。

在 Azure Data Explorer 中设置托管标识策略

若要使用托管标识将数据引入群集,请向所选托管标识授予 NativeIngestion 使用选项。 原生引入是指使用 SDK 从外部源进行引入的功能。 有关可用 SDK 的详细信息,请参阅 Client 库

可以在目标群集的群集或数据库级别定义使用情况托管标识策略。

若要在数据库级别应用策略,请运行以下命令:

.alter-merge database <database name> policy managed_identity "[ { 'ObjectId' : '<managed_identity_id>', 'AllowedUsages' : 'NativeIngestion' }]"

若要在群集级别应用策略,请运行以下命令:

.alter-merge cluster policy managed_identity "[ { 'ObjectId' : '<managed_identity_id>', 'AllowedUsages' : 'NativeIngestion' }]"

<managed_identity_id> 替换为所需的托管身份的对象 ID。

注意事项

必须在群集上具有 All Database Admin 权限才能编辑托管标识策略。

使用 Kusto SDK 通过托管标识将队列 blob 引入

在使用 Kusto SDK 引入数据时,通过托管标识身份验证生成 Blob URI,将 ;managed_identity={objectId} 追加到未经授权的 Blob URI。 如果使用群集的系统分配的托管标识引入数据,则可以追加 ;managed_identity=system 到 Blob URI。

重要

必须使用排队摄取客户端。 不支持在 Kusto 查询语言中使用具有直接引入或内联引入的托管标识。

以下示例显示了系统和用户分配的托管标识的 Blob URI。

  • 系统分配:https://demosa.blob.core.chinacloudapi.cn/test/export.csv;managed_identity=system
  • 用户分配:https://demosa.blob.core.chinacloudapi.cn/test/export.csv;managed_identity=6a5820b9-fdf6-4cc4-81b9-b416b444fd6d

重要

  • 使用托管标识通过 C# SDK 引入数据时,必须提供 Blob 大小 StorageSourceOptions。 如果未设置大小,SDK 会尝试通过访问 storage 帐户来填充 blob 大小,从而导致失败。
  • size 参数应为原始(未压缩)数据大小,而不是 Blob 大小。
  • 如果不知道引入时的大小,请指定值为零(0)。 该服务尝试使用托管标识进行身份验证以确定大小。