.NET 向け Azure CDN ライブラリの概要

.NET 向け Azure CDN ライブラリ を使用すると、CDN プロファイルとエンドポイントの作成と管理を自動化できます。 このチュートリアルでは、単純な .NET コンソール アプリケーションを作成しながら、使用可能な操作のいくつかを紹介します。 このチュートリアルは、.NET 向け Azure CDN ライブラリのすべての側面を詳細に説明することを目的としていません。

このチュートリアルを完了するには、Visual Studio 2015 が必要です。 Visual Studio Community 2015 は、自由にダウンロードできます。

ヒント

このチュートリアルに沿って作成されたプロジェクト は MSDN からダウンロードできます。

前提条件

CDN 管理コードを記述する前に、コードが Azure Resource Manager と対話できるように準備する必要があります。 この準備を行うには、次のことを実行する必要があります。

  • このチュートリアルで作成する CDN プロファイルを格納するリソース グループを作成する
  • アプリケーションの認証を行う Microsoft Entra ID を構成する
  • そのリソース グループにアクセス許可を適用して、Microsoft Entra テナントの許可されているユーザーのみが、CDN プロファイルを操作できるようにする

リソース グループの作成

  1. Azure Portal にサインインします。

  2. [リソースの作成] をクリックします。

  3. リソース グループ」を検索し、[リソース グループ] ウィンドウで [作成] をクリックします。

    Creating a new resource group

  4. リソース グループに CdnConsoleTutorial という名前を付けます。 サブスクリプションを選択し、近くの場所を選択します。 必要に応じて [ダッシュボードにピン留めする] チェック ボックスをオンにして、リソース グループをポータルのダッシュボードにピン留めできます。 ピン留めすると、後で見つけるのが容易になります。 必要な項目を選択したら、 [作成] をクリックします。

    [リソース グループ] ダイアログ ボックスのスクリーンショット。

  5. ダッシュボードにリソース グループをピン留めしていない場合は、 [参照][リソース グループ] の順にクリックして、作成したリソース グループを見つけることができます。 開くには、そのリソース グループをクリックします。 サブスクリプション IDをメモしておきます。 この情報は後で必要になります。

    CDN コンソール チュートリアル セクションのスクリーンショット。

Microsoft Entra アプリケーションの作成とアクセス許可の適用

Microsoft Entra ID を使用したアプリの認証には、個別ユーザーまたはサービス プリンシパルという、2 つのアプローチがあります。 サービス プリンシパルは、Windows のサービス アカウントと似ています。 CDN プロファイルとやり取りするアクセス許可を特定のユーザーに付与する代わりに、サービス プリンシパルにアクセス許可を付与します。 通常、サービス プリンシパルは、自動化された非対話型プロセスに使用されます。 このチュートリアルでは対話型コンソール アプリを作成していますが、サービス プリンシパルのアプローチに注目します。

サービス プリンシパルの作成は、Microsoft Entra アプリケーションの作成など、いくつかの手順で構成されます。 これを作成するには、こちらのチュートリアルに従います

重要

リンク先のチュートリアルのすべての手順を実行してください。 説明に従って正確に手順を完了することが "重要" です。 テナント IDテナントのドメイン名 (ドメイン カスタム ドメインが指定されている場合を除き、通常は .onmicrosoft.com ドメイン)、クライアント IDクライアントの認証キーをメモしておきます。この情報は後で必要になります。 クライアント IDクライアントの認証キーの取り扱いには注意してください。これらの資格情報を使用すると、だれでもサービス プリンシパルとして操作を実行できます。

マルチテナント アプリケーションを構成する手順で、 [いいえ] を選択します。

アプリケーションをロールに割り当てる手順で、前に作成したリソース グループ CdnConsoleTutorial を使用します。ただし、閲覧者ロールではなく、CDN プロファイルの共同作成者ロールを割り当てます。 アプリケーションにリソース グループの CDN プロファイルの投稿者ロールを割り当てたら、このチュートリアルに戻ります。

サービス プリンシパルを作成し、CDN プロファイルの投稿者ロールを割り当てた後、リソース グループの [ユーザー] ブレードの表示は次の図のようになります。

Users blade

対話型ユーザー認証

サービス プリンシパルの代わりに対話型の個別ユーザー認証を行う場合でも、そのプロセスはサービス プリンシパルを使用する場合と似ています。 実際に行う手順は同じですが、いくつか細かい点が異なります。

重要

次の手順は、サービス プリンシパルの代わりに個別ユーザー認証を行う場合にのみ使用してください。

  1. アプリケーションを作成するときに、 [Web アプリケーション] ではなく [ネイティブ アプリケーション] を選択します。

    ネイティブ アプリケーション

  2. 次のページで、リダイレクト URI の入力を求められます。 URI は検証されません。入力した内容を覚えておいてください。 この情報は後で必要になります。

  3. クライアント認証キーを作成する必要はありません。

  4. サービス プリンシパルを CDN プロファイルの投稿者 ロールに割り当てる代わりに、個別ユーザーまたはグループに割り当てます。 この例では、 CDN Demo UserCDN プロファイルの投稿者 ロールに割り当てています。

    Individual user access

プロジェクトを作成し、NuGet パッケージを追加する

これで、CDN プロファイルのリソース グループを作成し、そのグループ内の CDN プロファイルおよびエンドポイントを管理する Microsoft Entra アプリケーション アクセス許可を割り当てたため、アプリケーションの作成を開始することができます。

重要

Microsoft.IdentityModel.Clients.ActiveDirectory NuGet パッケージと Azure AD認証ライブラリ (ADAL) は非推奨となりました。 2020 年 6 月 30 日以降、新しい機能は追加されていません。 アップグレードすることを強くお勧めします。 詳細については、移行ガイドを参照してください。

Visual Studio 2015 で、[ファイル][新規][プロジェクト] の順に選んで、新しいプロジェクト ダイアログを開きます。 左側のウィンドウで [Visual C#] を展開し、 [Windows] を選択します。 中央のウィンドウで [コンソール アプリケーション] を選びます。 プロジェクトに名前を付け、[OK] を選びます。

新しいプロジェクト

このプロジェクトでは、NuGet パッケージに含まれているいくつかの Azure ライブラリを使用します。 それでは、これらのライブラリをプロジェクトに追加していきましょう。

  1. [ツール] メニュー、[NuGet パッケージ マネージャー][パッケージ マネージャー コンソール] を順に選びます。

    Manage Nuget Packages

  2. パッケージ マネージャー コンソールで、次のコマンドを実行して、 Active Directory Authentication Library (ADAL) をインストールします。

    Install-Package Microsoft.Identity.Client

  3. 次のコマンドを実行して、 Azure CDN Management Libraryをインストールします。

    Install-Package Microsoft.Azure.Management.Cdn

ディレクティブ、定数、main メソッド、およびヘルパー メソッド

ここでは、プログラムの基本的な構造を記述します。

  1. [Program.cs] タブに戻り、最上部の using ディレクティブを次のコマンドで置き換えます。

    using System;
    using System.Collections.Generic;
    using Microsoft.Azure.Management.Cdn;
    using Microsoft.Azure.Management.Cdn.Models;
    using Microsoft.Azure.Management.Resources;
    using Microsoft.Azure.Management.Resources.Models;
    using Microsoft.Identity.Client;
    using Microsoft.Rest;
    
  2. 次に、メソッドで使用するいくつかの定数を定義します。 Program クラスの Main メソッドの前に次のコード ブロックを追加します。 <山かっこ> などのプレースホルダーは、必要に応じて自分の環境に合わせて置き換えます。

    //Tenant app constants
    private const string clientID = "<YOUR CLIENT ID>";
    private const string clientSecret = "<YOUR CLIENT AUTHENTICATION KEY>"; //Only for service principals
    private const string authority = "https://login.microsoftonline.com/<YOUR TENANT ID>/<YOUR TENANT DOMAIN NAME>";
    
    //Application constants
    private const string subscriptionId = "<YOUR SUBSCRIPTION ID>";
    private const string profileName = "CdnConsoleApp";
    private const string endpointName = "<A UNIQUE NAME FOR YOUR CDN ENDPOINT>";
    private const string resourceGroupName = "CdnConsoleTutorial";
    private const string resourceLocation = "<YOUR PREFERRED AZURE LOCATION, SUCH AS Central US>";
    
  3. さらに、クラス レベルで次の 2 つの変数を定義します。 これらの変数は、後でプロファイルとエンドポイントが既に存在しているかどうかを判定するために使用します。

    static bool profileAlreadyExists = false;
    static bool endpointAlreadyExists = false;
    
  4. 次のように、 Main メソッドを置き換えます。

    static void Main(string[] args)
    {
        //Get a token
        AuthenticationResult authResult = GetAccessToken();
    
        // Create CDN client
        CdnManagementClient cdn = new CdnManagementClient(new TokenCredentials(authResult.AccessToken))
            { SubscriptionId = subscriptionId };
    
        ListProfilesAndEndpoints(cdn);
    
        // Create CDN Profile
        CreateCdnProfile(cdn);
    
        // Create CDN Endpoint
        CreateCdnEndpoint(cdn);
    
        Console.WriteLine();
    
        // Purge CDN Endpoint
        PromptPurgeCdnEndpoint(cdn);
    
        // Delete CDN Endpoint
        PromptDeleteCdnEndpoint(cdn);
    
        // Delete CDN Profile
        PromptDeleteCdnProfile(cdn);
    
        Console.WriteLine("Press Enter to end program.");
        Console.ReadLine();
    }
    
  5. 他のいくつかのメソッドでは、ユーザーが "はい/いいえ" で回答する質問を行います。 この処理を少し簡単にするために、次のメソッドを追加します。

    private static bool PromptUser(string Question)
    {
        Console.Write(Question + " (Y/N): ");
        var response = Console.ReadKey();
        Console.WriteLine();
        if (response.Key == ConsoleKey.Y)
        {
            return true;
        }
        else if (response.Key == ConsoleKey.N)
        {
            return false;
        }
        else
        {
            // They pressed something other than Y or N.  Let's ask them again.
            return PromptUser(Question);
        }
    }
    

これで、プログラムの基本的な構造が作成されました。次に、Main メソッドによって呼び出されるメソッドを作成します。

認証

Azure CDN Management Library を使用するには、サービス プリンシパルを認証し、認証トークンを取得する必要があります。 このメソッドは、Active Directory 認証ライブラリを使用してトークンを取得します。

private static AuthenticationResult GetAccessToken()
{
    AuthenticationContext authContext = new AuthenticationContext(authority);
    ClientCredential credential = new ClientCredential(clientID, clientSecret);
    AuthenticationResult authResult =
        authContext.AcquireTokenAsync("https://management.core.windows.net/", credential).Result;

    return authResult;
}

個別ユーザー認証を使用する場合の GetAccessToken メソッドは多少異なります。

重要

このコード サンプルは、サービス プリンシパルの代わりに個別ユーザー認証を行う場合にのみ使用してください。

private static AuthenticationResult GetAccessToken()
{
    AuthenticationContext authContext = new AuthenticationContext(authority);
    AuthenticationResult authResult = authContext.AcquireTokenAsync("https://management.core.windows.net/",
        clientID, new Uri("http://<redirect URI>"), new PlatformParameters(PromptBehavior.RefreshSession)).Result;

    return authResult;
}

<redirect URI> は、Microsoft Entra ID 内にアプリケーションを登録した際に入力した、リダイレクト URI と置き換えてください。

CDN プロファイルとエンドポイントのリストの取得

これで、CDN の操作を実行する準備ができました。 このメソッドでは、まずリソース グループ内のすべてのプロファイルとエンドポイントのリストを取得し、定数に指定されているプロファイルとエンドポイントの名前に一致するものが見つかった場合は重複を作成しないようにメモします。

private static void ListProfilesAndEndpoints(CdnManagementClient cdn)
{
    // List all the CDN profiles in this resource group
    var profileList = cdn.Profiles.ListByResourceGroup(resourceGroupName);
    foreach (Profile p in profileList)
    {
        Console.WriteLine("CDN profile {0}", p.Name);
        if (p.Name.Equals(profileName, StringComparison.OrdinalIgnoreCase))
        {
            // Hey, that's the name of the CDN profile we want to create!
            profileAlreadyExists = true;
        }

        //List all the CDN endpoints on this CDN profile
        Console.WriteLine("Endpoints:");
        var endpointList = cdn.Endpoints.ListByProfile(p.Name, resourceGroupName);
        foreach (Endpoint e in endpointList)
        {
            Console.WriteLine("-{0} ({1})", e.Name, e.HostName);
            if (e.Name.Equals(endpointName, StringComparison.OrdinalIgnoreCase))
            {
                // The unique endpoint name already exists.
                endpointAlreadyExists = true;
            }
        }
        Console.WriteLine();
    }
}

CDN プロファイルとエンドポイントの作成

次に、プロファイルを作成します。

private static void CreateCdnProfile(CdnManagementClient cdn)
{
    if (profileAlreadyExists)
    {
        Console.WriteLine("Profile {0} already exists.", profileName);
    }
    else
    {
        Console.WriteLine("Creating profile {0}.", profileName);
        ProfileCreateParameters profileParms =
            new ProfileCreateParameters() { Location = resourceLocation, Sku = new Sku(SkuName.StandardVerizon) };
        cdn.Profiles.Create(profileName, profileParms, resourceGroupName);
    }
}

プロファイルを作成した後は、エンドポイントを作成します。

private static void CreateCdnEndpoint(CdnManagementClient cdn)
{
    if (endpointAlreadyExists)
    {
        Console.WriteLine("Profile {0} already exists.", profileName);
    }
    else
    {
        Console.WriteLine("Creating endpoint {0} on profile {1}.", endpointName, profileName);
        EndpointCreateParameters endpointParms =
            new EndpointCreateParameters()
            {
                Origins = new List<DeepCreatedOrigin>() { new DeepCreatedOrigin("Contoso", "www.contoso.com") },
                IsHttpAllowed = true,
                IsHttpsAllowed = true,
                Location = resourceLocation
            };
        cdn.Endpoints.Create(endpointName, endpointParms, profileName, resourceGroupName);
    }
}

注意

上の例では、ホスト名 www.contoso.com を持つ Contoso という名前のオリジンをエンドポイントに割り当てています。 オリジンのホスト名を指すようにこれを変更する必要があります。

エンドポイントの消去

エンドポイントが作成されたと仮定して、プログラムで実行する一般的なタスクの 1 つに、エンドポイントの内容を消去することがあります。

private static void PromptPurgeCdnEndpoint(CdnManagementClient cdn)
{
    if (PromptUser(String.Format("Purge CDN endpoint {0}?", endpointName)))
    {
        Console.WriteLine("Purging endpoint. Please wait...");
        cdn.Endpoints.PurgeContent(resourceGroupName, profileName, endpointName, new List<string>() { "/*" });
        Console.WriteLine("Done.");
        Console.WriteLine();
    }
}

Note

以前の例の文字列 /* は、エンドポイント パスのルートにあるものをすべて消去することを示します。 これは、Azure Portal の "消去" ダイアログで [すべて消去] を選択するのと同じです。 CreateCdnProfile メソッドでは、Sku = new Sku(SkuName.StandardVerizon) というコードを使用して Azure CDN from Edgio としてプロファイルを作成しているため、このコードは動作します。

CDN プロファイルとエンドポイントの削除

最後のメソッドによって、このエンドポイントとプロファイルが削除されます。

private static void PromptDeleteCdnEndpoint(CdnManagementClient cdn)
{
    if(PromptUser(String.Format("Delete CDN endpoint {0} on profile {1}?", endpointName, profileName)))
    {
        Console.WriteLine("Deleting endpoint. Please wait...");
        cdn.Endpoints.DeleteIfExists(endpointName, profileName, resourceGroupName);
        Console.WriteLine("Done.");
        Console.WriteLine();
    }
}

private static void PromptDeleteCdnProfile(CdnManagementClient cdn)
{
    if(PromptUser(String.Format("Delete CDN profile {0}?", profileName)))
    {
        Console.WriteLine("Deleting profile. Please wait...");
        cdn.Profiles.DeleteIfExists(profileName, resourceGroupName);
        Console.WriteLine("Done.");
        Console.WriteLine();
    }
}

プログラムの実行

Visual Studio の [開始] をクリックして、プログラムをコンパイルおよび実行します。

Program running

プログラムによって上記のプロンプトが表示された時点で、Azure ポータルでリソース グループに戻り、このプロファイルが作成されたことを確認できます。

正常に完了

次に、プログラムの残りの部分を実行するかどうかを確認できます。

Program completing

次の手順

このチュートリアルの完成したプロジェクトを確認するには、 サンプルをダウンロードしてください。

Azure CDN Management Library for .NET に関連するその他のドキュメントについては、MSDN のリファレンスを参照してください。

PowerShell で CDN リソースを管理します。