開始使用 Azure CDN 開發

您可以使用適用於 JavaScriptAzure CDN SDK,自動建立和管理 CDN 配置檔和端點。 本教學課程會逐步引導您建立簡單的Node.js控制台應用程式,以示範數個可用的作業。 本教學課程並非要詳細說明適用於 JavaScript 的 Azure CDN SDK 的所有層面。

若要完成本教學課程,您應該已經 安裝並設定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 ID 進行應用程式驗證的方法有兩種:個別使用者或服務主體。 服務主體類似於 Windows 中的服務帳戶。 而不是授與特定用戶許可權來與 CDN 配置文件互動,而是將許可權授與服務主體。 服務主體通常用於自動化的非互動式進程。 雖然本教學課程正在撰寫互動式控制台應用程式,但我們仍將焦點放在服務主體方法上。

建立服務主體包含數個步驟,包括建立 Microsoft Entra 應用程式。 若要建立它,我們將 遵循本教學課程

重要

請務必遵循連結教學課程中的所有步驟。 請務必如所述完成。 請務必記下您的租使用者標識碼租使用者功能變數名稱(通常是 .onmicrosoft.com 網域,除非您已指定自定義網域)、用戶端標識符客戶端驗證密鑰,因為我們稍後需要此資訊。 請小心保護用戶端 識別碼客戶端驗證密鑰,因為任何人都可以使用這些認證來執行作業作為服務主體。

當您進入名為 [設定多租使用者應用程式] 的步驟時,請選取 [ ]。

當您進入將應用程式指派給角色的步驟時,請使用稍早建立的資源群組 CdnConsoleTutorial,但不是讀取者角色,而是指派 CDN 配置文件參與者角色。 在您指派應用程式 資源群組上的CDN設定檔參與者 角色之後,請返回本教學課程。

建立服務主體並指派 CDN 配置檔參與者 角色之後, 資源群組的 [使用者 ] 刀鋒視窗看起來應該類似下圖。

[使用者] 刀鋒視窗

互動式用戶驗證

如果您寧願擁有互動式個別用戶驗證,而不是服務主體,程式與服務主體類似。 事實上,您必須遵循相同的程式,但進行一些次要變更。

重要

只有在您選擇使用個別用戶驗證,而不是服務主體時,才遵循這些後續步驟。

  1. 建立您的應用程式時,而不是 Web 應用程式,請選擇 [原生應用程式]。

    原生應用程式

  2. 在下一個頁面上,系統會提示您輸入 重新導向 URI。 URI 不會經過驗證,但請記住您輸入的內容。 您稍後需要它。

  3. 不需要建立 客戶端驗證金鑰

  4. 我們將指派個別使用者或群組,而不是將服務主體指派給 CDN配置檔參與者 角色。 在此範例中,您可以看到我已將CDN示範使用者指派CDN設定檔參與者角色。

    個別使用者存取

建立專案並新增 npm 相依性

既然我們已為 CDN 配置檔建立資源群組,並提供 Microsoft Entra 應用程式許可權來管理該群組內的 CDN 配置檔和端點,我們可以開始建立應用程式。

建立資料夾以儲存您的應用程式。 從具有目前路徑中Node.js工具的控制台,將目前的位置設定為這個新資料夾,然後執行下列命令來初始化專案:

npm init

接著,您將會看到一系列問題來初始化專案。 針對 進入點,本教學課程會使用 app.js。 您可以在下列範例中看到我的其他選擇。

NPM init 輸出的螢幕快照。

現在,我們的專案會使用 packages.json 檔案初始化。 我們的專案將使用 npm 套件中包含的一些 Azure 連結庫。 我們將使用 Node.js 中的 Microsoft Entra 驗證連結庫(@Azure/身分識別)和適用於 JavaScript 的 Azure CDN 用戶端連結庫(@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"]

讓我們從列出配置檔開始。

列出配置檔

我們得到了空陣列。 因為我們的資源群組中沒有任何配置檔,因此這是預期的。 現在讓我們建立配置檔。

建立設定檔

現在,讓我們新增端點。

建立端點

最後,讓我們刪除我們的配置檔。

刪除個人資料

後續步驟

若要查看適用於 JavaScript 的 Azure CDN SDK 參考,請檢視 參考

若要尋找 Azure SDK for JavaScript 的其他檔,請檢視 完整參考

使用 PowerShell 管理 CDN 資源。