Как создать гибридное соединение Azure с помощью Pulumi?

Предварительные условия:

  • Не может быть дублированного гибридного подключения службы приложений в рамках одного плана службы приложений, настроенного для служб приложений.

Используя пример, предоставленный на их веб-сайте (https://www.pulumi.com/docs/reference/pkg/azure/appservice/hybridconnection/):

using Pulumi;
using Azure = Pulumi.Azure;
using Pulumi.AzureNextGen; 

class MyStack : Stack
{
    public MyStack()
    {
        var exampleResourceGroup = new Azure.Core.ResourceGroup("exampleResourceGroup", new Azure.Core.ResourceGroupArgs
        {
            Location = "West Europe",
        });
        var examplePlan = new Azure.AppService.Plan("examplePlan", new Azure.AppService.PlanArgs
        {
            Location = exampleResourceGroup.Location,
            ResourceGroupName = exampleResourceGroup.Name,
            Sku = new Azure.AppService.Inputs.PlanSkuArgs
            {
                Tier = "Standard",
                Size = "S1",
            },
        });
        var exampleAppService = new Azure.AppService.AppService("exampleAppService", new Azure.AppService.AppServiceArgs
        {
            Location = exampleResourceGroup.Location,
            ResourceGroupName = exampleResourceGroup.Name,
            AppServicePlanId = examplePlan.Id,
        });
        var exampleNamespace = new Azure.Relay.Namespace("exampleNamespace", new Azure.Relay.NamespaceArgs
        {
            Location = exampleResourceGroup.Location,
            ResourceGroupName = exampleResourceGroup.Name,
            SkuName = "Standard",
        });
        var exampleHybridConnection = new Azure.Relay.HybridConnection("exampleHybridConnection", new Azure.Relay.HybridConnectionArgs
        {
            ResourceGroupName = exampleResourceGroup.Name,
            RelayNamespaceName = exampleNamespace.Name,
            UserMetadata = "examplemetadata",
        });
        var exampleAppservice_hybridConnectionHybridConnection = new Azure.AppService.HybridConnection("exampleAppservice/hybridConnectionHybridConnection", new Azure.AppService.HybridConnectionArgs
        {
            AppServiceName = exampleAppService.Name,
            ResourceGroupName = exampleResourceGroup.Name,
            RelayId = exampleHybridConnection.Id,
            Hostname = "testhostname.example",
            Port = 8080,
            SendKeyName = "RootManageSharedAccessKey",
        });
    }

}

Я получаю следующую ошибку:

Ошибка: невозможно получить список ключей доступа для пространства имен XXX (группа ресурсов XXX): relay.NamespacesClient # ListKeys: Ошибка при ответе на запрос: StatusCode = 404 - Исходная ошибка: autorest / azure: ответ об ошибке не может быть проанализирован: запрашиваемый ресурс defaultSender выполняет не существует. ошибка: json: невозможно демаршалировать строку в значение Go типа azure.RequestError

Чтобы исправить это, мне пришлось добавить правило авторизации пространства имен реле:

using Pulumi;
using Azure = Pulumi.Azure;
using Pulumi.AzureNextGen;

class MyStack : Stack
{
    public MyStack()
    {
        var exampleResourceGroup = new Azure.Core.ResourceGroup("exampleResourceGroup", new Azure.Core.ResourceGroupArgs
        {
            Location = "West Europe",
        });
        var examplePlan = new Azure.AppService.Plan("examplePlan", new Azure.AppService.PlanArgs
        {
            Location = exampleResourceGroup.Location,
            ResourceGroupName = exampleResourceGroup.Name,
            Sku = new Azure.AppService.Inputs.PlanSkuArgs
            {
                Tier = "Standard",
                Size = "S1",
            },
        });
        var exampleAppService = new Azure.AppService.AppService("exampleAppService", new Azure.AppService.AppServiceArgs
        {
            Location = exampleResourceGroup.Location,
            ResourceGroupName = exampleResourceGroup.Name,
            AppServicePlanId = examplePlan.Id,
        });
        var exampleNamespace = new Azure.Relay.Namespace("exampleNamespace", new Azure.Relay.NamespaceArgs
        {
            Location = exampleResourceGroup.Location,
            ResourceGroupName = exampleResourceGroup.Name,
            SkuName = "Standard",
        });

var defaultSenderAuthorizationRule = new Pulumi.AzureNextGen.Relay.Latest.NamespaceAuthorizationRule("defaultSenderAuthorizationRule",
                new AzureProviderNextGen.Relay.Latest.NamespaceAuthorizationRuleArgs
                {
                    AuthorizationRuleName = "defaultSender",
                    NamespaceName = exampleNamespace .Name,
                    ResourceGroupName = exampleNamespace .ResourceGroupName,
                    Rights =
                    {
                        "Manage",
                        "Listen",
                        "Send",
                    },
                });


        var exampleHybridConnection = new Azure.Relay.HybridConnection("exampleHybridConnection", new Azure.Relay.HybridConnectionArgs
        {
            ResourceGroupName = exampleResourceGroup.Name,
            RelayNamespaceName = exampleNamespace.Name,
            UserMetadata = "examplemetadata",
        });
        var exampleAppservice_hybridConnectionHybridConnection = new Azure.AppService.HybridConnection("exampleAppservice/hybridConnectionHybridConnection", new Azure.AppService.HybridConnectionArgs
        {
            AppServiceName = exampleAppService.Name,
            ResourceGroupName = exampleResourceGroup.Name,
            RelayId = exampleHybridConnection.Id,
            Hostname = "testhostname.example",
            Port = 8080,
            SendKeyName = "RootManageSharedAccessKey",
        });
    }

}

После этого все работает нормально, и стек завершает работу, говоря, что мой Appservice: HybridConnection создан. Тем не менее, когда я перехожу к настройкам сети / гибридного подключения службы приложений, их там нет.

Ожидаемое поведение:

После успешного создания AppService.HybridConnection он должен появиться в списке гибридных подключений службы приложений на портале Azure.

Фактическое поведение:

AppService.HybridConnection успешно создан, но не отображается в списке App Service \ Hybrid Connection.


person Eric Tijerina    schedule 12.01.2021    source источник


Ответы (1)


При просмотре журналов активности Azure кажется, что ресурс создается, а затем сразу же удаляется.

Решением для этого было ..

  1. Обновите UserMetadata в Relay.HybridConnection, чтобы он включал ключ конечной точки с именем хоста и портом.
var exampleHybridConnection = new Azure.Relay.HybridConnection("exampleHybridConnection", new Azure.Relay.HybridConnectionArgs
        {
            ResourceGroupName = exampleResourceGroup.Name,
            RelayNamespaceName = exampleNamespace.Name,
            UserMetadata = "[{\"key\":\"endpoint\",\"value\":\"testhostname.example:8080\"}]",
        });
  1. Добавьте правила авторизации в Relay.HybridConnection.
var defaultListenerRule = new Pulumi.AzureNextGen.Relay.Latest.HybridConnectionAuthorizationRule("defaultListener",
                new Pulumi.AzureNextGen.Relay.Latest.HybridConnectionAuthorizationRuleArgs
                {
                    AuthorizationRuleName = "defaultListener",
                    HybridConnectionName = exampleHybridConnection.Name,
                    NamespaceName = exampleHybridConnection.RelayNamespaceName,
                    ResourceGroupName = exampleHybridConnection.ResourceGroupName,
                    Rights =
                    {
                        "Listen",
                    },
                });

            var defaultSenderRule = new Pulumi.AzureNextGen.Relay.Latest.HybridConnectionAuthorizationRule("defaultSender",
                new Pulumi.AzureNextGen.Relay.Latest.HybridConnectionAuthorizationRuleArgs
                {
                    AuthorizationRuleName = "defaultSender",
                    HybridConnectionName = exampleHybridConnection.Name,
                    NamespaceName = exampleHybridConnection.RelayNamespaceName,
                    ResourceGroupName = exampleHybridConnection.ResourceGroupName,
                    Rights =
                    {
                        "Send",
                    },
                });
  1. Затем добавьте аргумент CustomResourceOptions DeleteBeforeReplace = true в AppService.HybridConnection.
var exampleAppservice_hybridConnectionHybridConnection = new Azure.AppService.HybridConnection("exampleAppservice/hybridConnectionHybridConnection", new Azure.AppService.HybridConnectionArgs
            {
                AppServiceName = exampleAppService.Name,
                ResourceGroupName = exampleResourceGroup.Name,
                RelayId = exampleHybridConnection.Id,
                Hostname = "testhostname.example",
                Port = 8080,
                SendKeyName = "exampleSharedAccessKey",
            }, new CustomResourceOptions { DeleteBeforeReplace = true });

После его создания все будет связано и отображаться как в диспетчере гибридных подключений, так и на портале Azure.

person Eric Tijerina    schedule 12.01.2021
comment
Вы должны выбрать этот ответ как правильный! Спасибо за размещение решения. - person Frankely Diaz; 13.01.2021
comment
только у вас есть сила предотвратить лесные пожары @FrankelyDiaz - person Eric Tijerina; 13.01.2021
comment
буррито буррито - person Frankely Diaz; 15.01.2021
comment
@FrankelyDiaz ЭЙ ПАРЕНЬ - person Eric; 09.06.2021