Windows Azure - Web Jobs mit Web Sites

Zum Ausführen von wiederkehrenden Aufgaben konnte bis anhin nur die WorkerRole aus den Cloud Services verwendet werden. Für Azure Web Sites gabs bis jetzt keine Möglichkeit periodische Jobs auszuführen.

Dies hat sich nun geändert :-) Seit kurzem stehen nun Web Jobs in einer Preview Version für Web Sites zur Verfügung. Damit lassen sich beliebige Jobs erstellen und in einem fixen Intervall oder ‘on demand’ ausführen. Der Job wird auf derselben VM ausgeführt, wie die Web Site.

Zur Ausführung der Jobs werden folgende Filetypen unterstützt:

  • .cmd, .bat, .exe (using windows cmd)
  • .php (using php)
  • .py (using python)
  • .js (using node)
  • .sh (using bash)

Zusätzlich können Jobs mit dem Windows Azure WebJobs SDK erstellt werden. Scripting mit Powershell ist über diesen Workaround möglich.

Hier ein kleines Program, welches die Grösse aller Drives auf der VM ausliest und im Blob Storage als Textdatei ablegt:

using System;
using System.IO;
using System.Text;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;

namespace WindowsAzureWebsiteJob
{
    class Program
    {
        static void Main(string[] args)
        {
            const String StorageAccount =
                "DefaultEndpointsProtocol=https;" +
                "AccountName=;" +
                "AccountKey=";

            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(StorageAccount);
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference("mydrivesize");
            container.CreateIfNotExists();
            container.SetPermissions(new BlobContainerPermissions {
                PublicAccess = BlobContainerPublicAccessType.Container
            });


            StringBuilder builder = new StringBuilder();
            builder.AppendFormat("{0} - {1}",  DateTime.Now.ToShortDateString(), DateTime.Now.ToLongTimeString());
            builder.AppendLine();
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                if (drive.IsReady)
                {
                    builder.AppendFormat("{0} TotalSize={1} GB; TotalFreeSpace={2} GB",
                        drive.Name,
                        ToGb(drive.TotalSize),
                        ToGb(drive.TotalFreeSpace));
                    builder.AppendLine();
                }
            }

            String filename = String.Format("mysize_{0}.txt", DateTime.Now.ToString("yyyyMMdd"));
            CloudBlockBlob blob = container.GetBlockBlobReference(filename);
            blob.UploadText(builder.ToString());
        }

        static long ToGb(long size)
        {
            var kb = size / 1024;
            var mb = kb / 1024;
            return mb / 1024;
        }
    }
}

Das Programm mitsamt allen benötigten Libraries zippen und ins Portal hochladen.

Web Job anlegen

Upload Web Job

Über "Run Once" im Portal kann der Job gestartet werden.

Run Web Job

Der Job erstellt unter dem angegebenen Storage Account einen neuen Blob mit TimeStamp und der Grösse aller gefundenen Drives auf der VM:

1/23/2014 - 9:07:50 PM
C:\ TotalSize=2039 GB; TotalFreeSpace=2003 GB
D:\ TotalSize=25 GB; TotalFreeSpace=12 GB

Die fertige Visual Studio 2013 Solution gibts hier zum Download. Weitere Informationen zu den Web Jobs sind hier und hier zu finden.