Функции Azure, запускаемые servicebus, жалуются на то, что строка подключения ‘AzureWebJobsServiceBus’ отсутствует или пуста

#azure-active-directory #azure-functions #azureservicebus

#azure-active-directory #azure-функции #azureservicebus

Вопрос:

У меня есть проект .netcore Azure Functions, который хорошо работает в Visual Studio 2019, когда у меня есть действительная AzureWebJobsServiceBus в local.settings.json, но не будет компилироваться, если она отсутствует или пуста. Я использую AD для аутентификации моей функции в service bus, а не через строку подключения. AzureWebJobsServiceBus нигде не используется в моем проекте. Вот мой project.cs

введите описание изображения здесь

Я использую Azure.Пакет идентификации и следуйте этому сообщению, чтобы использовать мои учетные данные для входа в Azure, и вот моя функция, которая работает:

     [FunctionName("ProcessNewMessage")]
    public async Task ProcessPaymentMessage([ServiceBusTrigger("topic", "subscription")] Message message, ILogger log) {
        var tokenProvider = TokenProvider.CreateManagedIdentityTokenProvider();
        QueueClient queueClient = new QueueClient($"sb://{Environment.GetEnvironmentVariable("ServiceBusEndPoint")}", Environment.GetEnvironmentVariable("GenericAuditQueueName"), tokenProvider);

        await queueClient.SendAsync(message);
    }
  

До использования AD для аутентификации я использовал строку подключения, и это тоже работает, но рекомендуется использовать AD.

Подводя итог, моя функция Azure работает с запуском служебной шины, когда строка подключения предоставлена, но не используется моим кодом. Как я могу заставить свою функцию работать с AD без строки подключения?

Большое спасибо

Ответ №1:

Вы не можете удалить строку подключения к служебной шине из триггера служебной шины приложения Azure function, поскольку внутренние SDK используют ее для установления соединения.

Сохранение строки подключения к служебной шине в функциональном приложении с использованием хранилища ключей: функция ссылок на хранилища ключей позволяет вашему приложению работать так, как если бы оно использовало настройки приложения, какими они были, то есть никаких изменений кода не требуется. Вы можете получить все подробности из нашей справочной документации по хранилищу ключей, но я изложу основы здесь.

Для этой функции требуется назначенный системой управляемый идентификатор для вашего приложения. Позже в этом посте я расскажу о присвоенных пользователем удостоверениях, но пока мы сохраняем эти предварительные просмотры отдельно.

Затем вам нужно будет настроить политику доступа к вашему хранилищу ключей, которая дает вашему приложению разрешение на получение секретов. Узнайте, как настроить политику доступа.

Наконец, установите значение любого параметра приложения в качестве ссылки в следующем формате:

 @Microsoft.KeyVault(SecretUri=secret_uri_with_version)
  

Где secret_uri_with_version — это полный URI для секрета в хранилище ключей. Например, это может быть что-то вроде: https://myvault.vault.azure.net/secrets/azurewebjobsservicebussecret/ec96f02080254f109c51a1f14cdb1931

введите описание изображения здесь

Вы можете использовать MSI для приложения функций Azure и служебной шины:

MSI для приложения Function: https://learn.microsoft.com/en-us/azure/app-service/overview-managed-identity?tabs=dotnet#add-a-system-assigned-identity

MSI для служебной шины: https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-managed-service-identity#use-service-bus-with-managed-identities-for-azure-resources

Комментарии:

1. Спасибо, что указали способ использования @Microsoft.KeyVault в настройках приложения, это лучше, чем указывать строку подключения в настройках приложения. Я попробую это через несколько дней. Было бы неплохо, если бы мы могли использовать чистый AD для аутентификации.

2. это самый близкий ответ, который я могу получить. Надеюсь, мы сможем использовать AD только для аутентификации в следующем выпуске SDK.

3. Если у вас это работает, вы можете пометить это как ответ, чтобы помочь другим пользователям сообщества.

Ответ №2:

Если вы хотите настроить запуск служебной шины Azure в функции Azure с помощью Azure AD auth, пожалуйста, задайте строку подключения к служебной шине как Endpoint=sb://<service-bus-resource>.servicebus.windows.net;Authentication=Managed Identity; . Для получения более подробной информации, пожалуйста, обратитесь к здесь.

Например

  1. Включите MSI для функции Azure

  2. Назначьте роль Azure RABC (владелец данных служебной шины Azure) для MSI

 az role assignment create 
    --role $service_bus_role 
    --assignee $assignee_id 
    --scope /subscriptions/$subscription_id/resourceGroups/$resource_group/providers/Microsoft.ServiceBus/namespaces/$service_bus_namespace
  
  1. Добавьте строку подключения к служебной шине в настройках приложения Azure function.
    введите описание изображения здесь

  2. Код

  public static void Run([ServiceBusTrigger("test", "test", Connection = "myQueueConn")]string mySbMsg, ILogger log)
        {
            log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
        }
  

введите описание изображения здесь

Комментарии:

1. Спасибо, Джим. Я пробовал выше, но он по-прежнему жалуется на отсутствие строки подключения. Это не жалоба на то, что я не аутентифицирован, но отсутствует строка подключения.

2. @JustinCurious Вы пытались обновить код ProcessPaymentMessage([ServiceBusTrigger("topic", "subscription")] как ProcessPaymentMessage([ServiceBusTrigger("topic", "subscription",Connection ="<connection string>")]

3. Спасибо за предложение, у меня это работает при использовании строки подключения, я уже говорил об этом. Цель состоит в том, чтобы не использовать строку подключения, а использовать только AD.

4. @JustinCurious Когда мы обновим строку подключения как Endpoint=sb://<service-bus-resource>.servicebus.windows.net;Authentication=Managed Identity; , она сообщит функции azure о доступе к служебной шине с помощью MSI. Я думаю, это соответствует вашей цели. Кроме того, когда мы используем триггер служебной шины, нам необходимо предоставить строку подключения. В противном случае функция не сможет успешно выполняться.

5. Да, когда у меня есть строка подключения, мне даже не нужна аутентификация = Управляемая идентификация. Когда я увидел это предложение, я сразу почувствовал, что это решит мою проблему. К сожалению, когда я удаляю строку подключения, она выдает ошибку компиляции. Как сказал выше @HarshitaSingh-MSFT, строка подключения используется SDK внутренне, тогда я не понимаю цели использования AD.