Приступая к разработке для Azure CDN

С помощью пакета SDK Azure CDN для JavaScript можно автоматизировать создание профилей и конечных точек CDN и управление ими. В этом руководстве описывается создание простого консольного приложения Node.js с примерами некоторых доступных операций. Это руководство не содержит подробные сведения обо всех свойствах пакета Azure CDN SDK для JavaScript.

Для работы с этим учебником должен быть установлен и настроен компонент Node.js6.x.x или более поздней версии. Для создания приложения Node.js вы можете использовать любой текстовый редактор. Например, в этом учебнике используется Visual Studio Code.

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

Перед созданием кода управления CDN необходимо выполнить определенную подготовку, чтобы код мог взаимодействовать с Azure Resource Manager. Для этого сделайте следующее:

  • Создайте группу ресурсов для профиля CDN, который мы создадим в этом руководстве.
  • Настройка идентификатора Microsoft Entra для предоставления проверки подлинности для приложения
  • Применение разрешений к группе ресурсов, чтобы только авторизованные пользователи из клиента Microsoft Entra могли взаимодействовать с профилем CDN.

Создание группы ресурсов

  1. Войдите на портал Azure.

  2. Щелкните Создать ресурс.

  3. Найдите Группу ресурсов, а затем в ее области щелкните Создать.

    Создание новой группы ресурсов

  4. Назовите группу ресурсов CdnConsoleTutorial. Выберите свою подписку и ближайшее расположение. При желании установите флажок Закрепить на панели мониторинга, чтобы закрепить группу ресурсов на панели мониторинга на портале. Так ее будет проще найти. Выберите необходимые параметры, а затем нажмите кнопку Создать.

    Снимок экрана с диалоговым окном

  5. Если вы не закрепили созданную группу ресурсов на панели мониторинга, щелкните Обзор, а затем — Группы ресурсов, чтобы найти группу. Щелкните группу ресурсов, чтобы открыть ее. Запишите идентификатор подписки. Он понадобится нам позже.

    Снимок экрана с разделом учебника по консоли C D N.

Создание приложения Microsoft Entra и применение разрешений

Существует два подхода к проверке подлинности приложения с помощью идентификатора Microsoft Entra: отдельных пользователей или субъекта-службы. Субъект-служба аналогичен учетной записи службы в Windows. Вместо того, чтобы предоставить разрешения на взаимодействие с профилями CDN определенному пользователю, мы предоставляем их субъекту-службе. Субъекты-службы обычно используются для автоматических, неинтерактивных процессов. Несмотря на то, что в этом учебнике создается интерактивное приложение консоли, мы будем использовать субъект-службу.

Создание субъекта-службы состоит из нескольких шагов, включая создание приложения Microsoft Entra. Для этого воспользуйтесь инструкциями из этого руководства.

Внимание

Обязательно выполните все шаги, приведенные в связанном руководстве. Важно выполнить все в точности, как описано. Обязательно запишите идентификатор клиента, доменное имя клиента (обычно это домен .onmicrosoft.com, если вы не указали личный домен), идентификатор клиента и ключ проверки подлинности клиента, так как эти данные понадобятся позже. Следует ответственно отнестись к защите идентификатора клиента и ключа проверки подлинности клиента, так как с помощью этих учетных данных любой пользователь может выполнять операции в качестве субъекта-службы.

На шаге "Настройка мультитенантного приложения" выберите Нет.

На шаге Назначение роли приложению укажите группу ресурсов CdnConsoleTutorial, созданную ранее, но вместо роли Читатель назначьте роль Участник профиля CDN. Назначьте приложению роль Участник профиля CDN для группы ресурсов, а затем вернитесь к этому руководству.

Когда вы создадите субъект-службу и назначите роль Участник профиля CDN, колонка Пользователи вашей группы ресурсов будет выглядеть так.

Колонка

Интерактивная аутентификация пользователей

Если вместо субъекта-службы требуется настроить интерактивную аутентификацию отдельных пользователей, то необходимые действия будут похожи на настройку субъекта-службы. На самом деле необходимо выполнить ту же самую процедуру, но с незначительными изменениями.

Внимание

Выполните следующие шаги, только если решили использовать аутентификацию отдельных пользователей, а не субъект-службу.

  1. Создавая приложение, вместо значения Веб-приложение выберите Собственное приложение.

    Собственное приложение

  2. На следующей странице вам будет предложено ввести универсальный код ресурса (URI) перенаправления. Универсальный код ресурса (URI) не будет проверяться, но запомните, что вы ввели. Он понадобится вам позже.

  3. Не нужно создавать ключ проверки подлинности клиента.

  4. Вместо того, чтобы назначить роль Участник роли CDN субъекту-службе, мы назначим ее отдельным пользователям или группам. Из этого примера понятно, что пользователю CDN Demo User назначена роль CDN Profile Contributor (Участник профиля CDN).

    Индивидуальный доступ пользователей

Создание проекта и добавление зависимостей npm

Теперь, когда мы создали группу ресурсов для профилей CDN и предоставили приложению Microsoft Entra разрешение на управление профилями и конечными точками CDN в этой группе, мы можем приступить к созданию приложения.

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

npm init

Вам будет предложено ответить на ряд вопросов для инициализации проекта. В качестве точки входав этом руководстве используется app.js. В приведенном ниже примере вы можете увидеть значения других параметров.

Снимок экрана: выходные данные инициализации NPM.

Теперь наш проект будет инициализирован с помощью файла packages.json . Наш проект будет использовать некоторые библиотеки Azure, содержащиеся в пакетах npm. Мы будем использовать библиотеку для проверки подлинности Microsoft Entra в Node.js (@Azure/identity) и клиентской библиотеке Azure CDN для JavaScript (@Azure/Azure Resource Manager-cdn). Давайте добавим эти зависимости в проект.

npm install --save @azure/identity
npm install --save @azure/arm-cdn

Когда установка этих пакетов завершится, файл package.json должен выглядеть примерно так (номер версии может отличаться):

{
  "name": "cdn_node",
  "version": "1.0.0",
  "description": "Azure CDN Node.js tutorial project",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Cam Soper",
  "license": "MIT",
  "dependencies": {
    "@azure/arm-cdn": "^7.0.1",
    "@azure/identity": "^2.0.4"
  }
}

И, наконец, создайте с помощью текстового редактора пустой текстовый файл и сохраните его с именем app.jsв корневой папке проекта. Теперь мы готовы приступить к написанию кода.

Требования, константы, проверка подлинности и структура

Давайте откроем файл app.js в редакторе и создадим базовую структуру нашей программы.

  1. Добавьте "требуется" для наших пакетов npm в верхней части с помощью следующих элементов:

    const { DefaultAzureCredential } = require("@azure/identity");
    const { CdnManagementClient } = require('@azure/arm-cdn');
    
  2. Необходимо определить несколько констант, которые будут использоваться нашими методами. Добавьте следующий код. Обязательно замените заполнители, включая <угловые скобки>, собственными значениями.

    //Tenant app constants
    const clientId = "<YOUR CLIENT ID>";
    const clientSecret = "<YOUR CLIENT AUTHENTICATION KEY>"; //Only for service principals
    const tenantId = "<YOUR TENANT ID>";
    
    //Application constants
    const subscriptionId = "<YOUR SUBSCRIPTION ID>";
    const resourceGroupName = "CdnConsoleTutorial";
    const resourceLocation = "<YOUR PREFERRED AZURE LOCATION, SUCH AS Central US>";
    
  3. Далее мы создадим клиент управления CDN и передадим ему наши учетные данные.

    var credentials = new DefaultAzureCredential();
    var cdnClient = new CdnManagementClient(credentials, subscriptionId);
    
  4. Консольное приложение Node.js будет принимать некоторые параметры командной строки. Давайте добавим проверку того, что передан хотя бы один параметр.

    //Collect command-line parameters
    var parms = process.argv.slice(2);
    
    //Do we have parameters?
    if(parms == null || parms.length == 0)
    {
        console.log("Not enough parameters!");
        console.log("Valid commands are list, delete, create, and purge.");
        process.exit(1);
    }
    
  5. Теперь мы добрались до основной части нашей программы — мы будем запускать другие функции в зависимости от того, какие параметры были переданы.

    switch(parms[0].toLowerCase())
    {
        case "list":
            cdnList();
            break;
    
        case "create":
            cdnCreate();
            break;
    
        case "delete":
            cdnDelete();
            break;
    
        case "purge":
            cdnPurge();
            break;
    
        default:
            console.log("Valid commands are list, delete, create, and purge.");
            process.exit(1);
    }
    
  6. Также мы будем проверять, передано ли нужное число параметров; если параметры имеют неправильный формат, будут отображены подсказки. Давайте создадим для этого функции.

    function requireParms(parmCount) {
        if(parms.length < parmCount) {
            usageHelp(parms[0].toLowerCase());
            process.exit(1);
        }
    }
    
    function usageHelp(cmd) {
        console.log("Usage for " + cmd + ":");
        switch(cmd)
        {
            case "list":
                console.log("list profiles");
                console.log("list endpoints <profile name>");
                break;
    
            case "create":
                console.log("create profile <profile name>");
                console.log("create endpoint <profile name> <endpoint name> <origin hostname>");
                break;
    
            case "delete":
                console.log("delete profile <profile name>");
                console.log("delete endpoint <profile name> <endpoint name>");
                break;
    
            case "purge":
                console.log("purge <profile name> <endpoint name> <path>");
                break;
    
            default:
                console.log("Invalid command.");
        }
    }
    
  7. Кроме того, мы будем использовать на клиенте управления CDN асинхронные функции, поэтому нам нужен метод для обратного вызова после завершения их работы. Давайте создадим такой метод, который будет отображать данные, полученные от клиента управления CDN (если они есть) и корректно завершать работу программы.

    function callback(err, result, request, response) {
        if (err) {
            console.log(err);
            process.exit(1);
        } else {
            console.log((result == null) ? "Done!" : result);
            process.exit(0);
        }
    }
    

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

Вывод списка профилей CDN и конечных точек

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

// list profiles
// list endpoints <profile name>
function cdnList(){
    requireParms(2);
    switch(parms[1].toLowerCase())
    {
        case "profiles":
            console.log("Listing profiles...");
            cdnClient.profiles.listByResourceGroup(resourceGroupName, callback);
            break;

        case "endpoints":
            requireParms(3);
            console.log("Listing endpoints...");
            cdnClient.endpoints.listByProfile(resourceGroupName, parms[2], callback);
            break;

        default:
            console.log("Invalid parameter.");
            process.exit(1);
    }
}

Создание профилей CDN и конечных точек

Теперь давайте напишем функцию для создания профилей и конечных точек.

function cdnCreate() {
    requireParms(2);
    switch(parms[1].toLowerCase())
    {
        case "profile":
            cdnCreateProfile();
            break;

        case "endpoint":
            cdnCreateEndpoint();
            break;

        default:
            console.log("Invalid parameter.");
            process.exit(1);
    }
}

// create profile <profile name>
async function cdnCreateProfile() {
    requireParms(3);
    console.log("Creating profile...");
    var standardCreateParameters = {
        location: resourceLocation,
        sku: {
            name: 'Standard_Verizon'
        }
    };

    await cdnClient.profiles.beginCreateAndWait( resourceGroupName, parms[2], standardCreateParameters, callback);
}

// create endpoint <profile name> <endpoint name> <origin hostname>        
async function cdnCreateEndpoint() {
    requireParms(5);
    console.log("Creating endpoint...");
    var endpointProperties = {
        location: resourceLocation,
        origins: [{
            name: parms[4],
            hostName: parms[4]
        }]
    };

    await cdnClient.endpoints.beginCreateAndWait(resourceGroupName, parms[2], parms[3], endpointProperties, callback);
}

Очистка конечной точки

Одной из задач, которая может выполняться в программе после создания конечной точки, является очистка содержимого в ней.

// purge <profile name> <endpoint name> <path>
async function cdnPurge() {
    requireParms(4);
    console.log("Purging endpoint...");
    var purgeContentPaths = [ parms[3] ];
    await cdnClient.endpoints.beginPurgeContentAndWait(resourceGroupName, parms[2], parms[3], purgeContentPaths, callback);
}

Удаление профилей CDN и конечных точек

Наша последняя функция будет удалять конечные точки и профили.

async function cdnDelete() {
    requireParms(2);
    switch(parms[1].toLowerCase())
    {
        // delete profile <profile name>
        case "profile":
            requireParms(3);
            console.log("Deleting profile...");
            await cdnClient.profiles.beginDeleteAndWait(resourceGroupName, parms[2], callback);
            break;

        // delete endpoint <profile name> <endpoint name>
        case "endpoint":
            requireParms(4);
            console.log("Deleting endpoint...");
            await cdnClient.endpoints.beginDeleteAndWait(resourceGroupName, parms[2], parms[3], callback);
            break;

        default:
            console.log("Invalid parameter.");
            process.exit(1);
    }
}

Запуск программы

Теперь мы можем выполнить нашу программу Node.js в любом удобном отладчике или консоли.

Совет

Если вы используете в качестве отладчика Visual Studio Code, вам потребуется настроить среду для передачи параметров командной строки. Для этой цели в Visual Studio Code используется файл launch.json. Найдите в нем свойство args и добавьте массив строковых значений со своими параметрами следующего вида: "args": ["list", "profiles"].

Давайте начнем с получения списка профилей.

Список профилей

Мы получили пустой массив. Так и должно быть, ведь в нашей группе ресурсов пока нет профилей. Теперь давайте создадим профиль.

Создание профиля

Теперь мы добавим конечную точку.

Создать конечную точку

И в завершение давайте удалим профиль.

Удалить профиль

Next Steps

Справочную информацию о пакете SDK Azure CDN для JavaScript вы найдете здесь.

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

Управление ресурсами CDN с помощью PowerShell.