Skip to content

Azure Functions

starlightViewModes.switchTo

This content is not available in your language yet.

Azure Functions sind Serverless Computing in Microsoft Azure. Serverless Computing ist ein eher irreführender Begriff. Serverless bedeutet in diesem Zusammenhang einfach, dass Ressourcen on demand ein- und ausgeschaltet werden. Wenn also momentan viele Anfragen auf Ihre Website eintreffen, werden im Hintergrund mehrere Instanzen gestartet. Logischerweise werden auch hier Server verwendet, um diese Anfragen entgegen zu nehmen. Allerdings bekommt der Developer nichts davon mit, damit er/sie sich mehr auf die Applikation selbst konzentrieren kann.

Eine Azure Function, welche mittels NCRONTAB expression alle 10 Sekunden getriggert wird, sieht zum Beispiel so:

[Function("MyTimerTrigger")]
public static string Run(
[TimerTrigger("*/10 * * * * *")] MyInfo myTimer,
FunctionContext context)
{
var logger = context.GetLogger("RecurringEvent");
logger.LogInformation(
$"Function executed at: {DateTime.Now}");
}

Input Trigger

Jede Azure Function ist eine einfache Funktion in C## oder anderen Programmiersprachen. Dabei benötigt jede AF (Azure Function) einen Trigger, bei welchen sie ausgeführt werden soll. Es gibt viele verschiedene Arten von Triggern:

Azure Function Trigger
HTTP Trigger (Ausführung bei HTTP Request)
Timer Trigger (Ausführung in Intervallen)
Queue Trigger (Ausführung bei neuer Message in Queue Storage)
Blob Trigger (Ausführung bei Dateiupload in Blob Storage)
Cosmos DB Trigger
Event Grid Trigger
Event Hub Trigger
Custom Bindings (.NET)

Timer Trigger

Wenn eine AF zum Beispiel alle 5 Minuten ausgeführt werden soll, kann man diese Function verwenden:

[Function("MyTimerTrigger")]
public static string Run(
[TimerTrigger("* */5 * * * *")] MyInfo myTimer,
ILogger log)
{
log.LogInformation(
$"Function executed at: {DateTime.Now}");
}

HTTP Trigger

Wenn eine AF zum Beispiel bei einem HTTP Request auf die Route /trueberryless ausgeführt werden soll, kann man diese Function verwenden:

[Function("MyHTTPTrigger")]
public static string Run(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = "trueberryless")] HttpRequest req,
ILogger log)
{
log.LogInformation($"C## HTTP trigger function processed a request.");
}

Blob Trigger

Bei jeder neuen Datei im Container, wird diese AF durchgeführt:

[Function("MyBlobTrigger")]
public static string Run(
[BlobTrigger("blobs/{name}", Connection = "AzureWebJobsStorage")] Stream imageStream,
ILogger log)
{
log.LogInformation($"C## Blob trigger function processed a file.");
}

Queue Trigger

Bei jeder neuen Message in der Queue wird die Function getriggert. Dabei muss man zwischen Topics und Queue unterscheiden, denn ein Topic kann an mehrere Empfänger gesendet werden, während eine Queue immer nur einen Empfänger hat.

[Function("MyQueueTrigger")]
public static string Run(
[QueueTrigger("messages", Connection = "AzureWebJobsStorage")] string jsonString
ILogger log)
{
log.LogInformation($"C## Queue trigger function processed a message.");
}

Input Binding

Wenn in der Azure Function Zugriff auf einen Storage Account benötigt wird, kann dies relativ einfach mittels Input Bindings umgesetzt werden.

[Function("MyInputBinding")]
public static string Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req,
[Table("TreeTable")] TableClient tableClient,
ILogger log)
{
var tableEntity = new TreeTable()
{
PartitionKey = "tree",
RowKey = Guid.NewGuid().ToString(),
TreeType = "Fichte",
TreeHeight = 13.3
};
tableClient.AddEntity(tableEntity);
}
public class TreeTable : Azure.Data.Tables.ITableEntity
{
public double TreeHeight { get; set; }
public string TreeType { get; set; }
public string PartitionKey { get; set; }
public string RowKey { get; set; }
public DateTimeOffset? Timestamp { get; set; }
public ETag ETag { get; set; }
}

Output Binding

Wenn Sie als Rückgabewert Daten in einen Storage Account schreiben wollen, eignet sich hierfür das Output Binding.

[Function("MyOutputBinding")]
public static string Run(
[BlobTrigger("images/{name}", Connection = "AzureWebJobsStorage")] Stream imageStream,
[Blob("thumbnails/{name}", FileAccess.Write)] Stream thumbnails,
ILogger log)
{
using var image = await SixLabors.ImageSharp.Image.LoadAsync(imageStream);
var newWidth = 300;
var newHeight = 200;
image.Mutate(x => x.Resize(new ResizeOptions
{
Size = new Size(newWidth, newHeight),
Mode = ResizeMode.Max
}));
await image.SaveAsync(thumbnailStream, new JpegEncoder());
}