如何通过PowerShell或模板将Azure混合连接链接到Azure Web App?

时间:2015-12-29 02:37:26

标签: powershell azure azure-web-sites azure-resource-manager

有没有办法以自动方式将混合连接添加到Azure Web App? (通过PowerShell或资源模板,甚至是对Azure API的REST调用?)

目前我使用资源管理器模板部署了Azure Web App,并且所有内容都已正确配置,但是我无法弄清楚如何将Web App链接到现有的BizTalk混合连接模板或通过PowerShell(某种自动方式)。

Azure Web App Hybrid Connection

4 个答案:

答案 0 :(得分:2)

将{+ 3}}状态指向将Azure Web App链接到现有混合连接只能通过Portal手动完成:

  

注意:“混合连接”功能的“Web应用程序”部分仅在Azure门户中可用。

答案 1 :(得分:2)

您可以通过资源管理器(https://resources.azure.com/)手动执行此操作,通过一个安静的"创建"深入了解:

时打电话

订阅 - >资源组 - >网站 - > - > hybridconnection

我复制了资源管理器应用程序发出的调用,并在Powershell中复制了它。

你需要:

  1. 找到您的订阅租户ID(谷歌)
  2. 使用AzureAD注册应用程序
    • 获取该应用程序ID和秘密
  3. 从资源管理器收集各种常量,例如Biztalk Uri和称为实体连接字符串的东西
  4. 脚本使用这些详细信息来获取auth令牌以从powershell调用其余的api。然后它调用经典的rest api来添加与网站的exisitng混合连接。请注意,这仅适用于之前具有混合连接的网站,因此您无法在没有手动工作和记录资源管理器详细信息的情况下启动全新环境。

    下面是这个脚本的副本,我从Octopus部署中调用它,所以所有#{...}变量都是从那里提供的。

    此脚本将继续调用api端点到面向外部的网站,该网站通过混合连接调用内部系统。它将尝试5次等待200响应。

    我在脚本中使用的Hybrid.ConnectionRestUrl变量是通过观察资源管理器进行的调用获得的。它构造如下:https://management.azure.com/subscriptions/#{SubscriptionId}/resourceGroups/#{resource-group-name}/providers/Microsoft.Web/sites/#{web-site-name}/hybridconnection/#{web-site-name}?api-version=2015-08-01

    不保证此脚本可以运行多长时间,因为它几乎不是受支持的方法。

        $authUri = "https://login.microsoftonline.com/#{tenant-domain}/oauth2/token"
        $authMethod = "POST"
        $authFormFields = @{resource='https://management.core.windows.net/';client_id='#{AzureAD.ApplicationId}';grant_type='client_credentials';client_secret='#{AzureAD.ApplicationSecret}'}
        $authResponse = Invoke-WebRequest -Uri $authUri -Method $authMethod -Body $authFormFields -ContentType "application/x-www-form-urlencoded" | ConvertFrom-Json
    
        $authorization = "Bearer " + $authResponse.access_token
        $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
        $headers.Add("Authorization", $authorization)
        $headers.Add("Content-Type", "application/json")
    
        $URI = "#{Hybrid.ConnectionRestUrl}"
        $method = "PUT"
        $body = '{ "name" : "#{ExternalAzureService.WebApp}", "location" : "#{App.Location}", "type" : "Microsoft.Web/sites", "properties" : { "entityName" : "#{Hybrid.EntityName}", "entityConnectionString" : "#{Hybrid.EntityConnectionString}", "resourceType" : "", "resourceConnectionString" : "", "hostname" : "#{InternalService.Hostname.Raw}", "port" : 80, "biztalkUri" : "#{Hybrid.BiztalkUri}" } }'
    
        Write-Output $URI
        Write-Output $body
    
        Try
        {
            $result = Invoke-RestMethod -Uri $URI -Method $method -Headers $headers -Body $body
        }
        Catch
        {
            Write-Output "Error Occurred "
            $i = 1
            $pingUrl = "http://#{ExternalAzureService.WebApp.HostName}/api/callinternalsystem"
            Write-Output "Ping $i times this url: $pingUrl"
            Do
            {
                 Write-Output "Starting Ping call $i"
                 $response = Invoke-WebRequest $pingUrl
                 If ($response.StatusCode -eq 200) {
                    Write-Output "200 returned"
                    Break
                 }
                 $i++
            } While ($i -le 5)
        }
        Write-Output " *********************************** SUCCESS ********************************** "
        Write-Output $result
    

答案 2 :(得分:1)

现在可以使用Microsoft.Web sites/hybridConnectionNamespaces/relays模板参考在Azure资源管理器(ARM)模板中完成此操作。

这是一个简短的示例。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2018-11-01",
      "resources": [
        {
          "apiVersion": "2019-08-01",
          "dependsOn": [
            "[resourceId('Microsoft.Web/sites', variables('appName'))]"
          ],
          "name": "[concat(variables('relayName'), '/', parameters('hybridConnectionName'))]",
          "properties": {
            "hostname": "[split(json(reference(variables('hybridConnectionResourceId'), '2017-04-01').userMetadata)[0].value, ':')[0]]",
            "port": "[split(json(reference(variables('hybridConnectionResourceId'), '2017-04-01').userMetadata)[0].value, ':')[1]]",
            "relayArmUri": "[variables('hybridConnectionResourceId')]",
            "relayName": "[parameters('hybridConnectionName')]",
            "sendKeyName": "[parameters('hybridConnectionSendKeyName')]",
            "sendKeyValue": "[listkeys(concat(variables('hybridConnectionResourceId'), '/authorizationRules/defaultSender'), '2017-04-01').primaryKey]",
            "serviceBusNamespace": "[variables('relayName')]"
          },
          "tags": {
            "displayName": "hc-some-name"
          },
          "type": "hybridConnectionNamespaces/relays"
        }
      ]
    }
  ]
}

答案 3 :(得分:0)

可以找到用于管理biztalk服务的REST API here 对更多开发人员资源的引用(包括powershell)https://msdn.microsoft.com/en-us/library/azure/dn832182.aspx

我没有ARM模板的示例,但也许架构可以帮助您 https://github.com/Azure/azure-resource-manager-schemas/blob/master/schemas/2014-04-01/Microsoft.BizTalkServices.json