本章では、AzureのWorkerRoleサービスで、一時フォルダを利用する方法について、共有します。
背景
ローカルのディスク利用の選択肢
Azureでのデータ保存は、以下の2通りの選択肢があります。
- BLOBサービスの利用
- 一時フォルダの利用
BLOBサービスは、永続的にデータを保存する場合に利用します。一時フォルダは、一時的にデータを保存する場合に利用します。
一時フォルダの制約
しかし、AzureのWorkerRoleサービスで利用できる一時フォルダは、以下の引用の通り、利用可能なサイズが「100MB」となっています。
アプリケーションで実行中のコードで標準の Windows 環境変数の TEMP と TMP を使用することができます。TEMP と TMP はどちらも最大サイズが 100 MB の同じディレクトリを参照します。このディレクトリに格納されるデータが永続化されてホステッド サービスのライフサイクルにわたって保持されることはありません。ホステッド サービスのロール インスタンスがリサイクルされると、ディレクトリはクリーニングされます。
Web ロールおよびワーカー ロールに対する既定の TEMP フォルダーのサイズが小さすぎる
そのため、一時フォルダが限界容量を超えると、データ保存ができずエラーとなります。つまり一時フォルダを利用する際には、定期的に一時フォルダをクリーンする必要があります。一時フォルダをクリーンする方法には、以下の2通りがあります。
今回は、「ロールインスタンスのリサイクル」の方法について、解説します。
ロールインスタンスのリサイクル
準備
まず、WorkerRoleを定義しているXMLファイルを編集します。XMLファイルでは、以下の通り、一時フォルダの名前と容量を定義します。
[ServiceDefinition.csdef]
<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="XXXXXX" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2013-10.2.2"> <WorkerRole name="YYYYYY"> <LocalResources> <LocalStorage cleanOnRoleRecycle="true" name="ZZZZZ" sizeInMB="4096" /> </LocalResources> </WorkerRole> </ServiceDefinition>
一時フォルダの利用方法
次に、一時フォルダを利用する箇所で、以下の通り、「RoleEnvironment」の「GetLocalResource」を利用します。
[***.cs]
#if DEBUG // 以下の分岐処理は、ローカル環境でデバッグして挙動を確認する際に利用します。 tempFolder = Path.Combine(Path.GetTempPath(), DateTime.Now.ToString("yyyy-MM-dd")); #else var root = RoleEnvironment.GetLocalResource("ZZZZZ"); tempFolder = root.RootPath.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar + DateTime.Now.ToString("yyyy-MM-dd") + Path.DirectorySeparatorChar; #endif
一時フォルダのクリーン方法
最後に、一時フォルダのデータを削除する箇所で、以下の通り、「RoleEnvironment」の「RequestRecycle」を利用します。
[***.cs]
RoleEnvironment.RequestRecycle();
上記のコードで一時フォルダのデータは、すべて削除されます。
総括
一時フォルダは非常に便利な機能です。しかしAzureでは、一時フォルダを利用できるサイズで思わぬ制約がありますので、注意して利用しましょう。