こんばんは、statemachineです。インストールマニアックス絡みで、WorkerRoleでFTPサーバという話があったので試してみました。
あんまり調べもせずに、CodePlexのMiniFTPServer - Source Codeを動かそうとしていましたが、このFTPサーバよくよくソースみると、PASVモードしかサポートしていませんでした。現状のAzureは、LB側のポート=VM側のポートと設定できないので、無駄なあがきでした....
たぶん、SDK1.3だと、これらのポート問題は解決するので、PASVモードのFTPも動くのではなかろうかと、無理やりPDC発表ネタに結び付け。
よくよく検索すると、たんたかさんが、たんたか | 開発・システム管理関連の備忘録でだいぶ前に開設してらっしゃる。もしかして、マニアックス組の人でしたか。
というわけで、最初から、CodeGuruのA C# FTP Serverを使えばこんなに苦労したりしなくて済みます。というわけで、下調べ重要ですね。
以下コードの断片をさらしておきます。
- Input endpoint tcp/21 で設定しておく。
- キャッシュ用local storageも設定しておく。ただし、キャッシュ側を1100MBと、バッファを取っておかないとAzure Drive1.8の動作変更ではまる気がする。
var account = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("Setting1")); var bc = account.CreateCloudBlobClient(); var c = bc.GetContainerReference("drive"); c.CreateIfNotExist(); var ls = RoleEnvironment.GetLocalResource("LocalStorage1"); CloudDrive.InitializeCache(ls.RootPath.Trim('\\'), 1000); drive = account.CreateCloudDrive("drive/mani4.vhd"); try { drive.Create(1000); } catch { } var ep = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["ftpd"]; string letter = drive.Mount(1000, DriveMountOptions.None); UserData.Get().AddUser("ftp"); UserData.Get().SetUserPassword("ftp", "ftp"); UserData.Get().SetUserStartingDirectory("ftp", letter + "\\"); var server = new FtpServer(new Assemblies.Ftp.FileSystem.StandardFileSystemClassFactory()); server.Start(ep.IPEndpoint.Port);