Как приложение-функция Azure может взаимодействовать с ресурсами Azure? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть приложение ac # funtion. Я хочу использовать это приложение для автоматического обновления группы безопасности Azure по той же подписке.

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

Следующий шаг - получить доступ к объектам Azure. Все примеры этого, которые я видел, используют следующее пространство имен:

using Microsoft.Azure.Management.Fluent;

Однако, добавляя это икомпилируя приложение функции, я получаю сообщение об ошибке:

error CS0234: The type or namespace name 'Management' does not exist in the namespace 'Microsoft.Azure' (are you missing an assembly reference?)

Я попытался добавить ссылку:

#r "Microsoft.Azure.Management.Fluent"

Но при этом у меня появляется другая ошибка:

    error CS0006: Metadata file 'Microsoft.Azure.Management.Fluent' could not be found

Все примеры, которые я видел, используют такой синтаксис:

var azure = Azure.Configure().WithDefaultSubscription();

Однако они не объясняют, как приложение функции может ссылаться на Azure как объект.Кто-нибудь может объяснить это?

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Попробуйте:

Microsoft.Azure.Management.ResourceManager.Fluent

Ресурс диспетчера ресурсов Azure Свободно Предоставляет группы ресурсов и возможности управления ресурсами (Свободно) для Microsoft Azure.

ИЛИ

Microsoft.Azure.Management.ResourceManager

https://www.nuget.org/profiles/azure-sdk?page=2

1 голос
/ 03 апреля 2019

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

Другим важным соображением будет как вы аутентифицируетесь

Есть несколько способов .. Вы можете найти хорошие детали здесь

  • Через файл кредит в вашем решении (экспериментальный и может быть изменен, поэтому не рекомендуется)

    Azure azure = Azure.Authenticate("my.azureauth").WithDefaultSubscription();
    
  • через сервисную группу регистрация

    Использование секрета клиента

    var creds = new AzureCredentialsFactory().FromServicePrincipal(client, key, tenant, AzureEnvironment.AzureGlobalCloud);
    var azure = Azure.Authenticate(creds).WithSubscription(subscriptionId);
    

    Использование сертификата

    var creds = new AzureCredentialsFactory().FromServicePrincipal(client, pfxCertificatePath, password, tenant, AzureEnvironment.AzureGlobalCloud);
    var azure = Azure.Authenticate(creds).WithSubscription(subscriptionId);
    
  • Использование идентификатора управляемого сервиса или MSI

    AzureCredentialsFactory factory = new AzureCredentialsFactory();
    AzureCredentials msiCred = factory.FromMSI(new MSILoginInformation(MSIResourceType.AppService), AzureEnvironment.AzureGlobalCloud);
    var azure = Azure.Configure().WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic).Authenticate(msiCred).WithDefaultSubscription();
    

Вот документация корневого уровня и примеры кода для Библиотеки управления Azure для .NET

Вот примеры, специфичные для функций Azure, которые могут вам помочь: Образцы


Вы упомянули, что хотите работать с NSG как часть своей функции, поэтому я быстро опробовал один на своем конце.

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

  1. Включение идентификатора управляемой службы для моего функционального приложения

    enter image description here

  2. Предоставить разрешения на работу с NSG для MSI моего Function App

    enter image description here

Вот полный (быстрый и грязный) рабочий код .. с использованием вышеупомянутых пакетов Nuget

using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Management.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent.Authentication;
using Microsoft.Azure.Management.ResourceManager.Fluent.Core;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using System.Net.Http;
using System.Threading.Tasks;

namespace RSFunctionCallingFluent
{
    public static class SimpleFunction
    {
        [FunctionName("SimpleFunction")]
        public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, ILogger log)
        {
            AzureCredentialsFactory factory = new AzureCredentialsFactory();
            AzureCredentials msiCred = factory.FromMSI(new MSILoginInformation(MSIResourceType.AppService), AzureEnvironment.AzureGlobalCloud);
            var azure = Azure.Configure().WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic).Authenticate(msiCred).WithDefaultSubscription();

            var nsg = azure.NetworkSecurityGroups.GetByResourceGroup("TestNSGRG", "RSTestNSG1");

            return (ActionResult)new OkObjectResult(string.Format("NSG {0} found with {1} default security rules", nsg.Name, nsg.DefaultSecurityRules.Count));
        }
    }
}

Окончательный вывод

enter image description here

...