🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

AWS Lambda-Tutorial 2026: Python-Funktionen, SAM und FastAPI auf Serverless

⏱️4 min read  ·  813 words

AWS Lambda ist der definitive serverlose Rechendienst im Jahr 2026. Führen Sie Code als Reaktion auf Ereignisse aus – HTTP-Anfragen, Datenbankänderungen, Datei-Uploads, geplante Aufgaben –, ohne Server verwalten zu müssen. Dieser Leitfaden behandelt Lambda von der ersten Funktion bis zur produktionsbereiten serverlosen Architektur mit Python und Node.js.

Warum serverloses Lambda?

  • Keine Serververwaltung— AWS kümmert sich um Skalierung, Patching und Verfügbarkeit
  • Bezahlen Sie pro Nutzung– Abrechnung pro 1 ms Ausführung (die ersten 1 Mio. Anfragen kostenlos/Monat)
  • Unendliche Skalierung– Skaliert automatisch von 0 auf 10.000 gleichzeitige Ausführungen
  • Ereignisgesteuert– Trigger von API Gateway, S3, DynamoDB, SQS, EventBridge
  • Kaltstarts– Sekundenschnelle Initialisierung für Python/Node.js mit SnapStart

Hallo Welt Lambda (Python)

# lambda_function.py
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event: dict, context) -> dict:
    logger.info(f"Event: {json.dumps(event)}")

    # context has: function_name, remaining_time_in_millis, memory_limit_in_mb
    logger.info(f"Remaining time: {context.get_remaining_time_in_millis()}ms")

    name = event.get("queryStringParameters", {}).get("name", "World")

    return {
        "statusCode": 200,
        "headers": {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "*",
        },
        "body": json.dumps({
            "message": f"Hello, {name}!",
            "requestId": context.aws_request_id,
        })
    }

Bereitstellung mit AWS SAM

# Install AWS SAM CLI
pip install aws-sam-cli

# Initialize project
sam init --runtime python3.12 --app-template hello-world

# Build
sam build

# Local test
sam local invoke HelloWorldFunction --event events/event.json
sam local start-api  # runs locally on port 3000

# Deploy to AWS
sam deploy --guided  # first time (interactive)
sam deploy           # subsequent deploys

# template.yaml (SAM template)
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Globals:
  Function:
    Runtime: python3.12
    Timeout: 30
    MemorySize: 256
    Environment:
      Variables:
        ENVIRONMENT: !Ref Environment
    Layers:
      - !Ref DependenciesLayer

Parameters:
  Environment:
    Type: String
    AllowedValues: [dev, staging, production]

Resources:
  ApiFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: api.handler
      Policies:
        - DynamoDBCrudPolicy:
            TableName: !Ref UsersTable
        - S3ReadPolicy:
            BucketName: !Ref AssetsBucket
      Events:
        Api:
          Type: Api
          Properties:
            Path: /{proxy+}
            Method: ANY
        Schedule:
          Type: Schedule
          Properties:
            Schedule: rate(5 minutes)

  DependenciesLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      ContentUri: dependencies/
      CompatibleRuntimes: [python3.12]

  UsersTable:
    Type: AWS::DynamoDB::Table
    Properties:
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - AttributeName: pk
          AttributeType: S
        - AttributeName: sk
          AttributeType: S
      KeySchema:
        - AttributeName: pk
          KeyType: HASH
        - AttributeName: sk
          KeyType: RANGE

FastAPI auf Lambda (Mangum)

pip install fastapi mangum
# Package: put in layer or zip with requirements.txt

# main.py
from fastapi import FastAPI, Depends, HTTPException
from mangum import Mangum
from pydantic import BaseModel

app = FastAPI(
    title="My API",
    root_path="/production"  # API Gateway stage
)

class User(BaseModel):
    id: int
    name: str
    email: str

@app.get("/users/{user_id}")
async def get_user(user_id: int) -> User:
    user = await db.get_user(user_id)
    if not user:
        raise HTTPException(404, "User not found")
    return user

@app.post("/users")
async def create_user(user: User) -> User:
    return await db.create_user(user)

# Lambda handler
handler = Mangum(app, lifespan="off")

Ereignisquellen

# S3 trigger — process uploaded files
def handle_s3_upload(event: dict, context) -> None:
    for record in event.get('Records', []):
        bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key']
        size = record['s3']['object']['size']
        print(f"Processing {key} ({size} bytes) from {bucket}")
        process_file(bucket, key)

# SQS trigger — process messages
def handle_sqs_messages(event: dict, context) -> dict:
    batch_failures = []
    for record in event.get('Records', []):
        try:
            body = json.loads(record['body'])
            process_message(body)
        except Exception as e:
            # Return failed message IDs for retry
            batch_failures.append({"itemIdentifier": record['messageId']})
    return {"batchItemFailures": batch_failures}

# DynamoDB Streams trigger
def handle_db_changes(event: dict, context) -> None:
    for record in event.get('Records', []):
        if record['eventName'] == 'INSERT':
            new_item = record['dynamodb']['NewImage']
            on_user_created(new_item)
        elif record['eventName'] == 'MODIFY':
            old = record['dynamodb']['OldImage']
            new = record['dynamodb']['NewImage']
            on_user_updated(old, new)

# EventBridge scheduled task
def run_nightly_report(event: dict, context) -> None:
    print(f"Running nightly report at {event['time']}")
    generate_and_email_report()

Best Practices für Lambda

  • Konzentrieren Sie sich auf die Funktionen– eine Funktion, ein Zweck
  • Verbindungen wiederverwenden– DB/Redis-Verbindungen außerhalb des Handlers initialisieren (sie bleiben bei warmen Aufrufen bestehen)
  • Verwenden Sie Lambda-Ebenen– Teilen Sie Abhängigkeiten funktionsübergreifend, reduzieren Sie die Größe des Bereitstellungspakets
  • Stellen Sie den entsprechenden Speicher ein— mehr Speicher = mehr CPU, oft schneller+günstiger (Test 128-3008 MB)
  • Aktivieren Sie SnapStart(Java) /Verwenden Sie Graviton2(besseres Preis-Leistungs-Verhältnis)
  • Kaltstarts überwachen– Verwenden Sie Röntgenverfolgung, halten Sie Funktionen für kritische Pfade warm
  • Idempotente Funktionen– Lambda kann mehrmals (mindestens einmal) aufgerufen werden, entsprechend entwerfen

AWS Lambda im Jahr 2026 ist die kostengünstigste Möglichkeit, ereignisgesteuerte, API- und geplante Workloads auszuführen. Verwenden Sie SAM für die lokale Entwicklung und Bereitstellung, FastAPI+Mangum für REST-APIs und konfigurieren Sie den richtigen Speicher für Ihre Arbeitslast. Für konstant warme APIs sollten Sie Lambda mit Provisioned Concurrency oder Fargate für Always-on-Dienste in Betracht ziehen.

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇬🇧 English🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা