通过 .NET SDK 创建链接的自托管集成运行时

问题描述

在 Azure 数据工厂中,我尝试使用 .NET Azure 管理 SDK 创建链接的自托管集成运行时。

我在 DataFactoryA 中有一个现有的自托管集成运行时。我想在 DataFactoryB 中创建一个链接的自托管集成运行时。

_client.IntegrationRuntimes.CreateLinkedIntegrationRuntime(
    resourceGroupName: resourceGroup,factoryName: sharedDataFactoryName,integrationRuntimeName: sharedIntegrationRuntimeName,new CreateLinkedIntegrationRuntimeRequest(
        name: integrationRuntimeName,subscriptionId: subscriptionId,dataFactoryName: dataFactoryName,dataFactoryLocation: "UK South"
    )
);

上面的代码成功执行,我可以看到请求返回了预期的负载。但是在 Azure 门户中,我有以下内容

  • 现有的自托管集成运行时类型现在列为“共享”。
  • 在现有的自承载集成运行时“共享”属性下,链接的集成运行时列在目标数据工厂下。

但是,链接运行时未在目标数据工厂中列出,并且在创建链接服务时不可用。

另外,如果我通过 SDK 列出目标工厂的运行时,则不会列出运行时。

var list = _client.IntegrationRuntimes.ListByFactory(resourceGroup,dataFactoryName);
            
Console.WriteLine($"Data factory {dataFactoryName} has the following runtimes:");
            
foreach (var runtime in list)
{
    Console.WriteLine($"{runtime.Name} | {runtime.Etag}");
}

似乎链接的集成运行时只是部分创建或处于不完整状态,因此它在门户中不可见。

文档目前对此很清楚,如何实现?

解决方法

如果我们想在另一个工厂中创建一个链接的自托管集成运行时,我们需要使用这些步骤。有关详细信息,请参阅 document

  1. 创建共享的自托管集成运行时

  2. 向另一个数据工厂授予权限。然后另一个工厂有权访问IR

  3. 使用共享自托管集成运行时的资源 ID 创建 IR

关于如何使用Net SDK实现,请参考以下步骤

  1. 创建服务主体并将 Owner 分配给 sp

  2. 安装包

Install-Package Microsoft.Azure.Management.DataFactory
Install-Package Microsoft.Azure.Management.Authorization-IncludePrerelease
Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory
  1. 代码
var context = new AuthenticationContext(" https://login.microsoftonline.com/" + "<tenant>");
            ClientCredential cc = new ClientCredential("<sp client id>"," sp client secret");
            AuthenticationResult result = context.AcquireTokenAsync(
                "https://management.azure.com/",cc).Result;
            ServiceClientCredentials cred = new TokenCredentials(result.AccessToken);
            var client =new DataFactoryManagementClient(cred)
            {
                SubscriptionId = ""
            };
 
            // get required information
            var linkedFactoryName = "huryDF";
            var linkedFactoryGroupName = "huryTestGroup";
            var sharedFactoryName = "testfactory05";
            var sharedFactoryGroupName = "test001";
            var IRName = "MySelfHostedIR";
             
            var integrationRuntime = await client.IntegrationRuntimes.GetAsync(sharedFactoryGroupName,sharedFactoryName,IRName);
            var linkedFactory = await client.Factories.GetAsync(linkedFactoryGroupName,linkedFactoryName);
            var sharedFactory= await client.Factories.GetAsync(sharedFactoryGroupName,sharedFactoryName);
            // grant permissions
            var managementClient = new AuthorizationManagementClient(cred);
            IPage<RoleDefinition> roleDefine = await managementClient.RoleDefinitions.ListAsync(sharedFactory.Id,new ODataQuery<RoleDefinitionFilter>()
            {
                Filter= "roleName eq 'Contributor'"
            });
            await managementClient.RoleAssignments.CreateAsync(integrationRuntime.Id,Guid.NewGuid().ToString(),new RoleAssignmentCreateParameters()
            {
                RoleDefinitionId = roleDefine.ToList().FirstOrDefault().Id,PrincipalId = linkedFactory.Identity.PrincipalId.ToString()
            }) ;

            // create IR
            var res = await client.IntegrationRuntimes.CreateOrUpdateWithHttpMessagesAsync(linkedFactoryGroupName,linkedFactoryName,"test",new IntegrationRuntimeResource() { Properties= new SelfHostedIntegrationRuntime() { 
                     LinkedInfo= new LinkedIntegrationRuntimeRbacAuthorization() { 
                       ResourceId= integrationRuntime.Id
                     }
                   } });

enter image description here enter image description here