normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Windows Azure Media Services .NET SDK 2.3.0.0 の変更 - 複数のストレージアカウントをアタッチ編

2013/7/1 に NuGet にて Windows Azure Media Service 2.3.0.0 がリリースされた。今回のリリースにおける主要な更新は以下となる。

こちらの メディア with Microsoft - Windows Azure Media Services .NET SDK 2.3.0.0 の更新 記事にも SDK 2.3.0.0 の更新内容がまとまっているので、別途参照して頂きたい。

複数のストレージアカウントをアタッチする方法

サーバ側には複数のストレージアカウントをアタッチする機能が追加されたが、現時点(2013/7/15)では管理ポータルにも.NET SDK にも本機能を利用するインターフェースは用意されておらず、REST API を利用することによってのみ本機能が利用可能だ。
そのため、今回はHow to: Use Media Services Management REST API に記載されたクラスを参考にしてREST API を操作するコードを以下のように作成する。

ManagementRESTAPIHelper helper =
new ManagementRESTAPIHelper("https://management.core.windows.net",
    "<証明書のThumbprintを記載。管理ポータルを参照のこと>",
    "<上記の証明書に紐づいたサブスクリプションID。同じく管理ポータルを参照のこと>");

// Initialize the AccountInfo class.
MediaServicesAccountInfo accountInfo = new MediaServicesAccountInfo();
accountInfo.MediaServicesAccountName = "<メディアサービスのアカウント名>";
accountInfo.Region = "<メディアサービスを作成したリージョン例:East Asia>";
accountInfo.StorageAccountName = "<ストレージサービスにアタッチしたストレージアカウント名>";
accountInfo.StorageAccountKey = "<ストレージサービスにアタッチしたストレージアカウントのキー>";
accountInfo.BlobStorageEndpoint = "<BLOBストレージのエンドポイント 例:http://xxxxxxxxxxxxxxx.blob.core.windows.net/>";

var storageAccount = new AttachStorageAccountRequest()
{
StorageAccountName = "<アタッチしたいストレージアカウント名>",
StorageAccountKey = "<アタッチしたいストレージアカウントのキー>",
BlobStorageEndpointUri = "<アタッチしたいBLOBストレージのエンドポイント>"
};

Call one of the public methods and attach storage account to media service 
helper.AttachStorageAccountToMediaServiceAccount(accountInfo, storageAccount);

内部では直接REST API を叩いているため、特に Media Service SDK を取得しなくても操作は可能だ。上記のパラメータのうち、証明書に関する情報を取得する方法を以下に図でまとめたので参考にしてほしい。

次に、上記のコードをコンソールアプリケーション等で実行する。処理が正常に実行された場合は以下のメッセージが表示される(別に parimary key が再生成された様子はないがなんでだろう?)。

The primary key was regenerated.

また、すでに自身のメディアサービスにアタッチ済みのストレージアカウントを再アタッチしようとした場合は System.Net.WebException が発生し、以下のメッセージが返される。

{"リモート サーバーがエラーを返しました: (409) 競合"}

System.Net.WebException.Response.StatusCode は System.Net.HttpStatusCode.Conflict で返ってくるので、必要ならば参考にしてほしい。

REST API の処理が完了した後、数十秒後(直後では反映されていなかった)に以下のコードを実行するとメディアサービスに複数のストレージサービスがアタッチされていることが確認できる。また以下のコードは Media Service .NET SDK を利用している。

CloudMediaContext context = new CloudMediaContext("<メディアサービスのアカウント名>", "<メディアサービスのキー名>");

foreach (var account in context.StorageAccounts)
{
Console.WriteLine("Name={0}, IsDefault={1}", account.Name, account.IsDefault);
}

実行結果は以下となる(二つのストレージアカウントを紐づけた後に上記のコードを実行した)。最初にメディアサービスに紐づけたストレージアカウントがデフォルトとして扱われる点に注意してほしい。

Name=xxxxxxmediaservicestorage1, IsDefault=False
Name=xxxxxxmediaservicestorage2, IsDefault=True
Name=xxxxxxmediaservicestorage3, IsDefault=False

参考