从数据湖 (gen1) 复制到 blob 存储时,数据工厂失去权限

data factory loses permissions when copying from data lake (gen1) to blob storage

数据工厂在尝试从数据湖 gen1 复制到 blob 存储时出现此错误:

"message": "Failure happened on 'Sink' side. ErrorCode=UserErrorFailedFileOperation,
'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Upload file failed at
 path myblobcontainer\file_that_im_tryin_to_copy.xml.,Source=Microsoft.DataTransfer.Common,''Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Failed to read a 'AzureDataLakeStore' file. File path: 'SourceFolderInDataLake/2019/09/26/SomeOtherFile.usql'.,Source=Microsoft.DataTransfer.ClientLibrary,''Type=System.Net.WebException,Message=The remote server returned an error: (403) Forbidden.

我有一个 U-SQL Script activity 将执行 1-Patient.usql

接下来 activity 是 copy data 步骤:

来源

下沉

我已经使用 this tutorial 配置了 roles/permissions。

我可以通过 Data Explorer --> Access:

解决这个问题

然后我点击 Advanced:

点击Apply to all children后,复制成功!

请注意 先于 Copy Data activity,数据工厂正在 gen1 中执行 usql 脚本.该脚本存储在 gen1 中,它在数据湖和文件夹中生成文件。 从来没有任何权限问题运行这个脚本。

我做错了什么?

我可以重现你的问题。实际上 Apply folder permissions to sub-folders 是没有必要的。问题应该是data lake gen1的访问控制问题,问题的关键是上传文件的顺序和权限设置。

您可以先查看Access control in Azure Data Lake Storage Gen1,然后参考下面我测试的信息。

我假设您将如下所示的权限添加到根 /

如果您的文件在设置权限前已经存在,则操作会影响该文件,即设置该文件的访问权限,您可以访问该文件。

但是如果设置权限后上传文件或新建文件夹,文件夹和文件将没有访问权限,您将无法访问它们。可以select文件,点击Access直接查看

设置完上面的权限后,如果再设置A default permission entry,不会影响已有的文件夹和文件,但如果新建文件夹和文件,就会获得所有文件夹和文件的访问权限.即旧文件夹和文件仍然无法访问,新文件夹和文件将可以访问。如果你想获得旧的访问权限,只需再次像截图一样添加权限,Apply folder permissions to sub-folders 是相同的逻辑。

总而言之,如果您希望您的服务 principal/MSI 访问数据湖中的所有文件,您可以添加第三个选项 An access permission entry and a default permission entry,然后您将能够访问现有的和新的 folders/files.