Exemples Azure Functions

Exemples Azure Functions serverless computing avec déclencheurs HTTP, minuteurs et intégrations

Key Facts

Category
Cloud Computing
Items
5
Format Families
sql

Sample Overview

Exemples Azure Functions serverless computing avec déclencheurs HTTP, minuteurs et intégrations This sample set belongs to Cloud Computing and can be used to test related workflows inside Elysia Tools.

💻 Fonction HTTP Trigger javascript

🟢 simple

Azure Function de base avec HTTP trigger pour endpoints REST API

⏱️ 10 min 🏷️ azure, functions, serverless, http, api
Prerequisites: Azure account, Azure Functions Core Tools, Node.js basics
// Azure Functions HTTP Trigger Example
// JavaScript (Node.js) - function.json + index.js

// function.json - Function configuration
{
  "scriptFile": "index.js",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    }
  ]
}

// index.js - Function implementation
module.exports = async function (context, req) {
    context.log('HTTP trigger function processed a request.');

    const name = req.query.name || (req.body && req.body.name);
    const responseMessage = name
        ? "Hello, " + name + ". This HTTP triggered function executed successfully."
        : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.";

    context.res = {
        status: 200,
        body: responseMessage
    };
};

// TypeScript version
// index.ts
import { AzureFunction, Context, HttpRequest } from "@azure/functions"

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    context.log('HTTP trigger function processed a request.');

    const name = req.query.name || (req.body && req.body.name);
    const responseMessage = name
        ? "Hello, " + name + ". This HTTP triggered function executed successfully."
        : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.";

    context.res = {
        status: 200,
        body: responseMessage
    };
};

export default httpTrigger;

💻 Fonction Timer Trigger csharp

🟢 simple ⭐⭐

Azure Function programmée qui s'exécute sur un minuteur pour les tâches d'arrière-plan

⏱️ 15 min 🏷️ azure, functions, timer, scheduler, durable
Prerequisites: Azure account, C# basics, Understanding of cron expressions
// Azure Functions Timer Trigger Example
// C# - TimerTrigger.cs

using System;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Extensions.Logging;

public static class TimerTriggerFunction
{
    [FunctionName("TimerTriggerFunction")]
    public static void Run(
        [TimerTrigger("0 */5 * * * *")] TimerInfo myTimer,
        ILogger log,
        [DurableClient] IDurableClient starter)
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

        if (myTimer.IsPastDue)
        {
            log.LogInformation("Timer is past due!");
        }

        // Start a new orchestration for cleanup task
        string instanceId = starter.StartNewAsync("CleanupOrchestration", null).Result;
        log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
    }
}

[FunctionName("CleanupOrchestration")]
public static async Task RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context,
    ILogger log)
{
    log.LogInformation("Starting cleanup orchestration...");

    // Clean up old files
    await context.CallActivityAsync<string>("DeleteOldFiles", null);

    // Send notification
    await context.CallActivityAsync<string>("SendCleanupNotification", null);

    log.LogInformation("Cleanup orchestration completed.");
}

[FunctionName("DeleteOldFiles")]
public static string DeleteOldFiles([ActivityTrigger] string input, ILogger log)
{
    log.LogInformation("Deleting old files...");
    // Implementation for file cleanup
    return "Old files deleted successfully";
}

[FunctionName("SendCleanupNotification")]
public static string SendCleanupNotification([ActivityTrigger] string input, ILogger log)
{
    log.LogInformation("Sending cleanup notification...");
    // Implementation for notification
    return "Notification sent successfully";
}

💻 Fonction Queue Trigger python

🟡 intermediate ⭐⭐⭐

Azure Function déclenchée par des messages Azure Queue Storage

⏱️ 20 min 🏷️ azure, functions, queue, storage, python
Prerequisites: Azure Storage account, Python basics, Understanding of message queues
# Azure Functions Queue Trigger Example
# Python - __init__.py + function.json

# function.json
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "msg",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting"
    },
    {
      "name": "outputQueueItem",
      "type": "queue",
      "direction": "out",
      "queueName": "outqueue",
      "connection": "MyStorageConnectionAppSetting"
    }
  ]
}

# __init__.py
import logging
import json
import os
from datetime import datetime
import azure.functions as func
from azure.storage.blob import BlobServiceClient

def main(msg: func.QueueMessage, outputQueueItem: func.Out[func.QueueMessage]) -> None:
    """Process queue message and store result in blob storage."""

    logging.info('Python queue trigger function processed a queue item.')

    # Parse incoming message
    try:
        message_body = json.loads(msg.get_body())
        order_id = message_body.get('orderId')
        customer_email = message_body.get('customerEmail')

        logging.info(f'Processing order {order_id} for customer {customer_email}')

        # Process the order (business logic)
        processed_order = process_order(message_body)

        # Store result in blob storage
        blob_client = get_blob_client()
        blob_name = f"orders/{order_id}.json"
        blob_client.upload_blob(blob_name, json.dumps(processed_order), overwrite=True)

        # Send output message
        output_message = {
            'orderId': order_id,
            'status': 'processed',
            'processedAt': datetime.now().isoformat(),
            'blobUrl': f"https://yourstorage.blob.core.windows.net/yourcontainer/{blob_name}"
        }

        outputQueueItem.set(json.dumps(output_message))

        logging.info(f'Successfully processed order {order_id}')

    except Exception as e:
        logging.error(f'Error processing message: {str(e)}')
        raise

def process_order(order_data):
    """Example order processing logic."""
    # Add processing timestamp
    order_data['processedAt'] = datetime.now().isoformat()
    order_data['status'] = 'processed'

    # Calculate total with tax
    subtotal = order_data.get('subtotal', 0)
    tax_rate = 0.08
    tax = subtotal * tax_rate
    total = subtotal + tax

    order_data.update({
        'tax': round(tax, 2),
        'total': round(total, 2)
    })

    return order_data

def get_blob_client():
    """Initialize blob service client."""
    # In production, use connection string from environment variables
    connection_string = os.environ['AzureWebJobsStorage']
    blob_service_client = BlobServiceClient.from_connection_string(connection_string)

    container_name = "processed-orders"
    # Create container if it doesn't exist
    blob_service_client.create_container(container_name)

    return blob_service_client.get_blob_client(container=container_name)

💻 Intégration Cosmos DB javascript

🟡 intermediate ⭐⭐⭐

Azure Function avec bindings d'entrée et sortie Cosmos DB

⏱️ 25 min 🏷️ azure, functions, cosmosdb, database, nosql
Prerequisites: Azure Cosmos DB account, JavaScript basics, Understanding of NoSQL databases
// Azure Functions Cosmos DB Integration
// JavaScript - function.json + index.js

// function.json
{
  "scriptFile": "index.js",
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "type": "cosmosDB",
      "direction": "out",
      "name": "outputDocument",
      "databaseName": "Tasks",
      "collectionName": "Items",
      "createIfNotExists": true,
      "partitionKey": "/id",
      "connectionStringSetting": "CosmosDBConnection"
    },
    {
      "type": "cosmosDB",
      "direction": "in",
      "name": "inputDocuments",
      "databaseName": "Tasks",
      "collectionName": "Items",
      "sqlQuery": "SELECT * FROM c WHERE c.status = 'pending' ORDER BY c.createdAt DESC",
      "connectionStringSetting": "CosmosDBConnection"
    }
  ]
}

// index.js
const { v4: uuidv4 } = require('uuid');

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger with Cosmos DB bindings processed a request.');

    try {
        const task = {
            id: uuidv4(),
            title: req.body.title,
            description: req.body.description,
            status: 'new',
            priority: req.body.priority || 'medium',
            createdAt: new Date().toISOString(),
            createdBy: req.body.userId || 'anonymous'
        };

        // Set the output document to be saved to Cosmos DB
        context.bindings.outputDocument = task;

        // Get pending tasks from input binding
        const pendingTasks = context.bindings.inputDocuments || [];

        const response = {
            success: true,
            message: "Task created successfully!",
            createdTask: task,
            pendingTasksCount: pendingTasks.length,
            pendingTasks: pendingTasks.slice(0, 5) // Return first 5 pending tasks
        };

        context.res = {
            status: 201,
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(response)
        };

    } catch (error) {
        context.log.error('Error creating task:', error);

        context.res = {
            status: 500,
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                success: false,
                error: "Failed to create task",
                message: error.message
            })
        };
    }
};

// Additional functions for task management

// Update task function
{
  "scriptFile": "updateTask.js",
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": ["put"],
      "route": "tasks/{id}"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "type": "cosmosDB",
      "direction": "in",
      "name": "existingTask",
      "databaseName": "Tasks",
      "collectionName": "Items",
      "id": "{id}",
      "partitionKey": "{id}",
      "connectionStringSetting": "CosmosDBConnection"
    },
    {
      "type": "cosmosDB",
      "direction": "out",
      "name": "updatedTask",
      "databaseName": "Tasks",
      "collectionName": "Items",
      "createIfNotExists": false,
      "partitionKey": "/id",
      "connectionStringSetting": "CosmosDBConnection"
    }
  ]
}

// updateTask.js
module.exports = async function (context, req) {
    context.log('Updating task:', req.params.id);

    const existingTask = context.bindings.existingTask;

    if (!existingTask) {
        return {
            status: 404,
            body: { error: "Task not found" }
        };
    }

    // Update task properties
    const updates = {
        ...existingTask,
        ...req.body,
        updatedAt: new Date().toISOString(),
        updatedBy: req.body.userId || 'anonymous'
    };

    context.bindings.updatedTask = updates;

    return {
        status: 200,
        body: {
            success: true,
            message: "Task updated successfully!",
            task: updates
        }
    };
};

💻 Orchestration Durable Functions csharp

🔴 complex ⭐⭐⭐⭐⭐

Processus métier complexe utilisant Azure Durable Functions pour workflows avec état

⏱️ 45 min 🏷️ azure, functions, durable, orchestration, workflow, complex
Prerequisites: Advanced Azure Functions knowledge, C# async/await patterns, Understanding of compensation patterns
// Azure Durable Functions Orchestration Example
// C# - Order Processing Workflow

using System;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Extensions.Logging;

namespace OrderProcessing
{
    // Orchestrator function - Coordinates the entire workflow
    public static class OrderProcessingOrchestration
    {
        [FunctionName("ProcessOrder")]
        public static async Task<OrderResult> RunOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context,
            ILogger log)
        {
            var order = context.GetInput<OrderRequest>();
            log.LogInformation($"Starting order processing for Order ID: {order.OrderId}");

            // Step 1: Validate order
            var validationResult = await context.CallActivityAsync<ValidationResult>(
                "ValidateOrder", order);

            if (!validationResult.IsValid)
            {
                return new OrderResult
                {
                    OrderId = order.OrderId,
                    Status = "Failed",
                    ErrorMessage = validationResult.ErrorMessage
                };
            }

            // Step 2: Check inventory
            var inventoryCheck = await context.CallActivityAsync<InventoryCheckResult>(
                "CheckInventory", order);

            if (!inventoryCheck.IsAvailable)
            {
                return new OrderResult
                {
                    OrderId = order.OrderId,
                    Status = "Failed",
                    ErrorMessage = "Insufficient inventory"
                };
            }

            // Step 3: Reserve inventory (with compensation)
            await context.CallActivityAsync<string>("ReserveInventory", order);

            try
            {
                // Step 4: Process payment (with retry and compensation)
                var paymentResult = await context.CallActivityWithRetryAsync<PaymentResult>(
                    "ProcessPayment",
                    new RetryOptions(TimeSpan.FromSeconds(30), 3)
                    {
                        BackoffCoefficient = 2,
                        Handle = ex => ex is PaymentException
                    },
                    order);

                // Step 5: Create shipping order
                var shippingInfo = await context.CallActivityAsync<ShippingInfo>(
                    "CreateShipment", new ShipmentRequest
                    {
                        OrderId = order.OrderId,
                        CustomerAddress = order.CustomerAddress,
                        Items = order.Items
                    });

                // Step 6: Send confirmation email (in parallel with updating customer)
                var parallelTasks = new[]
                {
                    context.CallActivityAsync<string>("SendConfirmationEmail",
                        new EmailRequest
                        {
                            CustomerEmail = order.CustomerEmail,
                            OrderId = order.OrderId,
                            ShippingInfo = shippingInfo
                        }),
                    context.CallActivityAsync<string>("UpdateCustomerOrderStatus",
                        new CustomerUpdateRequest
                        {
                            CustomerId = order.CustomerId,
                            OrderId = order.OrderId,
                            Status = "Processed"
                        })
                };

                await Task.WhenAll(parallelTasks);

                return new OrderResult
                {
                    OrderId = order.OrderId,
                    Status = "Completed",
                    ShippingInfo = shippingInfo,
                    ProcessedAt = context.CurrentUtcDateTime
                };
            }
            catch (Exception ex)
            {
                // Compensation: Release reserved inventory
                await context.CallActivityAsync<string>("ReleaseInventory", order);

                log.LogError($"Order processing failed: {ex.Message}");

                return new OrderResult
                {
                    OrderId = order.OrderId,
                    Status = "Failed",
                    ErrorMessage = ex.Message
                };
            }
        }
    }

    // Activity functions
    public static class OrderActivities
    {
        [FunctionName("ValidateOrder")]
        public static ValidationResult ValidateOrder(
            [ActivityTrigger] OrderRequest order,
            ILogger log)
        {
            log.LogInformation($"Validating order {order.OrderId}");

            if (string.IsNullOrEmpty(order.CustomerId) ||
                order.Items == null || order.Items.Count == 0)
            {
                return new ValidationResult
                {
                    IsValid = false,
                    ErrorMessage = "Invalid order: Missing customer or items"
                };
            }

            return new ValidationResult { IsValid = true };
        }

        [FunctionName("CheckInventory")]
        public static InventoryCheckResult CheckInventory(
            [ActivityTrigger] OrderRequest order,
            ILogger log)
        {
            log.LogInformation($"Checking inventory for order {order.OrderId}");

            // Simulate inventory check
            foreach (var item in order.Items)
            {
                var availableQuantity = GetAvailableQuantity(item.ProductId);
                if (availableQuantity < item.Quantity)
                {
                    return new InventoryCheckResult
                    {
                        IsAvailable = false,
                        UnavailableProduct = item.ProductId,
                        AvailableQuantity = availableQuantity
                    };
                }
            }

            return new InventoryCheckResult { IsAvailable = true };
        }

        [FunctionName("ReserveInventory")]
        public static string ReserveInventory(
            [ActivityTrigger] OrderRequest order,
            ILogger log)
        {
            log.LogInformation($"Reserving inventory for order {order.OrderId}");

            // Reserve inventory logic here
            return $"Inventory reserved for order {order.OrderId}";
        }

        [FunctionName("ProcessPayment")]
        public static PaymentResult ProcessPayment(
            [ActivityTrigger] OrderRequest order,
            ILogger log)
        {
            log.LogInformation($"Processing payment for order {order.OrderId}");

            // Simulate payment processing
            var totalAmount = order.Items.Sum(item => item.Price * item.Quantity);

            // Simulate occasional payment failures
            if (DateTime.Now.Second % 10 == 0)
            {
                throw new PaymentException("Payment gateway temporarily unavailable");
            }

            return new PaymentResult
            {
                TransactionId = Guid.NewGuid().ToString(),
                Amount = totalAmount,
                Currency = "USD",
                Status = "Completed"
            };
        }

        [FunctionName("CreateShipment")]
        public static ShippingInfo CreateShipment(
            [ActivityTrigger] ShipmentRequest request,
            ILogger log)
        {
            log.LogInformation($"Creating shipment for order {request.OrderId}");

            return new ShippingInfo
            {
                ShipmentId = Guid.NewGuid().ToString(),
                TrackingNumber = $"TRACK-{DateTime.Now.Ticks}",
                EstimatedDelivery = DateTime.Now.AddDays(3),
                ShippingMethod = "Standard"
            };
        }

        [FunctionName("SendConfirmationEmail")]
        public static string SendConfirmationEmail(
            [ActivityTrigger] EmailRequest request,
            ILogger log)
        {
            log.LogInformation($"Sending confirmation email for order {request.OrderId}");

            // Email sending logic here
            return $"Email sent to {request.CustomerEmail}";
        }

        [FunctionName("UpdateCustomerOrderStatus")]
        public static string UpdateCustomerOrderStatus(
            [ActivityTrigger] CustomerUpdateRequest request,
            ILogger log)
        {
            log.LogInformation($"Updating customer {request.CustomerId} order status");

            // Database update logic here
            return $"Customer order status updated to {request.Status}";
        }

        [FunctionName("ReleaseInventory")]
        public static string ReleaseInventory(
            [ActivityTrigger] OrderRequest order,
            ILogger log)
        {
            log.LogInformation($"Releasing inventory for order {order.OrderId}");

            // Inventory release logic here
            return $"Inventory released for order {order.OrderId}";
        }

        private static int GetAvailableQuantity(string productId)
        {
            // Simulate inventory lookup
            return new Random().Next(0, 100);
        }
    }

    // Data models
    public class OrderRequest
    {
        public string OrderId { get; set; }
        public string CustomerId { get; set; }
        public string CustomerEmail { get; set; }
        public Address CustomerAddress { get; set; }
        public List<OrderItem> Items { get; set; }
    }

    public class OrderItem
    {
        public string ProductId { get; set; }
        public string ProductName { get; set; }
        public int Quantity { get; set; }
        public decimal Price { get; set; }
    }

    public class Address
    {
        public string Street { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string ZipCode { get; set; }
        public string Country { get; set; }
    }

    public class ValidationResult
    {
        public bool IsValid { get; set; }
        public string ErrorMessage { get; set; }
    }

    public class InventoryCheckResult
    {
        public bool IsAvailable { get; set; }
        public string UnavailableProduct { get; set; }
        public int AvailableQuantity { get; set; }
    }

    public class PaymentResult
    {
        public string TransactionId { get; set; }
        public decimal Amount { get; set; }
        public string Currency { get; set; }
        public string Status { get; set; }
    }

    public class ShippingInfo
    {
        public string ShipmentId { get; set; }
        public string TrackingNumber { get; set; }
        public DateTime EstimatedDelivery { get; set; }
        public string ShippingMethod { get; set; }
    }

    public class EmailRequest
    {
        public string CustomerEmail { get; set; }
        public string OrderId { get; set; }
        public ShippingInfo ShippingInfo { get; set; }
    }

    public class CustomerUpdateRequest
    {
        public string CustomerId { get; set; }
        public string OrderId { get; set; }
        public string Status { get; set; }
    }

    public class ShipmentRequest
    {
        public string OrderId { get; set; }
        public Address CustomerAddress { get; set; }
        public List<OrderItem> Items { get; set; }
    }

    public class OrderResult
    {
        public string OrderId { get; set; }
        public string Status { get; set; }
        public string ErrorMessage { get; set; }
        public ShippingInfo ShippingInfo { get; set; }
        public DateTime? ProcessedAt { get; set; }
    }

    public class PaymentException : Exception
    {
        public PaymentException(string message) : base(message) { }
    }
}