Vor knapp 2 Jahren habe ich in einem Blog Artikel beschrieben wie sich mit Hilfe einer auf CodePlex bereitgestellten FTP to Azure Blob Storage Bridge ein FTP-Zugriff auf Microsoft Azure Blob Storage realisieren lässt. Die Architektur dieser Lösung war wie folgt:

image

Abb 1: Architektur der FTP-Bridge-Lösung

Die in einer Cloud Service Worker Role betriebene Bridge fungiert als Mittler zwischen einem FTP-Client, der die Bridge über Port 21 anspricht und dem Blob Storage, der die Daten hält.

Problem einer veralteten Worker Role Konfiguration

Seit besagtem Blog Artikel hat sich in Microsoft Azure einiges getan, und wenngleich man heute FTP-Zugriff auf Blob Storage ggf. anders implementieren würde (z.B. über eine Virtual Machine, in der ein IIS entsprechend konfiguriert wird), ist es doch eine funktionierende Lösung. Leider setzten die in der Bridge-Lösung verwendeten Konfigurationsdateien ein heute nicht mehr unterstütztes VM-Image für die Worker Role voraus. Deshalb lässt sich die Lösung heute so nicht mehr betreiben.

Aktualisierung der Worker Role Konfiguration

In ein paar wenigen Schritten lässt sich die Blob Storage Bridge allerdings in eine neue, aktuelle Visual Studio Solution übertragen, von wo aus sie dann in eine aktuelle Worker Role deployt werden kann.

Voraussetzungen

Folgende Softwarepakete müssen auf dem Rechner installiert sein:

Darüber hinaus ist ein Microsoft Azure Account erforderlich.

Anlegen eines Storage Accounts

Das Vorgehen hierzu ist identisch zu dem im ursprünglichen Blog Artikel beschriebenen.

Erstellen einer aktuellen Visual Studio Solution

Zum Erstellen einer aktuellen Visual Studio Solution, die auf aktuelle Worker Role VMs deployt werden kann führen Sie folgende Schritte durch:

  1. Öffnen Sie Visual Studio 2013 und wählen Sie den Menüpunkt File/New/Project…
  2. Wählen Sie als Projektvorlage Templates/Visual Studio C#/Cloud/Azure Cloud Service.
     
    image
     
  3. Fügen Sie dem Cloud Service eine Worker Role hinzu und benennen Sie diese mit FTPServerRole.
     
    image
     
  4. Wechseln Sie in den Windows Explorer. Kopieren Sie aus der Visual Studio Solution der FTP to Azure Blob Storage Bridge das Verzeichnis AzureFtpServer in das Verzeichnis der in Schritt 2 angelegten Cloud Service Solution (also “neben” das Verzeichnis FTPServerRole).
  5. Fügen Sie das AzureFtpServer-Projekt der Visual Studio Solution hinzu. Wählen Sie in Visual Studio im Solution Explorer im Kontextmenü (Klick mit der rechten Maustaste auf die Solution) den Eintrag Add/Existing Project… und wählen Sie im Verzeichnis AzureFtpServer die Projektdatei AzureFtpServer.csproj. Die Solution sollte danach drei Projekte enthalten: Das Cloud Service Projekt, die Worker Role und das Ftp-Server-Projekt.
     
    image
  6. Damit die Worker Role den Ftp-Server nutzen kann, fügen Sie in der Worker Role eine Referenz auf den Ftp-Server ein. Klicken Sie in der Worker Role im Eintrag References im Kontextmenü auf Add Reference… Wählen Sie unter Solution/Projects das AzureFtpServer-Projekt und bestätigen Sie mit OK.
     
    image
     
  7. Implementieren Sie nun die Logik der Worker Role. Im Wesentlichen ist dies eine Kopie des Codes, der bereits in der Visual Studio Solution der FTP to Azure Blob Storage Bridge in der dortigen Worker Role enthalten war.
     
    Fügen Sie folgende using-Statements in die Datei WorkerRole.cs: 

    using AzureFtpServer.Azure;
    using AzureFtpServer.Ftp;
    using AzureFtpServer.Provider;
    Definieren Sie in der Klasse Worker Role eine private Variable für den Ftp-Server:
    private FtpServer _server;
    Implementieren Sie die Methode OnStart() wie folgt:
    public override bool OnStart()
    {
    // Set the maximum number of concurrent connections
    ServicePointManager.DefaultConnectionLimit = 12;

    // For information on handling configuration changes
    // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
    RoleEnvironment.Changing += RoleEnvironmentChanging;

    if (_server == null)
    _server = new FtpServer(new AzureFileSystemFactory());

    _server.NewConnection += ServerNewConnection;

    bool result = base.OnStart();

    Trace.TraceInformation("FTPServerRole has been started");

    return result;
    }
    Implementieren Sie die Methode ServerNewConnection() wie folgt:
    static void ServerNewConnection(int nId)
    {
    Trace.WriteLine(String.Format("Connection {0} accepted", nId), "Connection");
    }
    Implementieren Sie die Methode RoleEnvironmentChanging() wie folgt:
    private static void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
    {
    // If a configuration setting is changing
    if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange))
    {
    // Set e.Cancel to true to restart this role instance
    e.Cancel = true;
    }
    }
    Implementieren Sie die Methode RunAsync() wie folgt:
    private async Task RunAsync(CancellationToken cancellationToken)
    {
    while (!cancellationToken.IsCancellationRequested)
    {
    Trace.TraceInformation("Working");
    if (_server.Started)
    {
    await Task.Delay(1000);
    //Trace.WriteLine("Server is alive.", "Information");
    }
    else
    {
    _server.Start();
    Trace.WriteLine("Server starting.", "Control");
    }
    }
    }

Damit ist die Implementierung abgeschlossen. Was fehlt, sind die Konfigurationsparameter sowie die Definition der für Ftp benötigten Endpunkte.

Setzen der Konfigurationsparameter

Klicken Sie nun im Solution Explorer auf die FTPServerRole und wechseln Sie bei den Einstellungen in den Reiter Settings. Fügen Sie dort die einzelnen Settings wie sie in meinem ursprünglichen Blog Artikel beschrieben sind, hinzu. Klicken Sie jeweils auf Add Setting, wählen den Namen und die zugehörigen Werte. Nach Fertigstellung sollte die Seite wie folgt aussehen:

image

Definieren der benötigten Endpunkte

Wechseln Sie in den Reiter Endpoints und konfigurieren Sie dort die beiden benötigten Endpunkte. Das Ergebnis sollte wie folgt aussehen:

image

Damit ist die eigentliche Implementierung abgeschlossen. Das Ganze kann im Azure Emulator getestet werden. An dieser Stelle soll gleich mit dem Deploment nach Microsoft Azure weiter gemacht werden.

Deloyment der FTP-Bridge-Lösung in einen Cloud Service Container

Aus Visual Studio heraus kann nun via Publish-Befehl (aus dem Kontextmenü der Solution) das Deployment-Paket (eine CSPKG- und eine CSCFG-Datei) erstellt werden, das dann entsprechend der Beschreibung in meinem  ursprünglichen Blog Artikel in Microsoft Azure deployt werden kann.

Alternativ kann aus Visual Studio heraus direkt das Deployment vorgenommen werden. Führen Sie hierzu folgende Schritte aus:

  1. Klicken Sie mit der rechten Maustaste auf das Cloud Service Projekt und wählen im Kontextmenü den Eintrag Publish.
  2. Wählen Sie zunächst die Azure-Subscription, in die der Cloud Service installiert werden soll (bzw. konfigurieren Sie zunächst die Subscription).
     
    image
     
  3. Wählen Sie einen Namen und eine Region, in der der Cloud Service bereitgestellt werden soll.

    image
     
  4. Bestätigen Sie die Eingaben mit Publish.

Daraufhin installiert Visual Studio die FTP-Bridge in einen Microsoft Azure Cloud Service.

Zugriff über einen FTP-Client

Das Vorgehen hierzu ist identisch zu dem im ursprünglichen Blog Artikel beschriebenen.

Weitere Informationen