【问题标题】:Azure Data Factory connecting to Blob Storage via Access KeyAzure 数据工厂通过访问密钥连接到 Blob 存储
【发布时间】:2020-08-25 14:56:04
【问题描述】:

我正在尝试在 Azure 数据工厂中构建一个非常基本的数据流,从 blob 存储中提取 JSON 文件,对某些列执行转换,并将其存储在 SQL 数据库中。我最初使用托管标识对存储帐户进行了身份验证,但在尝试测试与源的连接时出现以下错误:

com.microsoft.dataflow.broker.MissingRequiredPropertyException: account 是 [myStorageAccountName] 的必需属性。 com.microsoft.dataflow.broker.PropertyNotFoundException:不能 从 [myStorageAccountName] 中提取值 - RunId: xxx

我还在工厂验证输出中看到以下消息:

[MyDataSetName] AzureBlobStorage 不支持 SAS, MSI,或数据流中的服务主体身份验证。

有了这个,我假设我需要做的就是将我的 Blob 存储链接服务切换到帐户密钥身份验证方法。在我切换到帐户密钥身份验证并选择我的订阅和存储帐户后,在测试连接时出现以下错误:

连接失败 连接失败 https://[myBlob].blob.core.windows.net/:错误信息: 远程服务器返回错误:(403)禁止。 (错误代码:403, 详细信息:此请求无权执行此操作。, RequestId: xxxx),请确保 提供的凭证有效。远程服务器返回错误: (403) Forbidden.StorageExtendedMessage=, 远程服务器返回一个 错误:(403)禁止。活动编号: xxx.

我尝试过直接从 Azure 中选择并手动输入密钥,但无论哪种方式都会出现相同的错误。需要注意的一件事是存储帐户只允许访问指定的网络。我尝试连接到不同的公共存储帐户并且能够正常访问。 ADF 帐户具有存储帐户参与者角色,我添加了我当前工作的 IP 地址以及我在此处找到的 Azure 数据工厂的 IP 范围:https://docs.microsoft.com/en-us/azure/data-factory/azure-integration-runtime-ip-addresses

另外请注意,我目前有大约 5 个复制数据任务与托管身份完美配合,但我需要开始执行更复杂的操作。

这似乎与Unable to create a linked service in Azure Data Factory 类似的问题,但我分配的存储帐户参与者和所有者角色应取代回复中建议的读者角色。我也不确定发帖者是使用公共存储帐户还是私人帐户。

提前谢谢你。

【问题讨论】:

    标签: azure azure-storage azure-blob-storage azure-data-factory


    【解决方案1】:

    这就是你现在所面临的:

    从描述我们知道是存储连接错误。我还将贡献者角色设置为数据工厂,但仍然遇到问题。

    问题来自存储帐户的网络和防火墙。请检查一下。

    确保您已添加客户端 ID 和“受信任的 Microsoft 服务”例外。

    看看这个文档:

    https://docs.microsoft.com/en-us/azure/storage/common/storage-network-security#trusted-microsoft-services

    然后,转到您的 adf,选择这些:

    之后应该就OK了。

    【讨论】:

    • 嗨,鲍曼,很遗憾,这不起作用。托管标识非常适合管道中的复制任务,但是当您尝试使用 Blob 存储作为源执行数据流任务时,您会收到我在帖子中提到的错误。
    【解决方案2】:

    article listed above 关于集成运行时的白名单 IP 范围的最底部,Microsoft 表示如下:

    连接Azure Storage账号时,IP网络规则没有 对源自 Azure 集成运行时的请求的影响 与存储帐户相同的区域。更多详情,请参考 this article.

    我就此与 Microsoft 支持人员进行了交谈,问题是白名单公共 IP 地址不适用于同一区域内的资源,因为由于资源位于同一网络上,它们使用私有 IP 而不是公共 IP 相互连接.

    有四个选项可以解决原始问题:

    • 允许来自存储帐户中防火墙和虚拟网络下的所有网络的访问(如果您要存储敏感数据,这显然是一个问题)。我对此进行了测试,它确实有效。
    • 创建在不同区域运行的新 Azure 托管集成运行时。我也对此进行了测试。我的 ADF 数据流在东部地区运行,我创建了一个在东部 2 运行的运行时,它立即运行。对我来说,这里的问题是,在推送到 prod 之前,我必须让安全部门对此进行审查,因为我们将通过公共网络发送数据,即使它是加密的,等等,它仍然不如让两个资源互相通信那样安全同一网络中的其他人。
    • 使用单独的活动,例如 Spark 或 SSIS 包等 HDInsight 活动。我确信这会奏效,但 SSIS 的问题是成本,因为我们必须启动一个 SSIS 数据库,然后为计算付费。您还需要在管道中执行多个活动,以在执行之前和之后启动和停止 SSIS 管道。此外,我不想仅仅为此而学习 Spark。
    • 最后,我使用的有效解决方案是我创建了一个新连接,用数据集的 Data Lakes Gen 2 连接替换了 Blob 存储。它就像一个魅力。与 Blob 存储连接不同,Azure Data Lakes Storage Gen 2 支持托管标识per this article. 通常,连接类型越具体,功能就越有可能满足特定需求。

    【讨论】:

    • 嗨,迈克,我遇到了同样的问题。你能解释一下你是如何设置选项2的吗?我在不同区域有 blob 存储,而我的 ADF 在另一个区域,但我仍然遇到权限问题。如果我将其设置为“所有网络”,那么它可以工作。在选项 2 中,我无法理解您在不同区域运行的 2 台服务器?数据工厂只能在单个区域运行还是我遗漏了什么?
    • ty 来研究这个。该产品似乎不是最理想的。
    • 我遇到了这个问题,不敢相信 azure 没有解决这个问题,因为这对数据安全和隐私至关重要。
    猜你喜欢
    • 2019-01-15
    • 2018-03-16
    • 2019-04-20
    • 2021-03-19
    • 2020-12-22
    • 2019-11-08
    • 2016-02-18
    • 1970-01-01
    • 2013-06-19
    相关资源
    最近更新 更多