Synapse管道-如何指定管道运行的标识?(SP/UAMI等)



我在受控的公司环境中使用Synpase Spark Pools。我查询AAD的权限有限,但我可以创建UAMI并将其分配给资源。

当我访问Synpase工作区时,我可以创建一个Spark作业定义来从ADLS读取一些数据。查看"监视器"选项卡下的Apache Spark应用程序列表,我可以看到这些作业使用了我的身份(tim.davies@work.com)作为"提交者",由于我给了自己rx访问数据存储的权限,这些都成功了。

现在,如果我创建了一个Pipeline,并将其配置为运行我的Spark作业定义,它将失败,并出现授权错误。回到Monitor下的Apache Spark应用程序列表,我发现我的Pipeline有一个不同的身份用作提交者,这可以解释为什么它没有被授权访问数据。

首先,我不确定哪个身份现在被用作提交者,我不知道UUID是我的Synapse Workspace SAMI还是UAMI(但我无法查询AAD以获取更多信息)。

然而,总的来说,我突然想到,我可能希望能够为我的管道分配明确的UAMI。这可能吗?还是有不同的管理模式?

据我所知,这里的任务是了解如何从火花作业中读取ADLS中的数据。由于你可以访问ADLS,所以工作得很好。我认为你必须在ADLS上设置Synapse工作区的权限,它应该可以正常工作。

更新速度有点慢,但我已经找到了一些理解方面的答案,如果不是一个完全的解决方案的话。在这里分享对任何关注或调查相同问题的人都很有用。

首先,当通过Portal/UI访问Synapse工作区时,笔记本或独立的"Apache Spark作业定义"使用的可操作标识是登录用户的标识(通过"AAD Passthrough")。这对用户体验很有好处,尤其是在笔记本电脑中,你只需要确保你作为个人可以访问你使用的任何数据源。在某些情况下,如果您的用户身份没有此访问权限,您可以使用工作区链接服务身份,但并非总是如此!(继续阅读)

但是,一旦切换到使用管道,使用的标识就是工作空间的系统分配的托管标识(SAMI),它是在创建资源时创建和分配的。这是可以的,但理解粒度很重要,即工作区可以访问资源,而不是单个管道。因此,如果您希望运行具有不同访问级别的Pipeline,则需要将它们部署到隔离的Synapse工作区(具有不同的SAM)。

除此之外,还有我在最初的问题中提到的">Submitter"的身份,它可以在所有Apache Spark应用程序的Synapse工作区的监视器选项卡下看到。当以用户身份运行时(例如Notebooks),这个提交者ID就是我的AAD用户名,这很简单。然而,当作为管道运行时,提交者ID是">ee20d9e7-6295-4240-ba3f-c3784616c565",我的意思是,每个人都有相同的UUID。事实证明,这是ADF作为企业应用程序的id。例如,与将Workspace SAMI放在这里相比,这不是很有用,但这就是它的作用,以防其他人掉进兔子洞!

您可以创建一个附加的用户分配的托管标识(UAMI)并将其分配给工作区,但执行管道不会使用该标识。UAMI可以由工作区链接服务使用,但这有其自身的一些限制(如下所述)。此外,我的经验是,在我手动在门户中创建第二个UAMI之前,在创建工作区时分配的UAMI不会正确地"关联"到工作区。我还没有深入研究,因为事实证明UAMI对我没有好处,但似乎是一个简单的bug。

现在,我的具体用例是在Synapse Pipelines中运行Apache Spark应用程序,实现这一点的简单方法是确保Workspace SAMI能够访问所需的资源,并且您可以继续使用。如果你只是想让它发挥作用,那么就这样做,到此为止,但如果你想看得更深一点,继续…

一些Microsoft文档中的建议是,您应该能够在Spark应用程序中使用工作区链接服务,以便访问资源。然而,这不起作用,我一直在与微软讨论同样的问题,他们已经证实了这一点,并正在进行调查。因此,在这一点上,值得注意的是日期(2023年2月2日-对美国读者来说非常明确;-)),因为这个问题稍后可能会得到解决。但现在,您在Spark代码中的唯一选择是依靠用户/工作区标识。

想想为什么这很重要,这并不是真正的隔离,因为工作区中运行的任何资源都可以访问任何链接服务。这实际上更像是身份和资源管理的问题,即最好将正在使用和分配给资源以访问的身份与资源本身分开。在大多数情况下,我们宁愿对具有个人身份的群体这样做,如果管理过程冗长(我的管理过程冗长),那么我宁愿每次创建资源时都不必重复这些过程。

不管怎样,这就足够了,如果我还在关注的时候发生变化,我会更新。。。

最新更新