Поделиться через


Управление группами ресурсов Azure с помощью API-функции TypeScript

В этом руководстве вы создадите локальное приложение-функцию TypeScript Azure с API для управления группами ресурсов Azure и развертыванием приложения в Azure.

Функции и функции:

  • Создание проекта локального приложения-функции TypeScript в Visual Studio Code
  • Создание стандартного кода API функций в Visual Studio Code
  • Развертывание в Функции Azure из Visual Studio Code
  • Создание субъекта-службы с помощью интерфейса командной строки Azure
  • Настройка параметров локального и удаленного приложения с помощью Visual Studio Code
  • Использование DefaultAzureCredential в локальных и удаленных средах для подключений без пароля
  • Использование пакетов SDK для управления удостоверениями Azure и Azure Resource Management для управления ресурсами Azure
  • использование локальных и облачных API-интерфейсов для создания, удаления и перечисления групп ресурсов в подписке.

Хотя исходный код написан с помощью TypeScript, он является несложным. Если вы комфортно с современным JavaScript с помощью async/await, код будет знаком вам.

Создание новой или использование существующей подписки Azure

Вам потребуется учетная запись Azure с активной подпиской. Создайте ее бесплатно.

Необходимые компоненты

  • Node.js LTS 18+ и npm , установленные на локальном компьютере. Ваша локальная версия среды разработки Node.js должна соответствовать одной из доступных версий облачной среды выполнения функции Azure.
  • Установите на локальный компьютер Visual Studio Code.
  • Функции Azure Core Tools версии 4.0.5095 или более поздней версии
  • Azure Cloud Shell или Azure CLI , установленные на локальном компьютере.

Архитектура приложения

Приложение предоставляет следующие конечные точки API:

Способ URL Description
POST, DELETE http://localhost:7071/api/resourcegroup Добавление или удаление группы ресурсов. При добавлении включите теги (пары "ключ-значение"), чтобы определить назначение группы позже.
GET http://localhost:7071/api/resourcegroups Вывод списка всех групп ресурсов в подписке.
GET http://localhost:7071/api/resources Вывод списка всех ресурсов в подписке или группе ресурсов.

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

Это приложение ограничено подпиской, так как это область, указанный при создании субъекта-службы.

1. Подготовка среды

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

Вход в Azure CLI

В терминале bash войдите в Azure CLI с помощью следующей команды:

az login

Получение идентификатора подписки Azure

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

    az account list --query "sort_by([].{Name:name, SubscriptionId:id, TenantId:tenantId}, &Name)" --output table
    
  2. Скопируйте идентификатор подписки в предыдущий временный файл. Вам потребуется этот параметр позже.

Создание субъекта-службы Azure

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

  1. Определите формат имени субъекта-службы, чтобы потом можно было легко найти субъект-службу. Вот некоторые варианты формата:

    • Проект и его владелец: resource-management-john-smith.
    • Ваш отдел и дата: IT-2021-September.
    • Уникальный идентификатор: 00000000-0000-0000-0000-000000000000.
  2. В терминале Bash создайте субъект-службу с помощью az ad sp create-for-rbac. Замените <SUBSCRIPTION-ID> идентификатором своей подписки.

    az ad sp create-for-rbac --name YOUR-SERVICE-PRINCIPAL-NAME --role Contributor --scopes /subscriptions/<SUBSCRIPTION-ID>
    
  3. Скопируйте все выходные данные во временный файл. Эти параметры потребуются позже.

    {
      "appId": "YOUR-SERVICE-PRINCIPAL-ID",
      "displayName": "YOUR-SERVICE-PRINCIPAL-NAME",
      "name": "http://YOUR-SERVICE-PRINCIPAL-NAME",
      "password": "YOUR-SERVICE-PRINCIPAL-PASSWORD",
      "tenant": "YOUR-TENANT-ID"
    }
    

2. Создание локального приложения-функции Azure в Visual Studio Code

Создайте приложение-функцию Azure в Visual Studio Code для управления группами ресурсов Azure.

Создание приложения-функции

Для создания локального приложения-функции используйте Visual Studio Code.

  1. В терминале Bash создайте новый каталог и перейдите в него:

    mkdir my-function-app && cd my-function-app
    
  2. В терминале Bash откройте Visual Studio Code:

    code .
    
  3. Откройте палитру команд в Visual Studio Code: CTRL + SHIFT + P.

  4. Введите Azure Functions: create new project. Для ввода необходимых данных используйте значения из следующей таблицы:

    Prompt Значение
    Выберите папку, содержащую проект функции Выберите каталог по умолчанию (current)
    Выбор языка Выберите TypeScript.
    Выбор модели программирования TypeScript Выбор модели версии 4 (предварительная версия)
    Выбор шаблона для первой функции проекта Выберите Триггер HTTP.
    Создание триггера HTTP Введите имя API resourcegroups.
    Уровень авторизации Выберите значение anonymous. Если вы продолжите работу с этим проектом после этой статьи, измените уровень авторизации на функцию. Дополнительные сведения см. в разделе об авторизации на уровне функций.

    Создается шаблон проекта и устанавливаются зависимости.

Добавление параметров субъекта-службы в файл local.settings.json

  1. Откройте файл в корневом каталоге ./local.settings.json проекта и добавьте раздел VALUES с пятью следующими переменными среды.

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "",
        "FUNCTIONS_WORKER_RUNTIME": "node",
        "AzureWebJobsFeatureFlags": "EnableWorkerIndexing",
        "AZURE_CLIENT_ID": "REPLACE-WITH-SERVICE-PRINCIPAL-APPID",
        "AZURE_CLIENT_SECRET": "REPLACE-WITH-SERVICE-PRINCIPAL-PASSWORD",
        "AZURE_SUBSCRIPTION_ID":"REPLACE-WITH-SUBSCRIPTION-ID",
        "AZURE_TENANT_ID":"REPLACE-WITH-SERVICE-PRINCIPAL-TENANT",
        "NODE_ENV":"development"
      }
    }
    
  2. Чтобы добавить значения, ознакомьтесь с параметрами из предыдущего раздела. Эти переменные среды обязательны для контекста использования DefaultAzureCredential.

    • AZURE_TENANT_ID: tenant из выходных данных вышеуказанного субъекта-службы.
    • AZURE_CLIENT_ID: appId из выходных данных вышеуказанного субъекта-службы.
    • AZURE_CLIENT_SECRET: password из выходных данных вышеуказанного субъекта-службы.
  3. Кроме того, необходимо указать идентификатор подписки. Для управления ресурсами необходимо использовать пакет SDK Azure.

    • AZURE_SUBSCRIPTION_ID — ваша подписка по умолчанию с группами ресурсов.

Этот файл local.settings.json специально игнорируется локальной версией git, чтобы вы случайно не зафиксировали его в свой исходный код.

Установка зависимостей npm для управления удостоверениями и ресурсами Azure

В интегрированном терминале Bash Visual Studio Code установите зависимости пакета Azure SDK для управления удостоверениями и ресурсами Azure.

npm install @azure/identity @azure/arm-resources

Вывод списка всех групп ресурсов в подписке с помощью JavaScript

  1. Откройте файл ./src/functions/resourcegroups.ts и замените его содержимое следующим:

    import { ResourceGroup } from '@azure/arm-resources';
    import {
      app,
      HttpRequest,
      HttpResponseInit,
      InvocationContext
    } from '@azure/functions';
    import {
      createResourceGroup,
      deleteResourceGroup
    } from '../lib/azure-resource-groups';
    import { processError } from '../lib/error';
    
    export async function resourcegroup(
      request: HttpRequest,
      context: InvocationContext
    ): Promise<HttpResponseInit> {
      try {
        console.log(JSON.stringify(request.query));
        console.log(JSON.stringify(request.params));
    
        const name: string = request.query.get('name');
        const location: string = request.query.get('location');
        console.log(`name: ${name}`);
        console.log(`location: ${location}`);
    
        switch (request.method) {
          case 'POST': // wait for create to complete before returning
            if (!name || !location) {
              return { body: 'Missing required parameters.', status: 400 };
            }
    
            if (request.headers.get('content-type') === 'application/json') {
              // create with tags
    
              const body: Record<string, unknown> =
                (await request.json()) as Record<string, string>;
              const tags: Record<string, string> = body?.tags
                ? (body?.tags as Record<string, string>)
                : null;
              const resourceGroup: ResourceGroup = await createResourceGroup(
                name,
                location,
                tags
              );
              return { jsonBody: resourceGroup, status: 200 };
            } else {
              // create without tags
    
              const resourceGroup: ResourceGroup = await createResourceGroup(
                name,
                location,
                null
              );
              return { jsonBody: resourceGroup, status: 200 };
            }
    
          case 'DELETE': // wait for delete to complete before returning
            if (!name) {
              return { body: 'Missing required parameters.', status: 400 };
            }
            await deleteResourceGroup(name);
            return { status: 204 };
        }
      } catch (err: unknown) {
        return processError(err);
      }
    }
    
    app.http('resourcegroup', {
      methods: ['DELETE', 'POST'],
      authLevel: 'anonymous',
      handler: resourcegroup
    });
    

    Этот файл отвечает на запросы /api/resourcegroups API и возвращает список всех групп ресурсов в подписке.

  2. Создайте подкаталог в src именованном libazure-resource-groups.tsи создайте новый файл в этом каталоге.

  3. Скопируйте в файл ./src/lib/azure-resource-groups.ts следующий код:

    // Include npm dependencies
    import {
      ResourceGroup, ResourceManagementClient
    } from '@azure/arm-resources';
    import { DefaultAzureCredential } from '@azure/identity';
    import { getSubscriptionId } from './environment-vars';
    
    const subscriptionId = getSubscriptionId();
    
    // Create Azure authentication credentials
    const credentials = new DefaultAzureCredential();
    
    // Create Azure SDK client for Resource Management such as resource groups
    const resourceManagement = new ResourceManagementClient(
      credentials,
      subscriptionId
    );
    
    // all resources groups in subscription
    export const listResourceGroups = async (): Promise<{
      list: ResourceGroup[];
      subscriptionId: string;
    }> => {
      const list: ResourceGroup[] = [];
      for await (const resourceGroup of resourceManagement.resourceGroups.list()) {
        list.push(resourceGroup);
      }
      return {
        subscriptionId,
        list
      };
    };
    export const createResourceGroup = async (
      resourceGroupName: string,
      location: string,
      tags: { [propertyName: string]: string }
    ): Promise<ResourceGroup> => {
      const resourceGroupParameters = {
        location: location,
        tags
      };
    
      return await resourceManagement.resourceGroups.createOrUpdate(
        resourceGroupName,
        resourceGroupParameters
      );
    };
    export const deleteResourceGroup = async (
      resourceGroupName: string
    ): Promise<void> => {
      return await resourceManagement.resourceGroups.beginDeleteAndWait(
        resourceGroupName
      );
    };
    

    В файле выполняются следующие действия:

    • получение идентификатора подписки;
    • создание контекста DefaultAzureCredential;
    • создание объекта ResourceManagementClient, который требуется для использования пакета SDK управления ресурсами;
    • получение списка всех групп ресурсов в подписке.
  4. Создайте файл в каталоге ./src/lib с именем environment-vars.ts и скопируйте следующий код в этот файл.

    export const checkAzureAuth = () => {
      // The following code is only used to check you have environment
      // variables configured. The DefaultAzureCredential reads your
      // environment - it doesn't read these variables.
      const tenantId = process.env['AZURE_TENANT_ID'];
      if (!tenantId)
        throw Error('AZURE_TENANT_ID is missing from environment variables.');
      const clientId = process.env['AZURE_CLIENT_ID'];
      if (!clientId)
        throw Error('AZURE_CLIENT_ID is missing from environment variables.');
      const secret = process.env['AZURE_CLIENT_SECRET'];
      if (!secret)
        throw Error('AZURE_CLIENT_SECRET is missing from environment variables.');
    };
    
    export const getSubscriptionId = (): string => {
      checkAzureAuth();
    
      // Get subscription from environment variables
      const subscriptionId = process.env['AZURE_SUBSCRIPTION_ID'];
      if (!subscriptionId)
        throw Error('Azure Subscription is missing from environment variables.');
      return subscriptionId;
    };
    

    В этом файле проверяются переменные среды перед возвратом идентификатора подписки.

  5. Создайте файл в каталоге ./src/lib с именем error.ts и скопируйте следующий код в этот файл.

    export function processError(err: unknown): any {
      if (typeof err === 'string') {
        return { body: err.toUpperCase(), status: 500 };
      } else if (
        err['stack'] &&
        process.env.NODE_ENV.toLowerCase() !== 'production'
      ) {
        return { jsonBody: { stack: err['stack'], message: err['message'] } };
      } else if (err instanceof Error) {
        return { body: err.message, status: 500 };
      } else {
        return { body: JSON.stringify(err) };
      }
    }
    

    Этот файл возвращает ошибку 500 с сообщением об ошибке. Стек возвращается, если NODE_ENV переменная не задана production.

Тестирование локальных функций

  1. В интегрированном терминале Visual Studio Code запустите локальный проект:

    npm start
    
  2. Подождите, пока во встроенном терминале Bash отобразится URL-адрес выполняющейся функции.

    Частичный снимок экрана: интегрированный терминал Bash в Visual Studio Code, в котором функция Azure выполняется локально и отображается локальный URL-адрес для интерфейсов API в приложении-функции.

  3. Откройте второй интегрированный терминал bash в Visual Studio Code, CTRL + SHIFT + 5 и используйте следующую команду GET cURL для использования API:

    curl http://localhost:7071/api/resourcegroups
    

    Если в подписке много групп ресурсов, возможно, потребуется передавать выходные данные в файл для упрощения проверки.

    curl http://localhost:7071/api/resourcegroups > resourcegroups.json
    
  4. Ответ включает subscriptionId и list все группы ресурсов в этой подписке.

    {
      "subscriptionId": "ABC123",
      "list": [
            {
              "id": "/subscriptions/ABC123/resourceGroups/vmagelo-cloudshell",
              "name": "jsmith-cloudshell",
              "type": "Microsoft.Resources/resourceGroups",
              "properties": {
                "provisioningState": "Succeeded"
              },
              "location": "westeurope"
            },
            ... REMOVED FOR BREVITY ...
        ]
    }
    

Устранение неполадок

Если вам не удалось выполнить инструкции из этой статьи, ознакомьтесь с проблемами, описанными в следующей таблице. Если возникшая у вас проблема не описана в таблице, сообщите о ней на этой странице документации.

Проблема Исправление
Приложение не запустилось. Просмотрите журнал ошибок. Убедитесь, что вы установили необходимые зависимости.
Приложение запустилось, но вы не можете получить ответ 200. Убедитесь, что команда cURL запрашивает данные из правильного локального маршрута.
Интерфейс API вернул ответ 200, но не вернул результаты. Используйте расширение Visual Studio Code для ресурсов Azure, чтобы убедиться в наличии групп ресурсов в вашей подписке. Если в вашей подписке не окажется ни одной группы ресурсов, не беспокойтесь. В этом руководстве добавлен API для создания и удаления групп ресурсов в подписке. Этот API добавляется после первого развертывания исходного кода в Azure, чтобы вы могли научиться повторно развертывать код.

3. Создание облачного приложения-функции Azure

  1. В Visual Studio Code щелкните значок Azure, чтобы открыть Обозреватель Azure.

  2. + Щелкните значок, чтобы создать новое приложение-функцию Azure в облаке Azure.

    Снимок экрана: Обозреватель Azure Visual Studio Code с выделенным значком приложения-функции Azure.

  3. Выберите "Создать приложение-функцию" в Azure.

  4. Введите глобально уникальное имя нового приложения-функции. Имя должно быть уникальным для всех функций Azure. Например, jsmith-rg-management.

  5. Выберите ту же среду выполнения Node.js 18+ LTS, которую вы выбрали при создании локального приложения-функции.

  6. Выберите географическое расположение рядом с вами, например западная часть США 3.

  7. Подождите, пока ресурс не будет создан. Дополнительные сведения см. в журнале действий Azure.

    Снимок экрана: журнал действий Azure Visual Studio Code с состоянием создания ресурса.

4. Настройка облачного приложения-функции Azure

Чтобы подключиться к приложению-функции Azure, необходимо настроить параметры приложения Azure. В локальной среде эти параметры находятся в файле local.settings.json. При этом эти значения добавляются в облачное приложение.

  1. В Visual Studio Code в обозревателе Azure в разделе "Ресурсы " разверните приложение-функцию и выберите приложение-функцию.

  2. Щелкните правой кнопкой мыши Параметры приложения и выберите Add New Setting (Добавить параметр).

  3. Добавьте четыре значения из файла local.settings.json с точно такими же именами и значениями.

    • AZURE_TENANT_ID: tenant из выходных данных вышеуказанного субъекта-службы.
    • AZURE_CLIENT_ID: appId из выходных данных вышеуказанного субъекта-службы.
    • AZURE_CLIENT_SECRET: password из выходных данных вышеуказанного субъекта-службы.
    • AZURE_SUBSCRIPTION_ID — ваша подписка по умолчанию с группами ресурсов.
    • AzureWebJobsFeatureFlags:EnableWorkerIndexing

Снимок части экрана: обозреватель Azure в Visual Studio Code с параметрами приложения функции удаления или облачной функции.

5. Развертывание приложения-функции Resource Manager

Разверните приложение-функцию Azure в Visual Studio Code для управления группами ресурсов Azure.

Использование расширения Visual Studio Code для развертывания среды размещения

  1. В VS Code откройте local.settings.json файл, чтобы он был видимым. Это упрощает копирование этих имен и значений.

  2. Выберите логотип Azure, чтобы открыть Обозреватель Azure, а затем в разделе "Функции" выберите значок облака для развертывания приложения.

    Снимок экрана: локальная рабочая область Visual Studio Code с выделенным значком облачного развертывания.

    Кроме того, для выполнения развертывания вы можете открыть палитру команд с помощью клавиш CTRL + SHIFT + P, ввести текст deploy to function app и выполнить команду Azure Functions: Deploy to Function App.

  3. Выберите " Развернуть в приложении-функции".

  4. Выберите имя приложения-функции, созданное в предыдущем разделе.

  5. Если вы хотите развернуть, нажмите кнопку "Развернуть".

  6. Сведения о ходе выполнения отображаются на панели Выходные данные в VS Code в разделе Функции Azure. При развертывании передается все приложение-функция, то есть все изменения отдельных функций будут развернуты одновременно.

Проверка доступности приложения-функции с помощью браузера

  1. Находясь в Visual Studio Code, перейдите к обозревателю Функций Azure, а затем последовательно разверните узел подписки Azure, узел приложения-функции и узел Функции (только для чтения). Щелкните правой кнопкой мыши имя функции и выберите действие Copy Function Url (Копирование URL-адреса функции).

    Снимок части экрана: обозреватель Azure в Visual Studio Code с URL-адресом функции для копирования.

  2. Вставьте URL-адрес в браузер и нажмите клавишу ВВОД , чтобы запросить список групп ресурсов из облачного API.

6. Добавление API-интерфейсов в приложение-функцию и повторное развертывание в Azure

Добавьте следующие API, а затем повторно разверните приложение-функцию Azure в Visual Studio Code:

  • Добавление и удаление групп ресурсов
  • Вывод списка ресурсов в группе ресурсов или подписке.

На этом этапе учебника вы создали локальное приложение-функцию с одним API для перечисления групп ресурсов подписки и развернули это приложение в Azure. Как разработчику Azure вам может понадобиться создать или удалить группы ресурсов в рамках конвейера автоматизации процессов.

Создание API группы ресурсов для приложения-функции

Используйте расширение Visual Studio Code для Функции Azure, чтобы добавить файлы TypeScript в приложение-функцию для создания и удаления групп ресурсов.

  1. Откройте палитру команд в Visual Studio Code: CTRL + SHIFT + P.

  2. Введите Azure Functions: Create Function, затем нажмите клавишу ВВОД, чтобы начать процесс.

  3. Используйте следующую таблицу для создания API /api/resourcegroup :

    Prompt Значение
    Выбор шаблона для функции Триггер HTTP
    Provide a function name (Укажите имя функции) resourcegroup
    Уровень авторизации Выберите значение anonymous. Если вы продолжите работу с этим проектом, измените уровень авторизации на функцию. Дополнительные сведения см. в разделе об авторизации на уровне функций.
  4. Откройте и замените ./src/functions/resourcegroup.ts весь файл следующим исходным кодом.

    import { ResourceGroup } from '@azure/arm-resources';
    import {
      app,
      HttpRequest,
      HttpResponseInit,
      InvocationContext
    } from '@azure/functions';
    import {
      createResourceGroup,
      deleteResourceGroup
    } from '../lib/azure-resource-groups';
    import { processError } from '../lib/error';
    
    export async function resourcegroup(
      request: HttpRequest,
      context: InvocationContext
    ): Promise<HttpResponseInit> {
      try {
        console.log(JSON.stringify(request.query));
        console.log(JSON.stringify(request.params));
    
        const name: string = request.query.get('name');
        const location: string = request.query.get('location');
        console.log(`name: ${name}`);
        console.log(`location: ${location}`);
    
        switch (request.method) {
          case 'POST': // wait for create to complete before returning
            if (!name || !location) {
              return { body: 'Missing required parameters.', status: 400 };
            }
    
            if (request.headers.get('content-type') === 'application/json') {
              // create with tags
    
              const body: Record<string, unknown> =
                (await request.json()) as Record<string, string>;
              const tags: Record<string, string> = body?.tags
                ? (body?.tags as Record<string, string>)
                : null;
              const resourceGroup: ResourceGroup = await createResourceGroup(
                name,
                location,
                tags
              );
              return { jsonBody: resourceGroup, status: 200 };
            } else {
              // create without tags
    
              const resourceGroup: ResourceGroup = await createResourceGroup(
                name,
                location,
                null
              );
              return { jsonBody: resourceGroup, status: 200 };
            }
    
          case 'DELETE': // wait for delete to complete before returning
            if (!name) {
              return { body: 'Missing required parameters.', status: 400 };
            }
            await deleteResourceGroup(name);
            return { status: 204 };
        }
      } catch (err: unknown) {
        return processError(err);
      }
    }
    
    app.http('resourcegroup', {
      methods: ['DELETE', 'POST'],
      authLevel: 'anonymous',
      handler: resourcegroup
    });
    
  5. Файл ./src/lib/azure-resource-groups.ts уже содержит код для добавления и удаления групп ресурсов.

Создание API ресурсов для приложения-функции

Используйте расширение Visual Studio Code для Функции Azure, чтобы добавить файлы TypeScript в приложение-функцию для перечисления ресурсов в группе ресурсов.

  1. Откройте палитру команд в Visual Studio Code: CTRL + SHIFT + P.

  2. Введите Azure Functions: Create Function, затем нажмите клавишу ВВОД, чтобы начать процесс.

  3. Используйте следующую таблицу для создания API /api/resources :

    Prompt Значение
    Выбор шаблона для функции Триггер HTTP
    Provide a function name (Укажите имя функции) resources
    Уровень авторизации Выберите значение anonymous. Если вы продолжите работу с этим проектом, измените уровень авторизации на функцию. Дополнительные сведения см. в разделе об авторизации на уровне функций.
  4. Откройте и замените ./src/functions/resources.ts весь файл следующим исходным кодом.

    import {
      app,
      HttpRequest,
      HttpResponseInit,
      InvocationContext
    } from '@azure/functions';
    import {
      listResourceByResourceGroup, listResourceBySubscription
    } from '../lib/azure-resource';
    import { processError } from '../lib/error';
    
    export async function resources(
      request: HttpRequest,
      context: InvocationContext
    ): Promise<HttpResponseInit> {
      try {
        const resourceGroupName: string = request.query.get('resourceGroupName');
        context.log(`resourceGroupName: '${resourceGroupName}'`);
    
        if (resourceGroupName) {
          const resourcesByName = await listResourceByResourceGroup(
            resourceGroupName
          );
          return { jsonBody: resourcesByName };
        } else {
          const resourcesBySubscription = await listResourceBySubscription();
          return { jsonBody: resourcesBySubscription };
        }
      } catch (err: unknown) {
        return processError(err);
      }
    }
    app.http('resources', {
      methods: ['GET'],
      authLevel: 'anonymous',
      handler: resources
    });
    
  5. ./src/lib/azure-resource.ts Создайте файл и скопируйте в него следующий код, чтобы вывести список ресурсов в группе ресурсов.

    // Include npm dependencies
    import { Resource, ResourceManagementClient } from '@azure/arm-resources';
    import { DefaultAzureCredential } from '@azure/identity';
    import { getSubscriptionId } from './environment-vars';
    
    const subscriptionId = getSubscriptionId();
    
    // Create Azure authentication credentials
    const credentials = new DefaultAzureCredential();
    
    // Create Azure SDK client for Resource Management such as resource groups
    const resourceManagement = new ResourceManagementClient(
      credentials,
      subscriptionId
    );
    
    // all resources groups in subscription
    export const listResourceBySubscription = async (): Promise<{
      list: Resource[];
      subscriptionId: string;
    }> => {
      const list: Resource[] = [];
    
      for await (const resource of resourceManagement.resources.list()) {
        list.push(resource);
      }
    
      return {
        subscriptionId,
        list
      };
    };
    // all resources groups in resource group
    export const listResourceByResourceGroup = async (
      resourceGroupName: string
    ): Promise<{
      list: Resource[];
      subscriptionId: string;
      resourceGroupName: string;
    }> => {
      const list: Resource[] = [];
    
      for await (const resource of resourceManagement.resources.listByResourceGroup(
        resourceGroupName
      )) {
        list.push(resource);
      }
    
      return {
        subscriptionId,
        resourceGroupName,
        list
      };
    };
    

Запуск локального приложения-функции и проверка нового API

  1. В интегрированном терминале Visual Studio Code запустите локальный проект:

    npm start
    
  2. Подождите, пока во встроенном терминале Bash отобразится URL-адрес выполняющейся функции.

    Снимок части экрана: встроенный терминал Bash в Visual Studio Code, в котором функция Azure выполняется локально и отображаются локальные URL-адреса для интерфейсов API в приложении-функции.

  3. Используйте следующие команды curl в другом интегрированном терминале Bash, чтобы вызвать API, чтобы добавить группу ресурсов в подписку. Чтобы использовать собственные соглашения об именовании, измените имя группы ресурсов.

    curl -X POST 'http://localhost:7071/api/resourcegroup?name=my-test-1&location=westus'
    
    curl -X POST 'http://localhost:7071/api/resourcegroup?name=my-test-1&location=westus' \
      -H 'content-type: application/json' \
      -d '{"tags": {"a":"b"}}'
    
  4. Чтобы увидеть новую группу ресурсов, указанную в подписке, используйте команду cURL, приведенную ниже.

    curl http://localhost:7071/api/resource-groups
    
  5. Чтобы удалить только что добавленную группу ресурсов, используйте команду cURL, приведенную ниже.

    curl -X DELETE 'http://localhost:7071/api/resourcegroup?name=my-test-1' \
      -H 'Content-Type: application/json'
    

Повторное развертывание приложения-функции с помощью новых API-интерфейсов в Azure

  1. В VS Code разверните, открыв палитру команд с помощью CTRL + SHIFT + p, введя deploy to function appи выполнив команду Функции Azure: развертывание в приложении-функции.

  2. Выберите свое приложение-функцию из списка приложений.

  3. Выберите Развернуть во всплывающем окне.

  4. Подождите, пока развертывание завершится.

Проверка API-интерфейсов функций с помощью браузера

Используйте предыдущие команды cURL, заменив адрес localhost именем ресурса функции Azure, http://localhost:7071 например https://myfunction.azurewebsites.net.

7. Просмотр и запрос журналов приложения-функции

Просмотр и запрос журналов приложений-функций Azure в портал Azure.

Запрашивание журналов Функций Azure

Для просмотра и запроса журналов функций используйте портал Azure.

  1. В VS Code щелкните логотип Azure, чтобы открыть Azure Explorer, а затем в разделе Функции щелкните правой кнопкой мыши нужное приложение-функцию и выберите Открыть на портале.

    Откроется страница портала Azure для Функции Azure.

  2. Выберите Application Insights в разделе параметров, а затем щелкните Просмотреть данные Application Insights.

    Снимок экрана браузера, на котором показаны варианты меню. Выберите приложение Аналитика из Параметры, а затем выберите

    Эта ссылка позволяет перейти к отдельному ресурсу метрик, созданному вместе с Функцией Azure в VS Code.

  3. Щелкните Журналы в разделе мониторинга. Если появится всплывающее окно Запросы, щелкните значок X в правом верхнем углу, чтобы закрыть его.

  4. В области Схема и фильтр на вкладке Таблицы дважды щелкните таблицу traces.

    Это действие помещает запрос Kustotraces в окно запроса.

  5. Измените запрос, чтобы найти вызовы API:

    traces 
    | where message startswith "Executing "
    
  6. Выберите Выполнить.

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

    Снимок экрана: в браузере отображается портал Azure с результатом запроса к Kusto по таблице Trace.

    Так как ресурс приложения Аналитика добавлен для вас при создании приложения-функции Azure, вам не нужно ничего дополнительного, чтобы получить эти сведения для ведения журнала:

    • Приложение-функция добавило Application Insights за вас.
    • Средство выполнения запросов включено в портал Azure.
    • Вы можете выбрать traces вместо того, чтобы научиться писать запрос Kusto, чтобы получить даже минимальную информацию из журналов.

8. Очистка ресурсов Azure

Удаление группы ресурсов

  1. В VS Code выберите логотип Azure, чтобы открыть Обозреватель Azure, а затем в разделе "Функции" щелкните правой кнопкой мыши приложение-функцию, а затем выберите "Открыть на портале". Откроется портал Azure функции Azure.

  2. В разделе "Обзор" найдите и выберите имя группы ресурсов. Это действие принимает вас в группу ресурсов в портал Azure.

  3. На странице группы ресурсов перечислены все ресурсы, связанные с этим руководством.

  4. В главном меню выберите Удалить группу ресурсов.

  5. В боковом меню введите имя группы ресурсов и нажмите кнопку "Удалить".

Удаление субъекта-службы

Чтобы удалить субъект-службу, выполните следующую команду. Замените <YOUR-SERVICE-PRINCIPAL-NAME> именем субъекта-службы.

az ad sp delete --id <YOUR-SERVICE-PRINCIPAL-NAME>

Пример кода

Следующие шаги