読者です 読者をやめる 読者になる 読者になる

Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

AzureでFTPサーバを動かすなど

こんばんは、statemachineです。インストールマニアックス絡みで、WorkerRoleでFTPサーバという話があったので試してみました。


あんまり調べもせずに、CodePlexMiniFTPServer - 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);