.NET 向け Azure CDN ライブラリの概要
重要
Azure CDN Standard from Microsoft (クラシック) は、2027 年 9 月 30 日に廃止されます。 サービスの中断を回避するには、2027 年 9 月 30 日までに Azure Front Door の Standard または Premium レベルに Azure CDN Standard from Microsoft (クラシック) プロファイルを移行することが重要です。 詳細については、Azure CDN Standard from Microsoft (クラシック) の廃止に関するページを参照してください。
Azure CDN from Edgio は、2025 年 11 月 4 日に廃止される予定です。 サービスの中断を避けるには、この日付より前に Azure Front Door にワークロードを移行する必要があります。 詳細については、「Azure CDN from Edgio の廃止に関する FAQ」を参照してください。
.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 プロファイルを操作できるようにする
リソース グループの作成
Azure Portal にサインインします。
[リソースの作成] をクリックします。
「リソース グループ」を検索し、[リソース グループ] ウィンドウで [作成] をクリックします。
リソース グループに CdnConsoleTutorial という名前を付けます。 サブスクリプションを選択し、近くの場所を選択します。 必要に応じて [ダッシュボードにピン留めする] チェック ボックスをオンにして、リソース グループをポータルのダッシュボードにピン留めできます。 ピン留めすると、後で見つけるのが容易になります。 必要な項目を選択したら、 [作成] をクリックします。
ダッシュボードにリソース グループをピン留めしていない場合は、 [参照] 、 [リソース グループ] の順にクリックして、作成したリソース グループを見つけることができます。 開くには、そのリソース グループをクリックします。 サブスクリプション IDをメモしておきます。 この情報は後で必要になります。
Microsoft Entra アプリケーションの作成とアクセス許可の適用
Microsoft Entra ID を使用したアプリの認証には、個別ユーザーまたはサービス プリンシパルという、2 つのアプローチがあります。 サービス プリンシパルは、Windows のサービス アカウントと似ています。 CDN プロファイルとやり取りするアクセス許可を特定のユーザーに付与する代わりに、サービス プリンシパルにアクセス許可を付与します。 通常、サービス プリンシパルは、自動化された非対話型プロセスに使用されます。 このチュートリアルでは対話型コンソール アプリを作成していますが、サービス プリンシパルのアプローチに注目します。
サービス プリンシパルの作成は、Microsoft Entra アプリケーションの作成など、いくつかの手順で構成されます。 これを作成するには、こちらのチュートリアルに従います。
重要
リンク先のチュートリアルのすべての手順を実行してください。 説明に従って正確に手順を完了することが "重要" です。 テナント ID、テナントのドメイン名 (ドメイン カスタム ドメインが指定されている場合を除き、通常は .onmicrosoft.com ドメイン)、クライアント ID、クライアントの認証キーをメモしておきます。この情報は後で必要になります。 クライアント ID とクライアントの認証キーの取り扱いには注意してください。これらの資格情報を使用すると、だれでもサービス プリンシパルとして操作を実行できます。
マルチテナント アプリケーションを構成する手順で、 [いいえ] を選択します。
アプリケーションをロールに割り当てる手順で、前に作成したリソース グループ CdnConsoleTutorial を使用します。ただし、閲覧者ロールではなく、CDN プロファイルの共同作成者ロールを割り当てます。 アプリケーションにリソース グループの CDN プロファイルの投稿者ロールを割り当てたら、このチュートリアルに戻ります。
サービス プリンシパルを作成し、CDN プロファイルの投稿者ロールを割り当てた後、リソース グループの [ユーザー] ブレードの表示は次の図のようになります。
対話型ユーザー認証
サービス プリンシパルの代わりに対話型の個別ユーザー認証を行う場合でも、そのプロセスはサービス プリンシパルを使用する場合と似ています。 実際に行う手順は同じですが、いくつか細かい点が異なります。
重要
次の手順は、サービス プリンシパルの代わりに個別ユーザー認証を行う場合にのみ使用してください。
アプリケーションを作成するときに、 [Web アプリケーション] ではなく [ネイティブ アプリケーション] を選択します。
次のページで、リダイレクト URI の入力を求められます。 URI は検証されません。入力した内容を覚えておいてください。 この情報は後で必要になります。
クライアント認証キーを作成する必要はありません。
サービス プリンシパルを CDN プロファイルの投稿者 ロールに割り当てる代わりに、個別ユーザーまたはグループに割り当てます。 この例では、 CDN Demo User を CDN プロファイルの投稿者 ロールに割り当てています。
プロジェクトを作成し、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 ライブラリを使用します。 それでは、これらのライブラリをプロジェクトに追加していきましょう。
[ツール] メニュー、[NuGet パッケージ マネージャー]、[パッケージ マネージャー コンソール] を順に選びます。
パッケージ マネージャー コンソールで、次のコマンドを実行して、 Active Directory Authentication Library (ADAL) をインストールします。
Install-Package Microsoft.Identity.Client
次のコマンドを実行して、 Azure CDN Management Libraryをインストールします。
Install-Package Microsoft.Azure.Management.Cdn
ディレクティブ、定数、main メソッド、およびヘルパー メソッド
ここでは、プログラムの基本的な構造を記述します。
[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;
次に、メソッドで使用するいくつかの定数を定義します。
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>";
さらに、クラス レベルで次の 2 つの変数を定義します。 これらの変数は、後でプロファイルとエンドポイントが既に存在しているかどうかを判定するために使用します。
static bool profileAlreadyExists = false; static bool endpointAlreadyExists = false;
次のように、
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(); }
他のいくつかのメソッドでは、ユーザーが "はい/いいえ" で回答する質問を行います。 この処理を少し簡単にするために、次のメソッドを追加します。
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 の [開始] をクリックして、プログラムをコンパイルおよび実行します。
プログラムによって上記のプロンプトが表示された時点で、Azure ポータルでリソース グループに戻り、このプロファイルが作成されたことを確認できます。
次に、プログラムの残りの部分を実行するかどうかを確認できます。
次の手順
このチュートリアルの完成したプロジェクトを確認するには、 サンプルをダウンロードしてください。
Azure CDN Management Library for .NET に関連するその他のドキュメントについては、MSDN のリファレンスを参照してください。
PowerShell で CDN リソースを管理します。