kikki's tech note

技術ブログです。UnityやSpine、MS、Javaなど技術色々について解説しています。

AzureのWorker Roleにおける一時フォルダの制約・利用方法とは

本章では、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では、一時フォルダを利用できるサイズで思わぬ制約がありますので、注意して利用しましょう。


※無断転載禁止 Copyright (C) kikkisnrdec All Rights Reserved.