Microsoft Azure Files への接続の保持
このポストは、5 月 26 日に Azure Storage チームが投稿した Persisting connections to Microsoft Azure Files の翻訳です。
先日、こちらのブログ記事に Azure Files サービスのプレビュー リリースに関する内容を掲載しました。その中で、Azure Files に関する情報と、プレビューへのサインアップを行って利用を開始する方法を紹介し、共有の作成とデータの転送に役立てていただけるようマイクロソフトが提供しているいくつかのツールについて説明しました。今回は、スケジュールされたタスク、アプリケーション、またはログイン ユーザーが VM の再起動後に共有にアクセスできるよう、Azure Files の共有機能への固定接続を作成する方法について詳しく説明します。
Windows の IaaS VM
Windows の既定では、再起動後も SMB 共有への接続が保持されるよう試行されます。しかし、Azure Files の資格情報は自動的には再起動の後まで保持されないため、再起動すると Azure Files 共有への再接続は失敗します。これらの資格情報を保持するにはいくつかの方法があります。以降でその一部を詳しく説明します。
資格情報の保持
CmdKey
固定接続を確立する最も簡単な方法は、"CmdKey" コマンド ライン ユーティリティを使用して、Windows にストレージ アカウントの資格情報を保存することです。以下は、VM へのストレージ アカウントの資格情報を保持するコマンド ラインの例です。
C:\>cmdkey /add:<yourstorageaccountname>.file.core.windows.net /user:<yourstorageaccountname> /pass:<YourStorageAccountKeyWhichEndsIn==>
メモ: yourstorageaccountname はエンドポイントの名前です (Live ID ではありません)。
CmdKey コマンドでは、保存した資格情報を一覧表示することもできます。
C:\>cmdkey /list
Currently stored credentials:
Target: Domain:target=filedemo.file.core.windows.net
Type: Domain Password
User: filedemo
資格情報が保持されていると、共有への接続時に資格情報を入力する必要がありません。以下のように、資格情報を指定せずに接続することができます。
C:\>net use * \\filedemo.file.core.windows.net\demo1
Drive Z: is now connected to \\filedemo.file.core.windows.net\demo1.
The command completed successfully.
以下のコマンドを使用すると、VM を再起動できます (これにより、VM から切断されます)。
shutdown –t 0 –r
VM が再起動されて再接続するときに、もう 1 つコマンド ウィンドウを開いて以下のコマンドを使用すると、自動的に再接続が行われたことを確認できます。
C:\>net use
New connections will be remembered.
Status Local Remote Network
-----------------------------------------------------------------------------
OK Z: \\filedemo.file.core.windows.net\demo1
Microsoft Windows Network
The command completed successfully.
資格情報マネージャー
資格情報マネージャー ([コントロール パネル] の [ユーザー アカウント] に存在します) を使用する方法でも、ストレージ アカウントの資格情報を保持できます。
ユーザー コンテキスト
Windows では、VM 上で操作を実行している各ユーザーに対し、異なる複数のコンテキストが保持されます。場合によっては、同時に同じ VM で同じユーザーの異なる複数のコンテキストが存在します。それぞれのコンテキストで、異なる一連の SMB 共有に個別に接続することが可能です。また、各コンテキストでは、接続先の共有にマッピングされた独自のドライブ文字が割り当てられます。
"CmdKey" によって保持された資格情報は、"CmdKey" を実行したユーザーが利用できます。同様に、"net use" によって保持された接続も、"net use" を実行したユーザーが利用できます。そのため、異なるユーザー名で実行するアプリケーションがある場合、他のユーザー名の資格情報と接続も保持するとよいでしょう。これを行うには、"runas" コマンドを使用します。
runas /user:<username> cmd.exe
このコマンドにより、新しいコマンド ウィンドウが開きます。コマンド ウィンドウのタイトルには、「cmd.exe (<コンピューター名>\<ユーザー名> として実行中)」と表示されます。このコマンド ウィンドウで "net use" を実行すると、このユーザーが共有に接続されていないことがわかります。
C:\>net use
New connections will be remembered.
There are no entries in the list.
このユーザーとして上記のように "CmdKey" と "net use" を実行すると、このユーザーの Azure Files に対するストレージ アカウントの資格情報と接続を保持できます。
管理者のコンテキスト
VM で新しいローカル ユーザーを作成し、管理者グループに追加すると、このユーザーとして管理者特権と非管理者特権のいずれでもコマンドを実行できます。接続は、管理者特権と非管理者特権で共有されないため、"net use" を実行して各コンテキストで個別に接続するとよいでしょう。ただし、保持された資格情報は共有されるため、"CmdKey" を実行する必要があるのはいずれかのコンテキストのみです。
スケジュールされたタスクの処理
VM 上のいずれかのユーザーによって実行される、スケジュールされたタスクを作成できます。スケジュールされたタスクでは、"CmdKey" で保持されたそのユーザーの資格情報を使用できます。ただし、これらのスケジュールされたタスクはログイン ユーザー以外のユーザー コンテキストで実行される可能性があるため、タスクを実行しているユーザー コンテキストでの SMB 共有への再接続は、自動的には行われません。
たとえば、既に Azure Files の共有機能への固定接続を作成し、ユーザーの資格情報も保持していたとします。スケジュールされたタスクを作成し、そのタスクで "net use" を呼び出してローカル ファイルに出力を書き込むスクリプトを実行した場合、出力に以下のような内容が含まれます。
Status Local Remote Network
-----------------------------------------------------------------------------
Unavailable Z: \\filedemo.file.core.windows.net\demo1
Microsoft Windows Network
The command completed successfully.
ただし、そのユーザーのコンテキストで資格情報を使用して共有に再接続できるため、スクリプトに次のコマンドを追加すれば、ネットワーク接続が再度確立されるようになります。
net use z: \\filedemo.file.core.windows.net\demo1
スクリプトでは、マッピングされたドライブ文字ではなく、完全な UNC パスを使用してファイルにアクセスすることもできます。
dir \\filedemo.file.core.windows.net\demo1
スケジュールされたタスクがログイン ユーザー以外のコンテキストで実行されていると、スケジュールされたタスクで作成される接続がログイン ユーザーのコンテキストで確立されない場合があることにも注意してください。
Windows の PaaS ロール
固定接続は、PaaS ロールの場合に求められるものとは正反対のものです。PaaS ロールでは、システムで新しいインスタンスが開始されたかどうかにかかわらず、またはインスタンスが再起動された場合、コードによって自動的に接続できるようにする必要があります。
PInvoke での WNetAddConnection2 の使用
PInvoke で WNetAddConnection2 を使用して、PaaS ロールの起動時のコードでドライブ文字をマッピングできます。以下のコードでは、Azure Files 共有からローカルのドライブ文字へのマッピングを確立するために必要な、一連の構造を宣言しています。
[DllImport("Mpr.dll",
EntryPoint = "WNetAddConnection2",
CallingConvention = CallingConvention.Winapi)]
private static extern int WNetAddConnection2(NETRESOURCE lpNetResource,
string lpPassword,
string lpUsername,
System.UInt32 dwFlags);
[DllImport("Mpr.dll",
EntryPoint = "WNetCancelConnection2",
CallingConvention = CallingConvention.Winapi)]
private static extern int WNetCancelConnection2(string lpName,
System.UInt32 dwFlags,
System.Boolean fForce);
[StructLayout(LayoutKind.Sequential)]
private class NETRESOURCE
{
public int dwScope;
public ResourceType dwType;
public int dwDisplayType;
public int dwUsage;
public string lpLocalName;
public string lpRemoteName;
public string lpComment;
public string lpProvider;
};
public enum ResourceType
{
RESOURCETYPE_DISK = 1,
};
そのうえで、指定されたドライブ文字に共有をマウントするメソッドを記述します。
public static void MountShare(string shareName,
string driveLetterAndColon,
string username,
string password)
{
if (!String.IsNullOrEmpty(driveLetterAndColon))
{
// このドライブ文字が他のマッピングに使用されていないことを確認
WNetCancelConnection2(driveLetterAndColon, 0, true);
}
NETRESOURCE nr = new NETRESOURCE();
nr.dwType = ResourceType.RESOURCETYPE_DISK;
nr.lpRemoteName = shareName;
nr.lpLocalName = driveLetterAndColon;
int result = WNetAddConnection2(nr, password, username, 0);
if (result != 0)
{
throw new Exception("WNetAddConnection2 failed with error " + result);
}
}
次に、ユーザーのロールの "OnStart()" メソッドから次のメソッドを呼び出します。
MountShare("\\\\filedemo.file.core.windows.net\\demo1",
"z:",
"filedemo",
"<YourStorageAccountKeyWhichEndsIn==>");
これで、Worker ロールで、ドライブ文字または完全な UNC パスを使用して Azure Files 共有に対してファイルの読み取りや書き込みを実行できるようになります。
File.Create("z:\\WNetAddConnection2.txt");
File.Create(\\\\filedemo.file.core.windows.net\\demo1\\UNC.txt);
Web ロールとユーザーコンテキスト
Azure Web ロールの OnStart() メソッドは、Web サイトのページの表示に使用されるユーザー コンテキストとは異なるユーザー コンテキストで実行されます。そのため、ページを表示するコードから Azure Files 共有を参照する場合、WebRole.OneStart() メソッドではなく、Global.Application_Start() メソッドに上記のコードを追加する必要があります。
Linux VM
Linux には、起動時に自動的に共有をマウントするためのさまざまなメソッドが用意されていますが、我々が検証したのは 1 つのメソッドのみで、Ubuntu 14.04 LTS に関するものです。
Fstab を使用した接続の保持
Linux には、/etc に "fstab" というファイルがあります。このファイルを使用して、起動時にドライブおよび共有をマウントできます。起動時に Azure Files 共有を自動的にマウントする方法の 1 つは、/etc/fstab に行を追加することです。ファイルの単一行に次のテキストを配置します。
//<yourstorageaccountname>.file.core.windows.net/demo1 /home/azureuser/smb cifs vers=2.1,dir_mode=0777,file_mode=0777,username=<yourstorageaccountname>,password=<YourStorageAccountKeyWhichEndsIn==>
この行は、下の表で説明しているように、いくつかのパーツで構成されています。
パーツ |
例 |
説明 |
共有の URL |
//filedemo.file.core.windows.net/demo1 |
作成済みの Azure Files 共有の URL。 |
マウント ポイント |
/home/azureuser/smb |
共有のマウント先として作成済みの、Linux VM 上の空のディレクトリへのパス。 |
ファイル システム |
Cifs |
マウントするファイル システムの種類。Azure Files の場合は、"cifs" になります。 |
マウント パラメーター |
vers=2.1 |
使用する SMB のバージョン。この場合は、バージョン 2.1 です。 |
dir_mode=0777 |
Azure Files 共有のディレクトリに使用される権限マスク。この場合は管理者権限です。 |
|
file_mode=0777 |
Azure Files 共有のファイルに使用される権限マスク。この場合は管理者権限です。 |
|
username=filedemo |
Azure Files の場合、このユーザー名をストレージ アカウント名にする必要があります。 |
|
password=StorageAccountKey== |
Azure Files の場合、このパスワードをストレージ アカウントの完全なキーにする必要があります。 |
他にも多数のオプションを fstab ファイルに含めることができます。詳細については、使用している Linux ディストリビューションの関連ドキュメントを参照してください。
まとめ
Azure Files を紹介した以前のブログ記事とこのブログ記事では、再起動後も共有への接続を使用できるように、Azure Files 共有に対する固定接続を作成するうえで役立つ手順が詳しく説明されています。いつものお願いではありますが、皆様からのフィードバックをお待ちしております。このブログ記事のコメント欄、Azure Storage の MSDN フォーラム、または mastoragequestions@microsoft.com 宛ての電子メールにてご意見をお聞かせください。
Andrew Edwards
詳細情報が記載されているページへのリンクをご紹介しますので、こちらもご覧ください。
Azure Files サービス バージョン 2014-04-14 (英語)