

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Lambda mit Ereignissen aus anderen Diensten aufrufen AWS
<a name="lambda-services"></a>

*Einige AWS-Services können Lambda-Funktionen mithilfe von Triggern direkt aufrufen.* Diese Dienste leiten Ereignisse an Lambda weiter und die Funktion wird sofort aufgerufen, wenn das angegebene Ereignis eintritt. Trigger eignen sich für diskrete Ereignisse und die Verarbeitung in Echtzeit. Wenn Sie [mit der Lambda-Konsole einen Trigger erstellen](#lambda-invocation-trigger), interagiert die Konsole mit dem entsprechenden AWS Dienst, um die Ereignisbenachrichtigung für diesen Dienst zu konfigurieren. Der Auslöser wird tatsächlich von dem Dienst gespeichert und verwaltet, der die Ereignisse generiert, nicht von Lambda.

Die Ereignisse sind im JSON-Format gegliedert. Die JSON-Struktur variiert je nach Service, der sie generiert und dem Ereignistyp, aber sie alle enthalten die Daten, die die Funktion benötigt, um das Ereignis zu verarbeiten.

Eine Funktion kann mehrere Auslöser haben. Jeder Auslöser fungiert als Client, der Ihre Funktion unabhängig aufruft, und jedes Ereignis, das Lambda an Ihre Funktion weitergibt, enthält Daten von nur einem Auslöser. Lambda wandelt das Ereignisdokument in ein Objekt um und leitet es an Ihren Funktions-Handler weiter.

Je nach Service kann der ereignisgesteuerte Aufruf [synchron](invocation-sync.md) oder [asynchron](invocation-async.md) erfolgen.
+ Beim synchronen Aufruf wartet der Service, der das Ereignis generiert, auf die Antwort Ihrer Funktion. Dieser Service definiert die Daten, die die Funktion in der Antwort zurückgeben muss. Der Service steuert die Fehlerstrategie, z. B. ob bei Fehlern ein erneuter Versuch unternommen werden soll.
+ Bei asynchronen Aufrufen verschiebt Lambda das Ereignis in die Warteschlange, bevor sie es an Ihre Funktion übergibt. Wenn Lambda das Ereignis in die Warteschlange stellt, sendet es sofort eine Erfolgsantwort an den Service der das Ereignis generiert hat. Nachdem die Funktion das Ereignis verarbeitet hat, gibt Lambda keine Antwort auf den ereignisgenerierenden Service zurück.

## Erstellen eines Auslösers
<a name="lambda-invocation-trigger"></a>

Der einfachste Weg, einen Auslöser zu erstellen, ist die Verwendung der Lambda-Konsole. Wenn Sie einen Auslöser über die Konsole erstellen, fügt Lambda automatisch die erforderlichen Berechtigungen zur [ressourcenbasierten Richtlinie](access-control-resource-based.md) der Funktion hinzu.

**So erstellen Sie einen Auslöser mit der Lambda-Konsole**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion aus, für die Sie einen Auslöser erstellen möchten.

1. Wählen Sie im Bereich **Function overview (Funktionsübersicht)** die Option **Add trigger (Auslöser hinzufügen)**.

1. Wählen Sie den AWS Dienst aus, für den Sie Ihre Funktion aufrufen möchten.

1. Füllen Sie die Optionen im Bereich **Trigger-Konfiguration** aus und wählen Sie **Hinzufügen**. Je nachdem, wie AWS-Service Sie Ihre Funktion aufrufen möchten, unterscheiden sich die Konfigurationsoptionen für den Trigger.

## Services, die Lambda-Funktionen aufrufen können
<a name="listing-of-services-and-links-to-more-information"></a>

In der folgenden Tabelle sind Dienste aufgeführt, die Lambda-Funktionen aufrufen können.


****  

| Service | Methode des Aufrufs | 
| --- | --- | 
|  [Amazon Managed Streaming für Apache Kafka](with-msk.md)  |  [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md)  | 
|  [Selbstverwaltetes Apache Kafka](with-kafka.md)  |  [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md)  | 
|  [Amazon API Gateway](services-apigateway.md)  |  Ereignisgesteuert; synchroner Aufruf  | 
|  [AWS CloudFormation](services-cloudformation.md)  |  Ereignisgesteuert; asynchroner Aufruf  | 
|  [ CloudWatch Amazon-Protokolle](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html#LambdaFunctionExample)  |  Ereignisgesteuert; asynchroner Aufruf  | 
|  [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-notify-lambda-cc.html)  |  Ereignisgesteuert; asynchroner Aufruf  | 
|  [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/actions-invoke-lambda-function.html)  |  Ereignisgesteuert; asynchroner Aufruf  | 
|  [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-events.html)  |  Ereignisgesteuert; synchroner Aufruf  | 
|  [AWS Config](governance-config.md)  |  Ereignisgesteuert; asynchroner Aufruf  | 
|  [Amazon Connect](https://docs.aws.amazon.com/connect/latest/adminguide/connect-lambda-functions.html)  |  Ereignisgesteuert; synchroner Aufruf  | 
|  [Amazon DocumentDB](with-documentdb.md)  |  [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md)  | 
|  [Amazon-DynamoDB](with-ddb.md)  |  [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md)  | 
|  [Elastic Load Balancing (Application Load Balancer)](services-alb.md)  |  Ereignisgesteuert; synchroner Aufruf  | 
|  [Amazon EventBridge (CloudWatch Veranstaltungen)](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)  |  Ereignisgesteuert; asynchroner Aufruf (Ereignisbusse), synchroner oder asynchroner Aufruf (Pipes und Zeitpläne)  | 
|  [AWS IoT](services-iot.md)  |  Ereignisgesteuert; asynchroner Aufruf  | 
|  [Amazon Kinesis](with-kinesis.md)  |  [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md)  | 
|  [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/data-transformation.html)  |  Ereignisgesteuert; synchroner Aufruf  | 
|  [Amazon Lex](https://docs.aws.amazon.com/lexv2/latest/dg/lambda.html)  |  Ereignisgesteuert; synchroner Aufruf  | 
|  [Amazon MQ](with-mq.md)  |  [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md)  | 
|  [Amazon Simple Email Service](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-action-lambda.html)  |  Ereignisgesteuert; asynchroner Aufruf  | 
|  [Amazon Simple Notification Service](with-sns.md)  |  Ereignisgesteuert; asynchroner Aufruf  | 
|  [Amazon Simple Queue Service](with-sqs.md)  |  [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md)  | 
|  [Amazon Simple Storage Service (Amazon-S3)](with-s3.md)  |  Ereignisgesteuert; asynchroner Aufruf  | 
|  [Amazon Simple Storage Service Batch](services-s3-batch.md)  |  Ereignisgesteuert; synchroner Aufruf  | 
|  [Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_lambda.html)  |  Secret-Rotation  | 
|  [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/connect-lambda.html)  |  Ereignisgesteuert; synchroner oder asynchroner Aufruf  | 
|  [Amazon VPC Lattice](https://docs.aws.amazon.com/vpc-lattice/latest/ug/lambda-functions.html)  |  Ereignisgesteuert; synchroner Aufruf  | 

# Verwendung von Lambda mit Apache Kafka
<a name="with-kafka-esm"></a>

Lambda unterstützt [Apache Kafka](https://kafka.apache.org/) als [Ereignisquelle](invocation-eventsourcemapping.md). Apache Kafka ist eine Open-Source-Plattform für Ereignisstreaming, die für die Verarbeitung von Datenpipelines und Streaminganwendungen mit hohem Durchsatz in Echtzeit entwickelt wurde. Es gibt zwei Hauptmethoden für die Verwendung von Lambda mit Apache Kafka:
+ [Verwenden von Lambda mit Amazon MSK](with-msk.md)— Amazon Managed Streaming for Apache Kafka (Amazon MSK) ist ein vollständig verwalteter Service von. AWS Amazon MSK unterstützt die Automatisierung der Verwaltung Ihrer Kafka-Infrastruktur, einschließlich Bereitstellung, Patching und Skalierung.
+ [Verwendung von Lambda mit selbstverwaltetem Apache Kafka](with-kafka.md)— In der AWS Terminologie umfasst ein selbstverwalteter Cluster auch nicht gehostete Kafka-Cluster.AWS [Sie können Lambda beispielsweise weiterhin mit einem Kafka-Cluster verwenden, der bei einem AWS Nicht-Cloud-Anbieter wie [Confluent](https://www.confluent.io/confluent-cloud/) Cloud oder Redpanda gehostet wird.](https://www.redpanda.com/)

Bei der Entscheidung zwischen Amazon MSK und selbstverwaltetem Apache Kafka sollten Sie Ihre betrieblichen Anforderungen und Kontrollanforderungen berücksichtigen. Amazon MSK ist die bessere Wahl, wenn Sie Sie schnell AWS bei der Verwaltung eines skalierbaren, produktionsbereiten Kafka-Setups mit minimalem Betriebsaufwand unterstützen möchten. Es vereinfacht die Sicherheit, Überwachung und Hochverfügbarkeit und hilft Ihnen, sich auf die Anwendungsentwicklung statt auf die Infrastrukturverwaltung zu konzentrieren. Auf der anderen Seite eignet sich der selbstverwaltete Apache Kafka besser für Anwendungsfälle, die in nicht AWS gehosteten Umgebungen ausgeführt werden, einschließlich lokaler Cluster.

**Topics**
+ [

# Verwenden von Lambda mit Amazon MSK
](with-msk.md)
+ [

# Verwendung von Lambda mit selbstverwaltetem Apache Kafka
](with-kafka.md)
+ [

# Skalierungsmodi des Ereignis-Pollers von Apache Kafka in Lambda
](kafka-scaling-modes.md)
+ [

# Apache-Kafka-Abfrage und Stream-Startpositionen in Lambda
](kafka-starting-positions.md)
+ [

# Anpassbare Verbrauchergruppen-ID in Lambda
](kafka-consumer-group-id.md)
+ [

# Filtern von Ereignissen aus Amazon MSK und selbstverwalteten Apache-Kafka-Ereignisquellen
](kafka-filtering.md)
+ [

# Verwenden von Schemaregistern mit Kafka-Ereignisquellen in Lambda
](services-consume-kafka-events.md)
+ [

# Verarbeitung mit niedriger Latenz für Kafka-Ereignisquellen
](with-kafka-low-latency.md)
+ [

# Konfiguration der Fehlerbehandlungssteuerungen für Kafka-Ereignisquellen
](kafka-retry-configurations.md)
+ [

# Erfassen verworfener Batches für Amazon MSK und selbstverwaltete Apache-Kafka-Ereignisquellen
](kafka-on-failure.md)
+ [

# Ein Kafka-Thema als Ziel für den Fall eines Fehlers verwenden
](kafka-on-failure-destination.md)
+ [

# Protokollierung der Zuordnung von Kafka-Ereignisquellen
](esm-logging.md)
+ [

# Fehlerbehebung bei der Kafka-Zuordnung von Ereignisquellen
](with-kafka-troubleshoot.md)

# Verwenden von Lambda mit Amazon MSK
<a name="with-msk"></a>

[Amazon Managed Streaming for Apache Kafka (Amazon MSK)](https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html) ist ein vollständig verwalteter Service, mit dem Sie Anwendungen erstellen und ausführen können, die Apache Kafka zum Verarbeiten von Streamingdaten verwenden. Amazon MSK vereinfacht die Einrichtung, Skalierung und Verwaltung von Kafka-Clustern. Amazon MSK erleichtert auch die Konfiguration Ihrer Anwendung für mehrere Availability Zones und aus Sicherheitsgründen mit AWS Identity and Access Management (IAM).

In diesem Kapitel wird erklärt, wie Sie einen Amazon-MSK-Cluster als Ereignisquelle für Ihre Lambda-Funktion verwenden. Der allgemeine Prozess zur Integration von Amazon MSK mit Lambda umfasst die folgenden Schritte:

1. **[Cluster- und Netzwerk-Setup](with-msk-cluster-network.md)**: Richten Sie zunächst Ihren [Amazon-MSK-Cluster](https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html) ein. Dazu gehört die richtige Netzwerkkonfiguration, damit Lambda auf Ihren Cluster zugreifen kann.

1. **[Einrichtung der Zuordnung von Ereignisquellen](with-msk-configure.md)**: Erstellen Sie anschließend die Ressource für die [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md), die Lambda benötigt, um Ihren Amazon-MSK-Cluster sicher mit Ihrer Funktion zu verbinden.

1. **[Einrichtung von Funktionen und Berechtigungen](with-msk-permissions.md)**: Stellen Sie abschließend sicher, dass Ihre Funktion korrekt eingerichtet ist und über die erforderlichen Berechtigungen in ihrer [Ausführungsrolle](lambda-intro-execution-role.md) verfügt.

**Anmerkung**  
Sie können jetzt Ihre Amazon MSK-Ereignisquellenzuordnungen direkt von der Lambda- oder der Amazon MSK-Konsole aus erstellen und verwalten. Beide Konsolen bieten die Option, die Einrichtung der erforderlichen Berechtigungen für die Lambda-Ausführungsrolle automatisch vorzunehmen, um den Konfigurationsprozess zu optimieren.

Beispiele für die Einrichtung einer Lambda-Integration mit einem Amazon MSK-Cluster finden Sie unter [Tutorial: Verwenden einer Amazon-MSK-Zuordnung von Ereignisquellen zum Aufrufen einer Lambda-Funktion](services-msk-tutorial.md) [Verwenden von Amazon MSK als Ereignisquelle für AWS Lambda](https://aws.amazon.com/blogs/compute/using-amazon-msk-as-an-event-source-for-aws-lambda/) im AWS Compute-Blog und [Amazon MSK Lambda-Integration in den Amazon MSK](https://amazonmsk-labs.workshop.aws/en/msklambda.html) Labs.

**Topics**
+ [

## Beispielereignis
](#msk-sample-event)
+ [

# Konfiguration Ihres Amazon-MSK-Clusters und Ihres Amazon-VPC-Netzwerks für Lambda
](with-msk-cluster-network.md)
+ [

# Konfiguration von Lambda-Berechtigungen für Amazon MSK-Ereignisquellenzuordnungen
](with-msk-permissions.md)
+ [

# Konfigurieren von Amazon MSK-Ereignisquellen für Lambda
](with-msk-configure.md)
+ [

# Tutorial: Verwenden einer Amazon-MSK-Zuordnung von Ereignisquellen zum Aufrufen einer Lambda-Funktion
](services-msk-tutorial.md)

## Beispielereignis
<a name="msk-sample-event"></a>

Lambda sendet den Batch von Nachrichten im Ereignisparameter, wenn es Ihre Funktion aufruft. Die Ereignisnutzlast enthält ein Array von Meldungen. Jedes Array-Element enthält Details zum Amazon-MSK-Thema und zur Partitions-ID sowie einen Zeitstempel und eine base64-codierte Nachricht.

```
{
   "eventSource":"aws:kafka",
   "eventSourceArn":"arn:aws:kafka:us-east-1:123456789012:cluster/vpc-2priv-2pub/751d2973-a626-431c-9d4e-d7975eb44dd7-2",
   "bootstrapServers":"b-2.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092,b-1.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092",
   "records":{
      "mytopic-0":[
         {
            "topic":"mytopic",
            "partition":0,
            "offset":15,
            "timestamp":1545084650987,
            "timestampType":"CREATE_TIME",
            "key":"abcDEFghiJKLmnoPQRstuVWXyz1234==",
            "value":"SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
            "headers":[
               {
                  "headerKey":[
                     104,
                     101,
                     97,
                     100,
                     101,
                     114,
                     86,
                     97,
                     108,
                     117,
                     101
                  ]
               }
            ]
         }
      ]
   }
}
```

# Konfiguration Ihres Amazon-MSK-Clusters und Ihres Amazon-VPC-Netzwerks für Lambda
<a name="with-msk-cluster-network"></a>

Um Ihre AWS Lambda Funktion mit Ihrem Amazon MSK-Cluster zu verbinden, müssen Sie Ihren Cluster und die [Amazon Virtual Private Cloud (VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html), in der er sich befindet, korrekt konfigurieren. Auf dieser Seite wird beschrieben, wie Sie Ihren Cluster und Ihre VPC konfigurieren. Wenn Ihr Cluster und Ihre VPC bereits ordnungsgemäß konfiguriert sind, lesen Sie unter [Konfigurieren von Amazon MSK-Ereignisquellen für Lambda](with-msk-configure.md) nach, wie Sie die Zuordnung von Ereignisquellen konfigurieren.

**Topics**
+ [

## Überblick über die Anforderungen an die Netzwerkkonfiguration für Lambda- und MSK-Integrationen
](#msk-network-requirements)
+ [

## Konfiguration eines NAT-Gateways für eine MSK-Ereignisquelle
](#msk-nat-gateway)
+ [

## Konfiguration von AWS PrivateLink Endpunkten für eine MSK-Ereignisquelle
](#msk-vpc-privatelink)

## Überblick über die Anforderungen an die Netzwerkkonfiguration für Lambda- und MSK-Integrationen
<a name="msk-network-requirements"></a>

Die für eine Lambda- und MSK-Integration erforderliche Netzwerkkonfiguration hängt von der Netzwerkarchitektur Ihrer Anwendung ab. An dieser Integration sind drei Hauptressourcen beteiligt: der Amazon-MSK-Cluster, die Lambda-Funktion und die Lambda-Zuordnung von Ereignisquellen. Jede dieser Ressourcen befindet sich in einer anderen VPC:
+ Ihr Amazon-MSK-Cluster befindet sich normalerweise in einem privaten Subnetz einer VPC, die Sie verwalten.
+ Ihre Lambda-Funktion befindet sich in einer AWS verwalteten VPC, die Lambda gehört.
+ Ihre Lambda-Ereignisquellenzuordnung befindet sich in einer anderen von Lambda AWS verwalteten VPC, getrennt von der VPC, die Ihre Funktion enthält.

Die [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md) ist die Zwischenressource zwischen dem MSK-Cluster und der Lambda-Funktion. Die Zuordnung von Ereignisquellen hat zwei Hauptaufgaben. Zunächst fragt sie Ihren MSK-Cluster nach neuen Nachrichten ab. Anschließend wird Ihre Lambda-Funktion mit diesen Nachrichten aufgerufen. Da sich diese drei Ressourcen unterscheiden VPCs, erfordern sowohl der Abruf- als auch der Aufrufvorgang VPC-übergreifende Netzwerkaufrufe.

Die Anforderungen an die Netzwerkkonfiguration für Ihre Zuordnung von Ereignisquellen hängen davon ab, ob der [Bereitstellungsmodus](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode) oder der On-Demand-Modus verwendet wird, wie im folgenden Diagramm dargestellt:

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/MSK-esm-network-overview.png)


Die Art und Weise, wie die Lambda-Zuordnung von Ereignisquellen Ihren MSK-Cluster nach neuen Nachrichten abfragt, ist in beiden Modi dieselbe. Um eine Verbindung zwischen Ihrer Zuordnung von Ereignisquellen und Ihrem MSK-Cluster herzustellen, erstellt Lambda in Ihrem privaten Subnetz eine [Hyperplane-ENI](configuration-vpc.md#configuration-vpc-enis) (oder verwendet eine vorhandene, falls verfügbar), um eine sichere Verbindung herzustellen. Wie im Diagramm dargestellt, verwendet diese Hyperplane-ENI die Subnetz- und Sicherheitsgruppenkonfiguration Ihres MSK-Clusters, nicht Ihre Lambda-Funktion.

Nachdem Sie die Nachricht vom Cluster abgerufen haben, ist die Art und Weise, wie Lambda Ihre Funktion aufruft, in jedem Modus unterschiedlich:
+ Im Bereitstellungsmodus verarbeitet Lambda automatisch die Verbindung zwischen der VPC für die Zuordnung von Ereignisquellen und der Funktions-VPC. Sie benötigen also keine zusätzlichen Netzwerkkomponenten, um Ihre Funktion erfolgreich aufzurufen.
+ Im On-Demand-Modus ruft Ihre Lambda-Zuordnung von Ereignisquellen Ihre Funktion über einen Pfad durch Ihre vom Kunden verwaltete VPC auf. Aus diesem Grund müssen Sie entweder ein [NAT-Gateway](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) im öffentlichen Subnetz Ihrer VPC oder [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html)-Endpunkte im privaten Subnetz der VPC konfigurieren, die Zugriff auf Lambda, [AWS -Security-Token-Service (STS)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html) und optional [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) bieten. Die korrekte Konfiguration einer dieser Optionen ermöglicht eine Verbindung zwischen Ihrer VPC und der von Lambda verwalteten Laufzeit-VPC, die zum Aufrufen Ihrer Funktion erforderlich ist.

Ein NAT-Gateway ermöglicht Ressourcen in Ihrem privaten Subnetz den Zugriff auf das öffentliche Internet. Wenn Sie diese Konfiguration verwenden, durchquert Ihr Datenverkehr das Internet, bevor die Lambda-Funktion aufgerufen wird. AWS PrivateLink Endpunkte ermöglichen es privaten Subnetzen, sich sicher mit AWS Diensten oder anderen privaten VPC-Ressourcen zu verbinden, ohne das öffentliche Internet zu durchqueren. Weitere Informationen zur Konfiguration dieser Ressourcen finden Sie unter [Konfiguration eines NAT-Gateways für eine MSK-Ereignisquelle](#msk-nat-gateway) oder [Konfiguration von AWS PrivateLink Endpunkten für eine MSK-Ereignisquelle](#msk-vpc-privatelink).

Bisher gingen wir davon aus, dass sich Ihr MSK-Cluster in einem privaten Subnetz innerhalb Ihrer VPC befindet, was der häufigste Fall ist. Selbst wenn sich Ihr MSK-Cluster in einem öffentlichen Subnetz innerhalb Ihrer VPC befindet, müssen Sie AWS PrivateLink -Endpunkte konfigurieren, um eine sichere Verbindung zu gewährleisten. In der folgenden Tabelle sind die Anforderungen an die Netzwerkkonfiguration zusammengefasst, je nachdem, wie Sie Ihren MSK-Cluster und die Lambda-Zuordnung von Ereignisquellen konfigurieren:


| Standort des MSK-Clusters (in der vom Kunden verwalteten VPC) | Skalierungsmodus der Lambda-Zuordnung von Ereignisquellen | Erforderliche Netzwerkkonfiguration | 
| --- | --- | --- | 
|  Privates Subnetz  |  On-Demand-Modus  |  NAT-Gateway (im öffentlichen Subnetz Ihrer VPC) oder AWS PrivateLink Endpoints (im privaten Subnetz Ihrer VPC), um den Zugriff auf Lambda und optional auf Secrets Manager zu ermöglichen. AWS STS  | 
|  Öffentliches Subnetz  |  On-Demand-Modus  |  AWS PrivateLink Endpunkte (im öffentlichen Subnetz Ihrer VPC), um den Zugriff auf Lambda und optional auf Secrets AWS STS Manager zu ermöglichen.  | 
|  Privates Subnetz  |  Modus bereitgestellter Kapazität  |  Keine  | 
|  Öffentliches Subnetz  |  Modus bereitgestellter Kapazität  |  Keine  | 

Darüber hinaus müssen die mit Ihrem MSK-Cluster verknüpften Sicherheitsgruppen den Datenverkehr über die richtigen Ports zulassen. Stellen Sie sicher, dass Sie die folgenden Regeln für Sicherheitsgruppen konfiguriert haben:
+ **Regeln für eingehenden Datenverkehr** – Erlauben Sie den gesamten Datenverkehr auf dem standardmäßigen Broker-Port. Der von MSK verwendete Port hängt vom Authentifizierungstyp des Clusters ab: `9098` für IAM-Authentifizierung, `9096` für SASL/SCRAM und `9094` für TLS. Alternativ können Sie eine selbstreferenzierende Regel für Sicherheitsgruppen verwenden, um den Zugriff von Instances innerhalb derselben Sicherheitsgruppe zuzulassen.
+ **Regeln für ausgehenden** Datenverkehr — Erlauben Sie den gesamten Datenverkehr über den Port `443` für externe Ziele, wenn Ihre Funktion mit anderen Diensten kommunizieren muss. AWS Alternativ können Sie eine selbstreferenzierende Sicherheitsgruppenregel verwenden, um den Zugriff auf den Broker einzuschränken, wenn Sie nicht mit anderen Diensten kommunizieren müssen. AWS 
+ **Regeln für eingehenden Datenverkehr auf Amazon-VPC-Endpunkten** – Wenn Sie einen Amazon-VPC-Endpunkt verwenden, muss die mit dem Endpunkt verbundene Sicherheitsgruppe eingehenden Datenverkehr auf Port `443` von der Sicherheitsgruppe des Clusters zulassen.

## Konfiguration eines NAT-Gateways für eine MSK-Ereignisquelle
<a name="msk-nat-gateway"></a>

Sie können ein NAT-Gateway so konfigurieren, dass Ihre Zuordnung von Ereignisquellen Nachrichten von Ihrem Cluster abfragen und die Funktion über einen Pfad durch Ihre VPC aufrufen kann. Dies ist nur erforderlich, wenn Ihre Zuordnung von Ereignisquellen den On-Demand-Modus verwendet und sich Ihr Cluster in einem privaten Subnetz Ihrer VPC befindet. Wenn sich Ihr Cluster in einem öffentlichen Subnetz Ihrer VPC befindet oder Ihre Zuordnung von Ereignisquellen den Bereitstellungsmodus verwendet, müssen Sie kein NAT-Gateway konfigurieren.

Ein [NAT-Gateway](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) ermöglicht Ressourcen in einem privaten Subnetz den Zugriff auf das öffentliche Internet. Wenn Sie eine private Verbindung zu Lambda benötigen, finden Sie stattdessen weitere Informationen unter [Konfiguration von AWS PrivateLink Endpunkten für eine MSK-Ereignisquelle](#msk-vpc-privatelink).

Nachdem Sie Ihr NAT-Gateway konfiguriert haben, müssen Sie die entsprechenden Routing-Tabellen konfigurieren. Dadurch kann der Datenverkehr aus Ihrem privaten Subnetz über das NAT-Gateway in das öffentliche Internet geleitet werden.

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/MSK-NAT-Gateway.png)


Die folgenden Schritte führen Sie durch die Konfiguration eines NAT-Gateways über die Konsole. Wiederholen Sie diese Schritte bei Bedarf für jede Availability Zone (AZ).

**So konfigurieren Sie ein NAT-Gateway und das richtige Routing (Konsole)**

1. Folgen Sie den Schritten unter [Erstellen eines NAT-Gateways](https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-working-with.html) und beachten Sie dabei Folgendes:
   + NAT-Gateways sollten sich immer in einem öffentlichen Subnetz befinden. Erstellen Sie NAT-Gateways mit [öffentlicher Konnektivität](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html).
   + Wenn Ihr MSK-Cluster über mehrere repliziert wird AZs, erstellen Sie ein NAT-Gateway pro AZ. In jeder AZ sollte Ihre VPC beispielsweise ein privates Subnetz mit Ihrem Cluster und ein öffentliches Subnetz mit Ihrem NAT-Gateway haben. Bei einem Setup mit drei AZs haben Sie drei private Subnetze, drei öffentliche Subnetze und drei NAT-Gateways.

1. Nachdem Sie Ihr NAT-Gateway erstellt haben, öffnen Sie die [Amazon VPC-Konsole](https://console.aws.amazon.com/vpc/) und wählen Sie im linken Menü **Routing-Tabellen** aus.

1. Klicken Sie auf **Create Route Table (Routing-Tabelle erstellen)**.

1. Ordnen Sie diese Routing-Tabelle der VPC zu, die Ihren MSK-Cluster enthält. Geben Sie optional einen Namen für Ihre Routing-Tabelle ein.

1. Klicken Sie auf **Create Route Table (Routing-Tabelle erstellen)**.

1. Wählen Sie die Routing-Tabelle aus, die Sie gerade erstellt haben.

1. Wählen Sie auf der Registerkarte **Subnetzzuordnungen** die Option **Subnetzzuordnungen bearbeiten** aus.
   + Ordnen Sie diese Routing-Tabelle dem privaten Subnetz zu, das Ihren MSK-Cluster enthält.

1. Wählen Sie **Routen bearbeiten** aus.

1. Wählen Sie **Route hinzufügen** aus:

   1. Geben Sie für **Ziel** die Zeichenfolge `0.0.0.0/0` an.

   1. Wählen Sie für **Ziel** die Option **NAT-Gateway** aus.

   1. Wählen Sie im Suchfeld das in Schritt 1 erstellte NAT-Gateway aus. Dies sollte das NAT-Gateway in derselben AZ sein wie das private Subnetz, das Ihren MSK-Cluster enthält (das private Subnetz, das Sie dieser Routing-Tabelle in Schritt 6 zugeordnet haben).

1. Wählen Sie **Änderungen speichern ** aus.

## Konfiguration von AWS PrivateLink Endpunkten für eine MSK-Ereignisquelle
<a name="msk-vpc-privatelink"></a>

Sie können AWS PrivateLink Endpoints so konfigurieren, dass sie Nachrichten von Ihrem Cluster abfragen, und die Funktion über einen Pfad durch Ihre VPC aufrufen. Diese Endpunkte sollten Ihrem MSK-Cluster den Zugriff auf Folgendes ermöglichen:
+ Den Lambda-Service
+ Den [AWS -Security-Token-Service (STS)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html)
+ Optional den [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)-Service. Dies ist erforderlich, wenn das für die Cluster-Authentifizierung erforderliche Secret im Secrets Manager gespeichert ist.

Die Konfiguration von PrivateLink Endpunkten ist nur erforderlich, wenn Ihre Ereignisquellenzuordnung den On-Demand-Modus verwendet. Wenn Ihre Zuordnung von Ereignisquellen den Bereitstellungsmodus verwendet, richtet Lambda die erforderlichen Verbindungen für Sie ein.

PrivateLink Endpunkte ermöglichen einen sicheren, privaten Zugriff auf AWS Dienste über. AWS PrivateLink Alternativ können Sie ein NAT-Gateway konfigurieren, um Ihrem MSK-Cluster Zugriff auf das öffentliche Internet zu ermöglichen (siehe [Konfiguration eines NAT-Gateways für eine MSK-Ereignisquelle](#msk-nat-gateway)).

Nachdem Sie Ihre VPC-Endpunkte konfiguriert haben, sollte Ihr MSK-Cluster direkten und privaten Zugriff auf Lambda, STS und optional Secrets Manager haben.

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/MSK-PrivateLink-Endpoints.png)


Die folgenden Schritte führen Sie durch die Konfiguration eines PrivateLink Endpunkts mithilfe der Konsole. Wiederholen Sie diese Schritte nach Bedarf für jeden Endpunkt (Lambda, STS, Secrets Manager).

**So konfigurieren Sie PrivateLink VPC-Endpunkte (Konsole)**

1. Öffnen Sie die [Amazon VPC-Konsole](https://console.aws.amazon.com/vpc/) und wählen Sie im linken Menü **Endpunkte** aus.

1. Wählen Sie **Endpunkt erstellen** aus.

1. Geben Sie optional einen Namen für Ihren Endpunkt ein.

1. Wählen Sie für **Typ** die Option **AWS -Services** aus.

1. Beginnen Sie unter **Services** mit der Eingabe des Namens des Service. Um beispielsweise einen Endpunkt für die Verbindung mit Lambda zu erstellen, geben Sie `lambda` in das Suchfeld ein.

1. In den Ergebnissen sollte der Service-Endpunkt in der aktuellen Region angezeigt werden. In der Region USA Ost (Nord-Virginia) sollte beispielsweise `com.amazonaws.us-east-2.lambda` angezeigt werden. Wählen Sie diesen Service aus.

1. Wählen Sie unter **Netzwerkeinstellungen** die VPC aus, die Ihren MSK-Cluster enthält.

1. Wählen Sie unter **Subnetze** das aus, in dem AZs sich Ihr MSK-Cluster befindet.
   + Wählen Sie für jede AZ unter **Subnetz-ID** das private Subnetz aus, das Ihren MSK-Cluster enthält.

1. Wählen Sie unter **Sicherheitsgruppen** die Ihrem MSK-Cluster zugeordneten Sicherheitsgruppen aus.

1. Wählen Sie **Endpunkt erstellen** aus.

Standardmäßig verfügen Amazon VPC-Endpunkte über offene IAM-Richtlinien, die einen umfassenden Zugriff auf Ressourcen ermöglichen. Es empfiehlt sich, diese Richtlinien auf die Durchführung der erforderlichen Aktionen über diesen Endpunkt zu beschränken. Für Ihren Secrets-Manager-Endpunkt können Sie beispielsweise dessen Richtlinie so ändern, dass nur die Ausführungsrolle Ihrer Funktion auf das Secret zugreifen kann.

**Example VPC-Endpunktrichtlinie – Secrets-Manager-Endpunkt**  

```
{
    "Statement": [
        {
            "Action": "secretsmanager:GetSecretValue",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws::iam::123456789012:role/my-role"
                ]
            },
            "Resource": "arn:aws::secretsmanager:us-west-2:123456789012:secret:my-secret"
        }
    ]
}
```

Für die AWS STS und Lambda-Endpunkte können Sie den aufrufenden Principal auf den Lambda-Serviceprinzipal beschränken. Stellen Sie jedoch sicher, dass Sie in diesen Richtlinien `"Resource": "*"` verwenden.

**Example VPC-Endpunktrichtlinie — AWS STS Endpunkt**  

```
{
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com"
                ]
            },
            "Resource": "*"
        }
    ]
}
```

**Example VPC-Endpunktrichtlinie – Lambda-Endpunkt**  

```
{
    "Statement": [
        {
            "Action": "lambda:InvokeFunction",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com"
                ]
            },
            "Resource": "*"
        }
    ]
}
```

# Konfiguration von Lambda-Berechtigungen für Amazon MSK-Ereignisquellenzuordnungen
<a name="with-msk-permissions"></a>

Um auf den Amazon-MSK-Cluster zugreifen zu können, benötigen Ihre Funktion und Zuordnung von Ereignisquellen Berechtigungen zum Ausführen verschiedener Amazon-MSK-API-Aktionen. Fügen Sie diese Berechtigungen zur [Ausführungsrolle](lambda-intro-execution-role.md) der Funktion hinzu. Wenn Ihre Benutzer Zugriff benötigen, fügen Sie die erforderlichen Berechtigungen zur Identitätsrichtlinie für Benutzer oder Rolle hinzu.

Die Richtlinie „[AWSLambdaMSKExecutionRollenverwaltung](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaMSKExecutionRole.html)“ enthält die erforderlichen Mindestberechtigungen für Amazon MSK Lambda-Ereignisquellenzuordnungen. Um den Genehmigungsprozess zu vereinfachen, können Sie:
+ Fügen Sie Ihrer [AWSLambdaMSKExecutionAusführungsrolle die Richtlinie „Rollenverwaltete](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaMSKExecutionRole.html) Verwaltung“ hinzu.
+ Lassen Sie die Lambda-Konsole die Berechtigungen für Sie generieren. Wenn Sie [eine Amazon MSK-Ereignisquellenzuordnung in der Konsole erstellen](msk-esm-create.md#msk-console), bewertet Lambda Ihre Ausführungsrolle und warnt Sie, wenn Berechtigungen fehlen. Wählen Sie **Berechtigungen generieren**, um Ihre Ausführungsrolle automatisch zu aktualisieren. Dies funktioniert nicht, wenn Sie Ihre Richtlinien für Ausführungsrollen manuell erstellt oder geändert haben oder wenn die Richtlinien mehreren Rollen zugeordnet sind. Beachten Sie, dass für Ihre Ausführungsrolle möglicherweise weiterhin zusätzliche Berechtigungen erforderlich sind, wenn Sie erweiterte Funktionen wie [On-Failure Destination](kafka-on-failure.md) oder [AWS Glue Schema Registry](services-consume-kafka-events.md) verwenden.

**Topics**
+ [

## Erforderliche Berechtigungen
](#msk-required-permissions)
+ [

## Optionale Berechtigungen
](#msk-optional-permissions)

## Erforderliche Berechtigungen
<a name="msk-required-permissions"></a>

Ihre Lambda-Funktionsausführungsrolle muss über die folgenden erforderlichen Berechtigungen für Amazon MSK-Ereignisquellenzuordnungen verfügen. [Diese Berechtigungen sind in der Richtlinie „Rollenverwaltung“ enthalten. AWSLambda MSKExecution](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaMSKExecutionRole.html)

### CloudWatch Protokolliert Berechtigungen
<a name="msk-basic-permissions"></a>

Die folgenden Berechtigungen ermöglichen es Lambda, Protokolle in Amazon CloudWatch Logs zu erstellen und zu speichern.
+ [Protokolle: CreateLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html)
+ [Protokolle: CreateLogStream](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogStream.html)
+ [Protokolle: PutLogEvents](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html)

### MSK-Cluster-Berechtigungen
<a name="msk-cluster-permissions"></a>

Die folgenden Berechtigungen ermöglichen Lambda, in Ihrem Namen auf Ihren Amazon MSK-Cluster zuzugreifen:
+ [Kafka: DescribeCluster](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn.html)
+ [Kafka: V2 DescribeCluster](https://docs.aws.amazon.com/MSK/2.0/APIReference/v2-clusters-clusterarn.html)
+ [Kafka: GetBootstrapBrokers](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn-bootstrap-brokers.html)

Wir empfehlen die Verwendung von [kafka: DescribeCluster V2](https://docs.aws.amazon.com/MSK/2.0/APIReference/v2-clusters-clusterarn.html) anstelle von [kafka](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn.html):. DescribeCluster Die v2-Berechtigung funktioniert sowohl mit bereitgestellten als auch mit serverlosen Amazon MSK-Clustern. In Ihrer Richtlinie benötigen Sie nur eine dieser Berechtigungen.

### VPC-Berechtigungen
<a name="msk-vpc-permissions"></a>

Die folgenden Berechtigungen ermöglichen es Lambda, Netzwerkschnittstellen zu erstellen und zu verwalten, wenn eine Verbindung zu Ihrem Amazon MSK-Cluster hergestellt wird:
+ [ec2: CreateNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html)
+ [ec2: DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)
+ [ec2: DescribeVpcs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html)
+ [ec2: DeleteNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterface.html)
+ [ec2: DescribeSubnets](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html)
+ [ec2: DescribeSecurityGroups](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)

## Optionale Berechtigungen
<a name="msk-optional-permissions"></a>

 Ihre Lambda-Funktion benötigt möglicherweise auch Berechtigungen für Folgendes: 
+ Greifen Sie auf kontenübergreifende Amazon MSK-Cluster zu. Für kontenübergreifende Zuordnungen von Ereignisquellen benötigen Sie [kafka](https://docs.aws.amazon.com/msk/1.0/apireference/vpc-connection-arn.html): in der Ausführungsrolle. DescribeVpcConnection [Ein IAM-Prinzipal, der eine kontenübergreifende Zuordnung von Ereignisquellen erstellt, benötigt kafka:. ListVpcConnections](https://docs.aws.amazon.com/msk/1.0/apireference/vpc-connections.html)
+ Greifen Sie auf Ihr SCRAM-Secret zu, wenn Sie die [SASL/SCRAM-Authentifizierung](msk-cluster-auth.md#msk-sasl-scram) verwenden. Dadurch kann Ihre Funktion einen Benutzernamen und ein Passwort verwenden, um eine Verbindung zu Kafka herzustellen.
+ Beschreiben Sie Ihr Secrets Manager-Geheimnis, falls Sie die SASL/SCRAM [mTLS-Authentifizierung](msk-cluster-auth.md#msk-mtls) verwenden. Dadurch kann Ihre Funktion die für sichere Verbindungen erforderlichen Anmeldeinformationen oder Zertifikate abrufen.
+ Greifen Sie auf Ihren vom AWS KMS Kunden verwalteten Schlüssel zu, wenn Ihr AWS Secrets Manager Geheimnis mit einem vom AWS KMS Kunden verwalteten Schlüssel verschlüsselt ist.
+ Greifen Sie auf Ihre Schemaregistrierungs-Secrets zu, wenn Sie eine Schemaregistrierung mit Authentifizierung verwenden:
  + Für AWS Glue Schema Registry: Ihre Funktionsanforderungen `glue:GetRegistry` und `glue:GetSchemaVersion` Berechtigungen. Dadurch kann Ihre Funktion die in AWS Glue gespeicherten Nachrichtenformatregeln nachschlagen und verwenden.
  + Für [Confluent Schema Registry](https://docs.confluent.io/platform/current/schema-registry/security/index.html) mit `BASIC_AUTH` oder`CLIENT_CERTIFICATE_TLS_AUTH`: Ihre Funktion benötigt die Berechtigung `secretsmanager:GetSecretValue` für das Secret, das die Authentifizierungsdaten enthält. Auf diese Weise kann Ihre Funktion die Oder-Zertifikate abrufen, die username/password für den Zugriff auf die Confluent Schema Registry erforderlich sind.
  + Für private CA-Zertifikate: Ihre Funktion benötigt die GetSecretValue Berechtigung secretsmanager: für das Secret, das das Zertifikat enthält. Dadurch kann Ihre Funktion die Identität von Schemaregistrierungen überprüfen, die benutzerdefinierte Zertifikate verwenden.
+ Greifen Sie auf Kafka-Cluster-Nutzergruppen und Abfragemeldungen aus dem Thema zu, wenn Sie die IAM-Authentifizierung für die Zuordnung der Ereignisquellen verwenden.

 Diese entsprechen den folgenden erforderlichen Berechtigungen: 
+ [kafka: ListScramSecrets](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn-scram-secrets.html) — Ermöglicht die Auflistung von SCRAM-Geheimnissen für die Kafka-Authentifizierung
+ [secretsmanager: GetSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) - Ermöglicht das Abrufen von Geheimnissen aus Secrets Manager
+ [kms:Decrypt — Ermöglicht die Entschlüsselung verschlüsselter Daten mit](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) AWS KMS
+ [glue: GetRegistry](https://docs.aws.amazon.com/glue/latest/webapi/API_GetRegistry.html) - Ermöglicht den Zugriff auf die Schemaregistrierung AWS Glue 
+ [glue: GetSchemaVersion](https://docs.aws.amazon.com/glue/latest/webapi/API_GetSchemaVersion.html) - Ermöglicht das Abrufen bestimmter Schemaversionen aus der AWS Glue Schemaregistry
+ [kafka-cluster:Connect — Erteilt die Erlaubnis, eine Verbindung](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html) zum Cluster herzustellen und sich dort zu authentifizieren
+ [kafka-cluster: AlterGroup](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html) - Erteilt die Erlaubnis, Gruppen in einem Cluster beizutreten, was der READ GROUP-ACL von Apache Kafka entspricht
+ [kafka-cluster: DescribeGroup](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html) - Erteilt die Erlaubnis, Gruppen in einem Cluster zu beschreiben, was der DESCRIBE GROUP-ACL von Apache Kafka entspricht
+ [kafka-cluster: DescribeTopic](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html) - Erteilt die Erlaubnis, Themen in einem Cluster zu beschreiben, was der DESCRIBE TOPIC-ACL von Apache Kafka entspricht
+ [kafka-cluster: ReadData](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html) - Erteilt die Berechtigung, Daten aus Themen in einem Cluster zu lesen, was der READ TOPIC-ACL von Apache Kafka entspricht

 Wenn Sie außerdem Aufzeichnungen fehlgeschlagener Aufrufe an ein Ziel für Fehlerfälle senden möchten, benötigen Sie je nach Zieltyp die folgenden Berechtigungen: 
+ Für Amazon SQS SQS-Ziele: [sqs: SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html) — Ermöglicht das Senden von Nachrichten an eine Amazon SQS SQS-Warteschlange
+ Für Amazon-SNS-Ziele: [sns:Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html) – erlaubt die Veröffentlichung von Nachrichten zu einem Amazon-SNS-Thema
+ Für Amazon S3 S3-Bucket-Ziele: [s3: PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) und [s3: ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucket.html) — Ermöglicht das Schreiben und Auflisten von Objekten in einem Amazon S3 S3-Bucket

Informationen zur Behebung von Authentifizierungs- und Autorisierungsfehlern finden Sie unter [Fehlerbehebung bei der Kafka-Zuordnung von Ereignisquellen](with-kafka-troubleshoot.md).

# Konfigurieren von Amazon MSK-Ereignisquellen für Lambda
<a name="with-msk-configure"></a>

Um einen selbstverwalteten Amazon-MSK-Cluster als Ereignisquelle für Ihre Lambda-Funktion zu verwenden, erstellen Sie eine [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md), die die beiden Ressourcen miteinander verbindet. Auf dieser Seite wird beschrieben, wie Sie eine Zuordnung von Ereignisquellen für Amazon MSK erstellen.

Auf dieser Seite wird davon ausgegangen, dass Sie Ihren MSK-Cluster und die [Amazon Virtual Private Cloud (VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html), in der er sich befindet, bereits ordnungsgemäß konfiguriert haben. Wenn Sie Ihren Cluster oder Ihre VPC einrichten müssen, finden Sie entsprechende Informationen unter [Konfiguration Ihres Amazon-MSK-Clusters und Ihres Amazon-VPC-Netzwerks für Lambda](with-msk-cluster-network.md). Informationen zum Konfigurieren des Wiederholungsverhaltens für die Fehlerbehandlung finden Sie unter[Konfiguration der Fehlerbehandlungssteuerungen für Kafka-Ereignisquellen](kafka-retry-configurations.md).

**Topics**
+ [

## Verwenden eines Amazon MSK-Clusters als Ereignisquelle
](#msk-esm-overview)
+ [

# Konfiguration von Amazon MSK-Cluster-Authentifizierungsmethoden in Lambda
](msk-cluster-auth.md)
+ [

# Erstellen einer Lambda-Zuordnung von Ereignisquellen für eine Amazon-MSK-Ereignisquelle
](msk-esm-create.md)
+ [

# Erstellen von kontenübergreifenden Zuordnungen von Ereignisquellen in Lambda
](msk-cross-account.md)
+ [

# Alle Amazon-MSK-Konfigurationsparameter von Ereignisquellen in Lambda
](msk-esm-parameters.md)

## Verwenden eines Amazon MSK-Clusters als Ereignisquelle
<a name="msk-esm-overview"></a>

Wenn Sie Ihren Apache Kafka-Cluster oder Amazon MSK als Auslöser für Ihre Lambda-Funktion hinzufügen, wird der Cluster als [Ereignisquelle](invocation-eventsourcemapping.md) verwendet.

Lambda liest Ereignisdaten aus den Kafka-Themen, die Sie wie `Topics` in einer [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)Anfrage angeben, basierend auf der von Ihnen angegebenen [Startposition](kafka-starting-positions.md). Nach erfolgreicher Verarbeitung wird Ihr Kafka-Thema Ihrem Kafka-Cluster zugeordnet.

Lambda liest Nachrichten sequentiell für jede Kafka-Themenpartition. Eine einzelne Lambda-Nutzlast kann Nachrichten von mehreren Partitionen enthalten. Wenn mehr Datensätze verfügbar sind, setzt Lambda die Verarbeitung von Datensätzen stapelweise fort, basierend auf dem BatchSize Wert, den Sie in einer [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)Anfrage angeben, bis Ihre Funktion das Thema eingeholt hat.

Nachdem Lambda jeden Batch verarbeitet hat, werden die Offsets der Nachrichten in diesem Batch festgeschrieben. Wenn Ihre Funktion einen Fehler für eine der Nachrichten in einem Batch zurückgibt, wiederholt Lambda den gesamten Nachrichtenbatch, bis die Verarbeitung erfolgreich ist oder die Nachrichten ablaufen. Sie können Datensätze, bei denen alle Wiederholungsversuche fehlschlagen, zur späteren Verarbeitung an ein Ausfallziel senden.

**Anmerkung**  
Während Lambda-Funktionen in der Regel ein maximales Timeout-Limit von 15 Minuten haben, unterstützen Ereignisquellenzuordnungen für Amazon MSK, selbstverwaltetes Apache Kafka, Amazon DocumentDB, Amazon MQ für ActiveMQ und RabbitMQ nur Funktionen mit einem maximalen Timeout-Limit von 14 Minuten.

# Konfiguration von Amazon MSK-Cluster-Authentifizierungsmethoden in Lambda
<a name="msk-cluster-auth"></a>

Lambda benötigt eine Berechtigung, um auf Ihren Amazon-MSK-Cluster zuzugreifen, Datensätze abzurufen und andere Aufgaben auszuführen. Amazon MSK unterstützt mehrere Methoden zur Authentifizierung bei Ihrem MSK-Cluster.

**Topics**
+ [

## Nicht authentifizierter Zugriff
](#msk-unauthenticated)
+ [

## SASL/SCRAM-Authentifizierung
](#msk-sasl-scram)
+ [

## Gegenseitige TLS-Authentifizierung
](#msk-mtls)
+ [

## IAM-Authentifizierung
](#msk-iam-auth)
+ [

## So wählt Lambda einen Bootstrap-Broker
](#msk-bootstrap-brokers)

## Nicht authentifizierter Zugriff
<a name="msk-unauthenticated"></a>

Wenn keine Clients über das Internet auf den Cluster zugreifen, können Sie einen nicht authentifizierten Zugriff verwenden.

## SASL/SCRAM-Authentifizierung
<a name="msk-sasl-scram"></a>

Lambda unterstützt die [Authentifizierung Simple Authentication und Security Layer/Salted Challenge Response Authentication Mechanism (SASL/SCRAM)](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password-tutorial.html) mit der SHA-512-Hash-Funktion und der Transport Layer Security (TLS) -Verschlüsselung. Damit Lambda eine Verbindung zum Cluster herstellen kann, speichern Sie die Authentifizierungsanmeldeinformationen (Benutzername und Passwort) in einem Secrets-Manager-Geheimnis und verweisen Sie bei der Konfiguration Ihrer Zuordnung von Ereignisquellen auf dieses Geheimnis.

Weitere Informationen zur Verwendung von Secrets Manager finden Sie unter [Authentifizierung der Anmeldeinformationen mit Secrets Manager](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html) im *Entwicklerhandbuch für Amazon Managed Streaming for Kafka*.

**Anmerkung**  
Amazon MSK unterstützt keine SASL/PLAIN Authentifizierung.

## Gegenseitige TLS-Authentifizierung
<a name="msk-mtls"></a>

Gegenseitige TLS (mTLS) bietet eine bidirektionale Authentifizierung zwischen Client und Server. Der Client sendet ein Zertifikat an den Server, damit dieser den Client überprüfen kann. Der Server sendet ebenfalls ein Zertifikat an den Client, damit dieser den Server überprüfen kann.

Bei Amazon-MSK-Integrationen mit Lambda fungiert Ihr MSK-Cluster als Server und Lambda als Client.
+ Damit Lambda Ihren MSK-Cluster überprüfen kann, konfigurieren Sie ein Client-Zertifikat als Geheimnis in Secrets Manager und verweisen Sie in Ihrer Konfiguration der Zuordnung von Ereignisquellen auf dieses Zertifikat. Das Clientzertifikat muss von einer Zertifizierungsstelle (CA) im Trust Store des Servers signiert sein.
+ Der MSK-Cluster sendet auch ein Serverzertifikat an Lambda. Das Serverzertifikat muss von einer Zertifizierungsstelle (CA) im AWS Trust Store signiert werden.

Amazon MSK unterstützt keine selbstsignierten Serverzertifikate. Alle Broker in Amazon MSK verwenden [öffentliche Zertifikate](https://docs.aws.amazon.com/msk/latest/developerguide/msk-encryption.html), die von [Amazon Trust Services](https://www.amazontrust.com/repository/) signiert wurden CAs, denen Lambda standardmäßig vertraut.

### Konfigurieren des mTLS-Secrets
<a name="mtls-auth-secret"></a>

Das Secret CLIENT\$1CERTIFICATE\$1TLS\$1AUTH erfordert ein Zertifikatfeld und ein Feld für einen privaten Schlüssel. Für einen verschlüsselten privaten Schlüssel erfordert das Secret ein Passwort für den privaten Schlüssel. Sowohl das Zertifikat als auch der private Schlüssel müssen im PEM-Format vorliegen.

**Anmerkung**  
Lambda unterstützt die Verschlüsselungsalgorithmen mit privaten Schlüsseln [PBES1](https://datatracker.ietf.org/doc/html/rfc2898/#section-6.1)(aber nicht PBES2).

Das Zertifikatfeld muss eine Liste von Zertifikaten enthalten, beginnend mit dem Client-Zertifikat, gefolgt von etwaigen Zwischenzertifikaten und endend mit dem Root-Zertifikat. Jedes Zertifikat muss in einer neuen Zeile mit der folgenden Struktur beginnen:

```
-----BEGIN CERTIFICATE-----  
        <certificate contents>
-----END CERTIFICATE-----
```

Secrets Manager unterstützt Secrets von bis zu 65 536 Bytes, was genügend Platz für lange Zertifikatsketten bietet.

Der private Schlüssel muss im Format [PKCS \$18](https://datatracker.ietf.org/doc/html/rfc5208) mit folgender Struktur vorliegen:

```
-----BEGIN PRIVATE KEY-----  
         <private key contents>
-----END PRIVATE KEY-----
```

Verwenden Sie für einen verschlüsselten privaten Schlüssel die folgende Struktur:

```
-----BEGIN ENCRYPTED PRIVATE KEY-----  
          <private key contents>
-----END ENCRYPTED PRIVATE KEY-----
```

Im folgenden Beispiel sehen Sie den Inhalt eines Secrets für mTLS-Authentifizierung mit einem verschlüsselten privaten Schlüssel. Fügen Sie für einen verschlüsselten privaten Schlüssel das Passwort für den privaten Schlüssel in das Secret ein.

```
{
 "privateKeyPassword": "testpassword",
 "certificate": "-----BEGIN CERTIFICATE-----
MIIE5DCCAsygAwIBAgIRAPJdwaFaNRrytHBto0j5BA0wDQYJKoZIhvcNAQELBQAw
...
j0Lh4/+1HfgyE2KlmII36dg4IMzNjAFEBZiCRoPimO40s1cRqtFHXoal0QQbIlxk
cmUuiAii9R0=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFgjCCA2qgAwIBAgIQdjNZd6uFf9hbNC5RdfmHrzANBgkqhkiG9w0BAQsFADBb
...
rQoiowbbk5wXCheYSANQIfTZ6weQTgiCHCCbuuMKNVS95FkXm0vqVD/YpXKwA/no
c8PH3PSoAaRwMMgOSA2ALJvbRz8mpg==
-----END CERTIFICATE-----",
 "privateKey": "-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFKzBVBgkqhkiG9w0BBQ0wSDAnBgkqhkiG9w0BBQwwGgQUiAFcK5hT/X7Kjmgp
...
QrSekqF+kWzmB6nAfSzgO9IaoAaytLvNgGTckWeUkWn/V0Ck+LdGUXzAC4RxZnoQ
zp2mwJn2NYB7AZ7+imp0azDZb+8YG2aUCiyqb6PnnA==
-----END ENCRYPTED PRIVATE KEY-----"
}
```

Weitere Informationen zu mTLS für Amazon MSK und Anweisungen zum Generieren eines Clientzertifikats finden Sie unter [Gegenseitige TLS-Authentifizierung für Amazon MSK](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html) im *Entwicklerhandbuch für Amazon Managed Streaming for Apache Kafka*.

## IAM-Authentifizierung
<a name="msk-iam-auth"></a>

Sie können AWS Identity and Access Management (IAM) verwenden, um die Identität von Clients zu authentifizieren, die eine Verbindung zum MSK-Cluster herstellen. Bei der IAM-Authentifizierung nutzt Lambda die Berechtigungen in der [Ausführungsrolle](lambda-intro-execution-role.md) Ihrer Funktion, um eine Verbindung zum Cluster herzustellen, Datensätze abzurufen und andere erforderliche Aktionen auszuführen. Ein Beispiel für eine Richtlinie, welche die erforderlichen Berechtigungen enthält, finden Sie unter [Erstellen von Autorisierungsrichtlinien für die IAM-Rolle](https://docs.aws.amazon.com/msk/latest/developerguide/create-iam-access-control-policies.html) im *Entwicklerhandbuch für Amazon Managed Streaming for Apache Kafka*.

Wenn die IAM-Authentifizierung für Ihren MSK-Cluster aktiv ist und Sie kein Geheimnis angeben, verwendet Lambda automatisch standardmäßig die IAM-Authentifizierung.

Weitere Informationen zur IAM-Authentifizierung in Amazon MSK finden Sie unter [IAM-Zugriffskontrolle](https://docs.aws.amazon.com/msk/latest/developerguide/iam-access-control.html).

## So wählt Lambda einen Bootstrap-Broker
<a name="msk-bootstrap-brokers"></a>

Lambda wählt einen [Bootstrap-Broker](https://docs.aws.amazon.com/msk/latest/developerguide/msk-get-bootstrap-brokers.html) basierend auf den auf Ihrem Cluster verfügbaren Authentifizierungsmethoden aus und ob Sie ein Geheimnis für die Authentifizierung angeben.. Wenn Sie ein Geheimnis für MTLs oder SASL/SCRAM angeben, wählt Lambda automatisch diese Authentifizierungsmethode. Wenn Sie kein Geheimnis angeben, wählt Lambda die stärkste Authentifizierungsmethode aus, die in Ihrem Cluster aktiv ist. Im Folgenden ist die Reihenfolge der Priorität aufgeführt, in der Lambda einen Broker auswählt, von der stärksten zur schwächsten Authentifizierung:
+ mTLS (Geheimnis für mTLS bereitgestellt)
+ SASL/SCRAM (secret provided for SASL/SCRAM)
+ SASL IAM (kein Geheimnis angegeben und IAM-Authentifizierung aktiv)
+ Nicht authentifiziertes TLS (kein Geheimnis bereitgestellt und IAM-Authentifizierung nicht aktiv)
+ Klartext (kein Geheimnis angegeben und sowohl IAM-Authentifizierung als auch nicht authentifiziertes TLS sind nicht aktiv)

**Anmerkung**  
Wenn Lambda keine Verbindung zum sichersten Brokertyp herstellen kann, versucht Lambda nicht, eine Verbindung zu einem anderen (schwächeren) Brokertyp herzustellen. Wenn Sie möchten, dass Lambda einen schwächeren Brokertyp wählt, deaktivieren Sie alle stärkeren Authentifizierungsmethoden in Ihrem Cluster.

# Erstellen einer Lambda-Zuordnung von Ereignisquellen für eine Amazon-MSK-Ereignisquelle
<a name="msk-esm-create"></a>

Zum Erstellen einer Zuordnung von Ereignisquellen können Sie die Lambda-Konsole, die [AWS Command Line Interface (CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) oder ein [AWS SDK](https://aws.amazon.com/getting-started/tools-sdks/) verwenden.

**Anmerkung**  
Wenn Sie die Zuordnung von Ereignisquellen erstellen, erstellt Lambda eine [Hyperplane-ENI](configuration-vpc.md#configuration-vpc-enis) im privaten Subnetz, das Ihren MSK-Cluster enthält, sodass Lambda eine sichere Verbindung herstellen kann. Diese Hyperplane-ENI ermöglicht die Verwendung der Subnetz- und Sicherheitsgruppenkonfiguration Ihres MSK-Clusters, nicht Ihrer Lambda-Funktion.

Mit den folgenden Schritten in der Konsole fügen Sie einen Amazon-MSK-Cluster als Auslöser für Ihre Lambda-Funktion hinzu. Im Hintergrund wird dadurch eine Zuordnung von Ereignisquellen erstellt.

**So fügen Sie Ihrer Lambda-Funktion (Konsole) einen Amazon MSK-Trigger hinzu**

1. Öffnen Sie die Seite [Funktion](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie den Namen der Lambda-Funktion aus, der Sie einen Amazon-MSK-Auslöser hinzufügen möchten.

1. Wählen Sie unter **Function overview (Funktionsübersicht)** die Option **Add trigger (Trigger hinzufügen)**.

1. Wählen Sie unter **Auslöser-Konfiguration** die Option **MSK** aus.

1. Führen Sie die folgenden Schritte aus, um Ihre Kafka-Cluster-Details anzugeben:

   1. Wählen Sie für **MSK-Cluster** Ihren Cluster aus.

   1. Geben Sie für **Themenname** den Namen des Kafka-Themas ein, von dem Nachrichten verbraucht werden sollen.

   1. Geben Sie für **Verbrauchergruppen-ID** ggf. die ID einer Kafka-Verbrauchergruppe ein, der Sie beitreten möchten. Weitere Informationen finden Sie unter [Anpassbare Verbrauchergruppen-ID in Lambda](kafka-consumer-group-id.md).

1. Nehmen Sie für die **Cluster-Authentifizierung** die erforderlichen Konfigurationen vor. Weitere Informationen über Cluster-Authentifizierung finden Sie unter [Konfiguration von Amazon MSK-Cluster-Authentifizierungsmethoden in Lambda](msk-cluster-auth.md).
   + Aktivieren Sie **Authentifizierung verwenden**, wenn Lambda beim Verbindungsaufbau die Authentifizierung bei Ihrem MSK-Cluster durchführen soll. Die Authentifizierung wird empfohlen.
   + Wenn Sie Authentifizierung verwenden, wählen Sie für **Authentifizierungsmethode** die zu verwendende Authentifizierungsmethode aus.
   + Wenn Sie Authentifizierung verwenden, wählen Sie für **Secrets-Manager-Schlüssel** den Secrets-Manager-Schlüssel aus, der die für den Zugriff auf Ihren Cluster erforderlichen Authentifizierungsanmeldeinformationen enthält.

1. Nehmen Sie unter **Konfiguration des Ereignis-Pollers** die erforderlichen Konfigurationen vor.
   + Wählen Sie **Auslöser aktivieren**, um den Auslöser unmittelbar nach der Erstellung zu aktivieren.
   + Wählen Sie aus, ob Sie den **Bereitstellungsmodus** für Ihre Zuordnung von Ereignisquellen konfigurieren möchten. Weitere Informationen finden Sie unter [Skalierungsmodi des Ereignis-Pollers von Apache Kafka in Lambda](kafka-scaling-modes.md).
     + Wenn Sie den Bereitstellungsmodus konfigurieren, geben Sie einen Wert für **Minimale Anzahl von Ereignisabfragen**, einen Wert für **Maximale Anzahl von Ereignisabfragen** und einen optionalen Wert ein, PollerGroupName um die Gruppierung mehrerer ESMs innerhalb derselben Ereignisquellen-VPC anzugeben.
   + Wählen Sie unter **Startposition** aus, wie Lambda mit dem Lesen aus Ihrem Stream beginnen soll. Weitere Informationen finden Sie unter [Apache-Kafka-Abfrage und Stream-Startpositionen in Lambda](kafka-starting-positions.md).

1. Nehmen Sie unter **Batching** die erforderlichen Konfigurationen vor. Weitere Informationen zu Batching finden Sie unter [Batching-Verhalten](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

   1. Geben Sie für **Batchgröße** die maximale Anzahl von Nachrichten ein, die in einem einzelnen Batch empfangen werden sollen.

   1. Geben Sie für **Batch-Fenster** die maximale Zeit in Sekunden ein, die Lambda mit dem Sammeln von Datensätzen verbringt, bevor die Funktion aufgerufen wird.

1. Nehmen Sie unter **Filterung** die erforderlichen Konfigurationen vor. Weitere Informationen zur Filterung erhalten Sie unter [Filtern von Ereignissen aus Amazon MSK und selbstverwalteten Apache-Kafka-Ereignisquellen](kafka-filtering.md).
   + Fügen Sie unter **Filterkriterien** Definitionen für Filterkriterien hinzu, um zu bestimmen, ob ein Ereignis verarbeitet werden soll oder nicht.

1. Nehmen Sie unter **Fehlerbehandlung** die erforderlichen Konfigurationen vor. Weitere Informationen zur Fehlerbehandlung finden Sie unter [Erfassen verworfener Batches für Amazon MSK und selbstverwaltete Apache-Kafka-Ereignisquellen](kafka-on-failure.md).
   + Geben Sie für **Fehlerziel** den ARN Ihres Fehlerziels an.

1. Geben Sie unter **Tags** die Tags ein, die dieser Zuordnung von Ereignisquellen zugeordnet werden sollen.

1. Wählen Sie **hinzufügen** aus, um den Auslöser zu erstellen.

Sie können die Ereignisquellenzuordnung auch mithilfe der AWS CLI mit dem [ create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)Befehl erstellen. Im folgenden Beispiel wird eine Zuordnung von Ereignisquellen erstellt, um die Lambda-Funktion `my-msk-function` ab der `LATEST`-Nachricht dem `AWSKafkaTopic`-Thema zuzuordnen. Dieser Befehl verwendet das [SourceAccessConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_SourceAccessConfiguration.html)Objekt auch, um Lambda anzuweisen, bei der Verbindung mit dem Cluster die [SASL/SCRAM-Authentifizierung](msk-cluster-auth.md#msk-sasl-scram) zu verwenden.

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:cluster/my-cluster/fc2f5bdf-fd1b-45ad-85dd-15b4a5a6247e-2 \
  --topics AWSKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function
  --source-access-configurations '[{"Type": "SASL_SCRAM_512_AUTH","URI": "arn:aws:secretsmanager:us-east-1:111122223333:secret:my-secret"}]'
```

Wenn der Cluster [mTLS-Authentifizierung verwendet](msk-cluster-auth.md#msk-mtls), fügen Sie ein [SourceAccessConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_SourceAccessConfiguration.html)Objekt hinzu, das einen Secrets Manager Manager-Schlüssel-ARN spezifiziert`CLIENT_CERTIFICATE_TLS_AUTH`. Das wird im folgenden Befehl veranschaulicht:

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:cluster/my-cluster/fc2f5bdf-fd1b-45ad-85dd-15b4a5a6247e-2 \
  --topics AWSKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function
  --source-access-configurations '[{"Type": "CLIENT_CERTIFICATE_TLS_AUTH","URI": "arn:aws:secretsmanager:us-east-1:111122223333:secret:my-secret"}]'
```

Wenn der Cluster die [IAM-Authentifizierung](msk-cluster-auth.md#msk-iam-auth) verwendet, benötigen Sie kein [ SourceAccessConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_SourceAccessConfiguration.html)Objekt. Das wird im folgenden Befehl veranschaulicht:

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:cluster/my-cluster/fc2f5bdf-fd1b-45ad-85dd-15b4a5a6247e-2 \
  --topics AWSKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function
```

# Erstellen von kontenübergreifenden Zuordnungen von Ereignisquellen in Lambda
<a name="msk-cross-account"></a>

Sie können [private Multi-VPC-Konnektivität](https://docs.aws.amazon.com/msk/latest/developerguide/aws-access-mult-vpc.html) verwenden, um eine Lambda-Funktion mit einem bereitgestellten MSK-Cluster in einem anderen AWS-Konto zu verbinden. Multi-VPC-Konnektivität verwendet AWS PrivateLink, wodurch der gesamte Datenverkehr im AWS Netzwerk bleibt.

**Anmerkung**  
Sie können keine kontenübergreifenden Zuordnungen von Ereignisquellen für Serverless-MSK-Cluster erstellen.

Um eine kontenübergreifende Zuordnung von Ereignisquellen zu erstellen, müssen Sie zunächst die [Multi-VPC-Konnektivität für den MSK-Cluster konfigurieren](https://docs.aws.amazon.com/msk/latest/developerguide/aws-access-mult-vpc.html#mvpc-cluster-owner-action-turn-on). Verwenden Sie beim Erstellen der Zuordnung von Ereignisquellen den ARN der verwalteten VPC-Verbindung anstelle des Cluster-ARNs, wie in den folgenden Beispielen gezeigt. Der [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)Vorgang unterscheidet sich auch je nachdem, welchen Authentifizierungstyp der MSK-Cluster verwendet.

**Example – Erstellen Sie eine kontoübergreifende Zuordnung von Ereignisquellen für einen Cluster, der die IAM-Authentifizierung verwendet**  
Wenn der Cluster die [rollenbasierte IAM-Authentifizierung verwendet, benötigen](msk-cluster-auth.md#msk-iam-auth) Sie kein Objekt. [SourceAccessConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_SourceAccessConfiguration.html) Beispiel:  

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:vpc-connection/444455556666/my-cluster-name/51jn98b4-0a61-46cc-b0a6-61g9a3d797d5-7 \
  --topics AWSKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function
```

**Example — Erstellen Sie eine kontenübergreifende Zuordnung von Ereignisquellen für einen Cluster, der Authentifizierung verwendet SASL/SCRAM**  
Wenn der Cluster die [SASL/SCRAM-Authentifizierung](msk-cluster-auth.md#msk-sasl-scram) verwendet, müssen Sie ein [SourceAccessConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_SourceAccessConfiguration.html)Objekt angeben, das einen geheimen Secrets Manager Manager-ARN spezifiziert, `SASL_SCRAM_512_AUTH` und einen geheimen ARN hinzufügen.  
Es gibt zwei Möglichkeiten, Geheimnisse für kontoübergreifende Amazon MSK-Ereignisquellenzuordnungen mit Authentifizierung zu verwenden: SASL/SCRAM   
+ Erstellen Sie ein Secret im Lambda-Funktionskonto und synchronisieren Sie es mit dem Cluster-Secret. [Erstellen Sie eine Rotation](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html), um die beiden Secrets synchron zu halten. Mit dieser Option können Sie das Secret vom Funktionskonto aus kontrollieren.
+ Verwenden Sie das Secret, das dem MSK-Cluster zugeordnet ist. Dieses Secret muss kontoübergreifenden Zugriff auf das Lambda-Funktionskonto ermöglichen. Weitere Informationen finden Sie unter [Berechtigungen für AWS Secrets Manager -Secrets für Benutzer in einem anderen Konto](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_examples_cross.html).

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:vpc-connection/444455556666/my-cluster-name/51jn98b4-0a61-46cc-b0a6-61g9a3d797d5-7 \
  --topics AWSKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function \
  --source-access-configurations '[{"Type": "SASL_SCRAM_512_AUTH","URI": "arn:aws:secretsmanager:us-east-1:444455556666:secret:my-secret"}]'
```

**Example – Erstellen Sie eine kontoübergreifende Zuordnung von Ereignisquellen für einen Cluster, der die mTLS-Authentifizierung verwendet**  
Wenn der Cluster [mTLS-Authentifizierung](msk-cluster-auth.md#msk-mtls) verwendet, müssen Sie ein [SourceAccessConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_SourceAccessConfiguration.html)Objekt angeben, das einen geheimen ARN von Secrets Manager spezifiziert`CLIENT_CERTIFICATE_TLS_AUTH`. Das Secret kann im Clusterkonto oder im Lambda-Funktionskonto gespeichert werden.  

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:vpc-connection/444455556666/my-cluster-name/51jn98b4-0a61-46cc-b0a6-61g9a3d797d5-7 \
  --topics AWSKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function \
  --source-access-configurations '[{"Type": "CLIENT_CERTIFICATE_TLS_AUTH","URI": "arn:aws:secretsmanager:us-east-1:444455556666:secret:my-secret"}]'
```

# Alle Amazon-MSK-Konfigurationsparameter von Ereignisquellen in Lambda
<a name="msk-esm-parameters"></a>

Alle Lambda-Ereignisquelltypen verwenden dieselben [CreateEventSourceMapping[UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)API-Operationen. Allerdings gelten nur einige der Parameter für selbstverwaltetes Amazon MSK, wie in der folgenden Tabelle dargestellt.


| Parameter | Erforderlich | Standard | Hinweise | 
| --- | --- | --- | --- | 
|  AmazonManagedKafkaEventSourceConfig  |  N  |  Enthält das ConsumerGroupId Feld, das standardmäßig einen eindeutigen Wert hat.  |  Kann nur auf „Erstellen“ festgelegt werden  | 
|  BatchSize  |  N  |  100  |  Höchstwert: 10 000.  | 
|  DestinationConfig  |  N  |  –  |  [Erfassen verworfener Batches für Amazon MSK und selbstverwaltete Apache-Kafka-Ereignisquellen](kafka-on-failure.md)  | 
|  Aktiviert  |  N  |  Wahr  |    | 
|  BisectBatchOnFunctionError  |  N  |  Falsch  |  [Konfiguration der Fehlerbehandlungssteuerungen für Kafka-Ereignisquellen](kafka-retry-configurations.md)  | 
|  FunctionResponseTypes  |  N  |  –  |  [Konfiguration der Fehlerbehandlungssteuerungen für Kafka-Ereignisquellen](kafka-retry-configurations.md)  | 
|  MaximumRecordAgeInSeconds  |  N  |  -1 (unendlich)  |  [Konfiguration der Fehlerbehandlungssteuerungen für Kafka-Ereignisquellen](kafka-retry-configurations.md)  | 
|  MaximumRetryAttempts  |  N  |  -1 (unendlich)  |  [Konfiguration der Fehlerbehandlungssteuerungen für Kafka-Ereignisquellen](kafka-retry-configurations.md)  | 
|  EventSourceArn  |  Y  | – |  Kann nur auf „Erstellen“ festgelegt werden  | 
|  FilterCriteria  |  N  |  –  |  [Steuern Sie, welche Ereignisse Lambda an Ihre Funktion sendet](invocation-eventfiltering.md)  | 
|  FunctionName  |  Y  |  –  |    | 
|  KMSKeyArn  |  N  |  –  |  [Verschlüsselung der Filterkriterien](invocation-eventfiltering.md#filter-criteria-encryption)  | 
|  MaximumBatchingWindowInSeconds  |  N  |  500 ms  |  [Batching-Verhalten](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching)  | 
|  ProvisionedPollersConfig  |  N  |  `MinimumPollers`: Standardwert von 1, wenn nicht angegeben `MaximumPollers`: Standardwert von 200, wenn nicht angegeben `PollerGroupName`: N/A  |  [Modus bereitgestellter Kapazität](kafka-scaling-modes.md#kafka-provisioned-mode)  | 
|  SourceAccessConfigurations  |  N  |  Keine Anmeldedaten  |  Anmeldeinformationen zur SASL/SCRAM- oder CLIENT\$1CERTIFICATE\$1TLS\$1AUTH (MutualTLS)-Authentifizierung für Ihre Ereignisquelle  | 
|  StartingPosition  |  Y  | – |  AT\$1TIMESTAMP, TRIM\$1HORIZON, oder LATEST Kann nur auf „Erstellen“ festgelegt werden  | 
|  StartingPositionTimestamp  |  N  |  –  |  Erforderlich, wenn es auf StartingPosition AT\$1TIMESTAMP gesetzt ist  | 
|  Tags (Markierungen)  |  N  |  –  |  [Verwendung von Tags für Zuordnungen von Ereignisquellen](tags-esm.md)  | 
|  Topics  |  Y  | – |  Kafka-Thema-Name Kann nur auf „Erstellen“ festgelegt werden  | 

**Anmerkung**  
Wenn Sie a angeben`PollerGroupName`, können sich mehrere ESMs innerhalb derselben Amazon VPC die Kapazität der Event Poller Unit (EPU) teilen. Sie können diese Option verwenden, um die Kosten für den Bereitstellungsmodus für Sie zu optimieren. ESMs Anforderungen für die ESM-Gruppierung:  
ESMs muss sich in derselben Amazon-VPC befinden
Maximal 100 ESMs pro Befragungsgruppe
Die Gesamtzahl der Befragten ESMs in einer Gruppe darf 2000 nicht überschreiten
Sie können den aktualisieren`PollerGroupName`, um einen ESM in eine andere Gruppe zu verschieben, oder einen ESM aus einer Gruppe entfernen, indem Sie ihn `PollerGroupName` auf eine leere Zeichenfolge („“) setzen.

# Tutorial: Verwenden einer Amazon-MSK-Zuordnung von Ereignisquellen zum Aufrufen einer Lambda-Funktion
<a name="services-msk-tutorial"></a>

In diesem Tutorial führen Sie Folgendes durch:
+ Erstellen Sie eine Lambda-Funktion in demselben AWS Konto wie ein vorhandener Amazon MSK-Cluster.
+ Konfigurieren Sie Netzwerk und Authentifizierung für Lambda für die Kommunikation mit Amazon MSK.
+ Richten Sie eine Lambda Amazon MSK-Zuordnung von Ereignisquellen ein, die Ihre Lambda-Funktion ausführt, wenn Ereignisse im Thema auftauchen.

Nachdem Sie diese Schritte durchgeführt haben, können Sie, wenn Ereignisse an Amazon MSK gesendet werden, eine Lambda-Funktion einrichten, um diese Ereignisse automatisch mit Ihrem eigenen benutzerdefinierten Lambda-Code zu verarbeiten.

 **Was können Sie mit diesem Feature machen?** 

**Beispiellösung: Verwenden Sie eine MSK-Zuordnung von Ereignisquellen, um Ihren Kunden Live-Ergebnisse zu liefern.**

Stellen Sie sich das folgende Szenario vor: Ihr Unternehmen hostet eine Webanwendung, mit der Ihre Kunden Informationen über Live-Ereignisse, z. B. Sportspiele, abrufen können. Aktuelle Informationen aus dem Spiel werden Ihrem Team über ein Kafka-Thema auf Amazon MSK zur Verfügung gestellt. Sie möchten eine Lösung entwerfen, die Aktualisierungen aus dem MSK-Thema abruft, um den Kunden in einer von Ihnen entwickelten Anwendung eine aktualisierte Ansicht des Live-Ereignisses zu bieten. Sie haben sich für den folgenden Designansatz entschieden: Ihre Client-Anwendungen werden mit einem Serverless-Backend kommunizieren, das in AWS gehostet wird. Clients stellen mithilfe der Amazon WebSocket API Gateway eine Verbindung über Websocket-Sitzungen her.

Bei dieser Lösung benötigen Sie eine Komponente, die MSK-Ereignisse liest, eine benutzerdefinierte Logik ausführt, um diese Ereignisse für die Anwendungsschicht vorzubereiten und diese Informationen dann an die API-Gateway-API weiterleitet. Sie können diese Komponente implementieren AWS Lambda, indem Sie Ihre benutzerdefinierte Logik in einer Lambda-Funktion bereitstellen und sie dann mit einer AWS Lambda Amazon MSK-Ereignisquellenzuordnung aufrufen.

Weitere Informationen zur Implementierung von Lösungen mit der Amazon API Gateway WebSocket API finden Sie WebSocket in den [API-Tutorials](https://docs.aws.amazon.com/apigateway/latest/developerguide/websocket-api-chat-app.html) in der API Gateway-Dokumentation.

## Voraussetzungen
<a name="w2aad101c23c15c35c19"></a>

Ein AWS Konto mit den folgenden vorkonfigurierten Ressourcen:

**Um diese Voraussetzungen zu erfüllen, empfehlen wir den Abschnitt [Erste Schritte mit Amazon MSK](https://docs.aws.amazon.com//msk/latest/developerguide/getting-started.html) in der Amazon MSK-Dokumentation.**
+ Ein Amazon-MSK-Cluster. Siehe [Erstellen eines Amazon MSK-Clusters](https://docs.aws.amazon.com//msk/latest/developerguide/create-cluster.html) in *Erste Schritte mit Amazon MSK*.
+ Die folgende Konfiguration:
  + Vergewissern Sie sich, dass die **rollenbasierte IAM-Authentifizierung** in den Sicherheitseinstellungen Ihres Clusters **aktiviert** ist. Dies verbessert Ihre Sicherheit, da Ihre Lambda-Funktion nur auf die benötigten Amazon MSK-Ressourcen zugreifen kann. Dies ist bei neuen Amazon MSK-Clustern standardmäßig aktiviert.
  + Vergewissern Sie sich, dass der **öffentliche Zugang** in den Netzwerkeinstellungen Ihres Clusters deaktiviert ist. Wenn Sie den Zugang Ihres Amazon MSK Clusters zum Internet einschränken, erhöht sich Ihre Sicherheit, da die Anzahl der Vermittler, die Ihre Daten verarbeiten, begrenzt wird. Dies ist bei neuen Amazon MSK-Clustern standardmäßig aktiviert.
+ Ein Kafka-Thema in Ihrem Amazon MSK-Cluster, das Sie für diese Lösung verwenden können. Weitere Informationen finden Sie unter [Erstellen eines Themas](https://docs.aws.amazon.com//msk/latest/developerguide/create-topic.html) unter *Erste Schritte mit Amazon MSK*.
+ Ein Kafka-Admin-Host, der so eingerichtet ist, dass er Informationen von Ihrem Kafka-Cluster abruft und Kafka-Ereignisse zu Testzwecken an Ihr Thema sendet, z. B. eine Amazon EC2-Instance mit der Kafka-Admin-CLI und der installierten Amazon-MSK-IAM-Bibliothek. Siehe [Erstellen eines Client-Rechners](https://docs.aws.amazon.com//msk/latest/developerguide/create-client-machine.html) in *Erste Schritte mit Amazon MSK*.

Nachdem Sie diese Ressourcen eingerichtet haben, erfassen Sie die folgenden Informationen aus Ihrem AWS Konto, um zu bestätigen, dass Sie bereit sind, fortzufahren.
+ Der Name Ihres Amazon MSK-Clusters. Sie finden diese Informationen in der Amazon-MSK-Konsole.
+ Die Cluster-UUID, Teil des ARN für Ihren Amazon MSK-Cluster, den Sie in der Amazon MSK-Konsole finden können. Folgen Sie den Verfahren unter [Cluster auflisten](https://docs.aws.amazon.com/msk/latest/developerguide/msk-list-clusters.html) in der Amazon MSK-Dokumentation, um diese Informationen zu finden.
+ Die mit Ihrem Amazon MSK-Cluster verbundenen Sicherheitsgruppen. Sie finden diese Informationen in der Amazon-MSK-Konsole. Bezeichnen Sie diese in den folgenden Schritten als Ihre*clusterSecurityGroups*.
+ Die ID der Amazon VPC, die Ihren Amazon MSK-Cluster enthält. Sie können diese Informationen finden, indem Sie in der Amazon MSK-Konsole die mit Ihrem Amazon MSK-Cluster verbundenen Subnetze identifizieren und dann in der Amazon VPC-Konsole die mit dem Subnetz verbundene Amazon VPC identifizieren.
+ Der Name des in Ihrer Lösung verwendeten Kafka-Themas. Sie können diese Informationen finden, indem Sie Ihren Amazon MSK-Cluster mit der Kafka `topics` CLI von Ihrem Kafka-Administrationshost aus aufrufen. Weitere Informationen zur Themen-CLI finden Sie in der Kafka-Dokumentation unter [Themen hinzufügen und entfernen](https://kafka.apache.org/documentation/#basic_ops_add_topic).
+ Der Name einer Verbrauchergruppe für Ihr Kafka-Thema, geeignet für die Verwendung durch Ihre Lambda-Funktion. Diese Gruppe kann automatisch von Lambda erstellt werden, Sie müssen sie also nicht mit der Kafka-CLI erstellen. Wenn Sie Ihre Verbrauchergruppen verwalten müssen, finden Sie weitere Informationen über die Verbrauchergruppen-CLI unter [Verwalten von Verbrauchergruppen](https://kafka.apache.org/documentation/#basic_ops_consumer_group) in der Kafka-Dokumentation.

Die folgenden Berechtigungen in Ihrem AWS Konto:
+ Berechtigung zur Erstellung und Verwaltung einer Lambda-Funktion.
+ Erlaubnis, IAM-Richtlinien zu erstellen und sie mit Ihrer Lambda-Funktion zu verknüpfen.
+ Berechtigung zum Erstellen von Amazon VPC-Endpunkten und zum Ändern der Netzwerkkonfiguration in der Amazon VPC, die Ihren Amazon MSK-Cluster hostet.

### Installiere das AWS Command Line Interface
<a name="install_aws_cli"></a>

Wenn Sie das noch nicht installiert haben AWS Command Line Interface, folgen Sie den Schritten unter [Installieren oder Aktualisieren der neuesten Version von AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), um es zu installieren.

Das Tutorial erfordert zum Ausführen von Befehlen ein Befehlszeilenterminal oder eine Shell. Verwenden Sie unter Linux und macOS Ihre bevorzugte Shell und Ihren bevorzugten Paketmanager.

**Anmerkung**  
In Windows werden einige Bash-CLI-Befehle, die Sie häufig mit Lambda verwenden (z. B. `zip`), von den integrierten Terminals des Betriebssystems nicht unterstützt. Um eine in Windows integrierte Version von Ubuntu und Bash zu erhalten, [installieren Sie das Windows-Subsystem für Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). 

## Konfigurieren Sie die Netzwerkkonnektivität für Lambda zur Kommunikation mit Amazon MSK
<a name="w2aad101c23c15c35c21"></a>

 Wird verwendet AWS PrivateLink , um Lambda und Amazon MSK zu verbinden. Sie können dies tun, indem Sie Amazon VPC-Endpunkte in der Amazon VPC-Konsole erstellen. Weitere Informationen zur Netzwerkkonfiguration finden Sie unter [Konfiguration Ihres Amazon-MSK-Clusters und Ihres Amazon-VPC-Netzwerks für Lambda](with-msk-cluster-network.md). 

Wenn eine Amazon MSK-Zuordnung von Ereignisquellen im Namen einer Lambda-Funktion ausgeführt wird, übernimmt es die Ausführungsrolle der Lambda-Funktion. Diese IAM-Rolle autorisiert die Zuordnung für den Zugriff auf durch IAM gesicherte Ressourcen, wie z. B. Ihren Amazon MSK-Cluster. Obwohl die Komponenten eine gemeinsame Ausführungsrolle haben, haben das Amazon MSK-Mapping und Ihre Lambda-Funktion separate Konnektivitätsanforderungen für ihre jeweiligen Aufgaben, wie im folgenden Diagramm dargestellt.

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/msk_tut_network.png)


Ihre Zuordnung von Ereignisquellen gehört zu Ihrer Amazon MSK-Cluster-Sicherheitsgruppe. In diesem Vernetzungsschritt erstellen Sie Amazon VPC-Endpunkte von Ihrer Amazon MSK-Cluster-VPC, um die Zuordnung von Ereignisquellen mit den Lambda- und STS-Services zu verbinden. Sichern Sie diese Endpunkte, damit sie Datenverkehr von Ihrer Amazon MSK-Cluster-Sicherheitsgruppe akzeptieren. Passen Sie dann die Sicherheitsgruppen des Amazon MSK-Clusters an, damit die Zuordnung von Ereignisquellen mit dem Amazon MSK-Cluster kommunizieren kann.

 Sie können die folgenden Schritte mit dem AWS-Managementkonsole.

**So konfigurieren Sie Schnittstellen-Amazon-VPC-Endpunkte, um Lambda und Amazon MSK zu verbinden**

1. Erstellen Sie eine Sicherheitsgruppe für Ihre Schnittstelle Amazon VPC-Endpunkte,*endpointSecurityGroup*, die eingehenden TCP-Verkehr auf 443 von ermöglicht. *clusterSecurityGroups* Befolgen Sie das Verfahren unter [Erstellen einer Sicherheitsgruppe](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/working-with-security-groups.html#creating-security-group) in der Amazon EC2-Dokumentation, um eine Sicherheitsgruppe zu erstellen. Folgen Sie dann dem Verfahren unter [Hinzufügen von Regeln zu einer Sicherheitsgruppe](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule) in der Amazon EC2-Dokumentation, um entsprechende Regeln hinzuzufügen. 

   **Erstellen Sie eine Sicherheitsgruppe mit den folgenden Informationen:**

   Wenn Sie Ihre Regeln für eingehenden Datenverkehr hinzufügen, erstellen Sie eine Regel für jede Sicherheitsgruppe in. *clusterSecurityGroups* Für jede Regel:
   + Wählen Sie für **Type (Typ)** **HTTPS** aus.
   + Wählen Sie für **Quelle** eine von. *clusterSecurityGroups*

1.  Erstellen Sie einen Endpunkt, der den Lambda-Service mit der Amazon VPC verbindet, die Ihren Amazon MSK-Cluster enthält. Folgen Sie dem Verfahren unter [Schnittstellenendpunkt erstellen](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html).

   **Erstellen Sie einen Schnittstellenendpunkt mit den folgenden Informationen:**
   + Wählen Sie als **Dienstname** aus`com.amazonaws.regionName.lambda`, wo Ihre Lambda-Funktion *regionName* gehostet wird.
   + Wählen Sie für **VPC** die Amazon VPC aus, die Ihren Amazon MSK-Cluster enthält.
   + Wählen Sie für **Sicherheitsgruppen** die Gruppen aus*endpointSecurityGroup*, die Sie zuvor erstellt haben.
   + Wählen Sie für **Subnetze** die Subnetze aus, die Ihren Amazon MSK-Cluster hosten.
   + Geben Sie für die **Richtlinie** das folgende Richtliniendokument an, das den Endpunkt für die Verwendung durch den Lambda-Serviceprinzipal für die `lambda:InvokeFunction`-Aktion sichert.

     ```
     {
         "Statement": [
             {
                 "Action": "lambda:InvokeFunction",
                 "Effect": "Allow",
                 "Principal": {
                     "Service": [
                         "lambda.amazonaws.com"
                     ]
                 },
                 "Resource": "*"
             }
         ]
     }
     ```
   + Stellen Sie sicher, dass **DNS-Name aktivieren** weiterhin aktiviert ist.

1.  Erstellen Sie einen Endpunkt, der den AWS STS Service mit der Amazon VPC verbindet, die Ihren Amazon MSK-Cluster enthält. Folgen Sie dem Verfahren unter [Schnittstellenendpunkt erstellen](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html).

   **Erstellen Sie einen Schnittstellenendpunkt mit den folgenden Informationen:**
   + Wählen Sie als **Dienstname** die Option aus. AWS STS
   + Wählen Sie für **VPC** die Amazon VPC aus, die Ihren Amazon MSK-Cluster enthält.
   + Wählen Sie für **Sicherheitsgruppen** die Option aus*endpointSecurityGroup*.
   + Wählen Sie für **Subnetze** die Subnetze aus, die Ihren Amazon MSK-Cluster hosten.
   + Geben Sie für die **Richtlinie** das folgende Richtliniendokument an, das den Endpunkt für die Verwendung durch den Lambda-Serviceprinzipal für die `sts:AssumeRole`-Aktion sichert.

     ```
     {
         "Statement": [
             {
                 "Action": "sts:AssumeRole",
                 "Effect": "Allow",
                 "Principal": {
                     "Service": [
                         "lambda.amazonaws.com"
                     ]
                 },
                 "Resource": "*"
             }
         ]
     }
     ```
   + Stellen Sie sicher, dass **DNS-Name aktivieren** weiterhin aktiviert ist.

1. Lassen Sie für jede Sicherheitsgruppe, die Ihrem Amazon MSK-Cluster zugeordnet ist, d. h. in*clusterSecurityGroups*, Folgendes zu:
   + Erlauben Sie allen eingehenden und ausgehenden TCP-Verkehr auf 9098 für alle*clusterSecurityGroups*, auch für sich selbst.
   + Den gesamten ausgehenden TCP-Verkehr auf 443 zulassen.

   Ein Teil dieses Datenverkehrs wird durch die Standardregeln der Sicherheitsgruppe zugelassen. Wenn Ihr Cluster also nur einer einzigen Sicherheitsgruppe angehört und diese Gruppe über Standardregeln verfügt, sind zusätzliche Regeln nicht erforderlich. Um die Regeln für Sicherheitsgruppen anzupassen, befolgen Sie die Verfahren unter [Hinzufügen von Regeln zu einer Sicherheitsgruppe](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule) in der Amazon EC2-Dokumentation.

   **Fügen Sie Ihren Sicherheitsgruppen Regeln mit den folgenden Informationen hinzu:**
   + Geben Sie für jede eingehende oder ausgehende Regel für Port 9098 Folgendes an
     + Wählen Sie für **Type** (Typ) **Custom TCP** (Benutzerdefiniertes TCP).
     + Geben Sie als **Portbereich** 9098 an.
     + Geben Sie als **Quelle** einen von an. *clusterSecurityGroups*
   + Wählen Sie für jede eingehende Regel für Port 443 als **Typ** die Option **HTTPS** aus.

## Erstellen Sie eine IAM-Rolle, die Lambda aus Ihrem Amazon-MSK-Thema lesen kann
<a name="w2aad101c23c15c35c23"></a>

Identifizieren Sie die Authentifizierungsanforderungen für Lambda, um aus Ihrem Amazon MSK-Thema zu lesen und definieren Sie sie dann in einer Richtlinie. Erstellen Sie eine Rolle*lambdaAuthRole*, die Lambda autorisiert, diese Berechtigungen zu verwenden. Autorisieren Sie Aktionen in Ihrem Amazon MSK-Cluster mithilfe von `kafka-cluster` IAM-Aktionen. Autorisieren Sie Lambda anschließend, Amazon MSK `kafka` - und Amazon EC2 EC2-Aktionen durchzuführen, die für die Erkennung Ihres Amazon MSK-Clusters und die Verbindung zu ihm erforderlich sind, sowie CloudWatch Aktionen, damit Lambda protokollieren kann, was es getan hat.

**So beschreiben Sie die Authentifizierungsanforderungen für Lambda, um von Amazon MSK zu lesen**

1. Schreiben Sie ein IAM-Richtliniendokument (ein JSON-Dokument), das es Lambda ermöglicht*clusterAuthPolicy*, mithilfe Ihrer Kafka-Verbrauchergruppe aus Ihrem Kafka-Thema in Ihrem Amazon MSK-Cluster zu lesen. Für Lambda muss beim Lesen eine Kafka-Verbrauchergruppe festgelegt werden.

   Ändern Sie die folgende Vorlage, um sie an Ihre Voraussetzungen anzupassen:

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "kafka-cluster:Connect",
                   "kafka-cluster:DescribeGroup",
                   "kafka-cluster:AlterGroup",
                   "kafka-cluster:DescribeTopic",
                   "kafka-cluster:ReadData",
                   "kafka-cluster:DescribeClusterDynamicConfiguration"
               ],
               "Resource": [
                   "arn:aws:kafka:us-east-1:111122223333:cluster/mskClusterName/cluster-uuid",
                   "arn:aws:kafka:us-east-1:111122223333:topic/mskClusterName/cluster-uuid/mskTopicName",
                   "arn:aws:kafka:us-east-1:111122223333:group/mskClusterName/cluster-uuid/mskGroupName"
               ]
           }
       ]
   }
   ```

------

   Weitere Informationen erhalten Sie von [Konfiguration von Lambda-Berechtigungen für Amazon MSK-Ereignisquellenzuordnungen](with-msk-permissions.md). Wenn Sie Ihre Richtlinie schreiben:
   + Ersetzen Sie *us-east-1* und *111122223333* durch das AWS-Region und AWS-Konto Ihres Amazon MSK-Clusters.
   + Geben Sie für *mskClusterName* den Namen Ihres Amazon MSK-Clusters an.
   + Geben Sie für *cluster-uuid* die UUID im ARN für Ihren Amazon MSK-Cluster an.
   + Geben Sie für *mskTopicName* den Namen Ihres Kafka-Themas an.
   + Geben Sie für *mskGroupName* den Namen Ihrer Kafka-Verbrauchergruppe an.

1. Identifizieren Sie Amazon MSK, Amazon EC2 und die CloudWatch Berechtigungen, die Lambda benötigt, um Ihren Amazon MSK-Cluster zu erkennen und zu verbinden, und protokollieren Sie diese Ereignisse.

   Die `AWSLambdaMSKExecutionRole`-verwaltete Richtlinie definiert die erforderlichen Berechtigungen auf unzulässige Weise. Verwenden Sie es in den folgenden Schritten.

   Beurteilen Sie in einer Produktionsumgebung `AWSLambdaMSKExecutionRole`, um Ihre Ausführungsrollenrichtlinie auf der Grundlage des Prinzips der geringsten Berechtigung einzuschränken und schreiben Sie dann eine Richtlinie für Ihre Rolle, die diese verwaltete Richtlinie ersetzt.

Weitere Informationen zur IAM-Richtliniensprache finden Sie unter [IAM-Dokumentation](https://docs.aws.amazon.com//iam/).

Nachdem Sie nun Ihr Richtliniendokument verfasst haben, erstellen Sie eine IAM-Richtlinie, die Sie mit Ihrer Rolle verknüpfen können. Sie können dies über die Konsole mit dem folgenden Verfahren tun.

**So erstellen Sie eine IAM-Richtlinie aus Ihrem Richtliniendokument**

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die IAM-Konsole unter. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)

1. Wählen Sie im Navigationsbereich auf der linken Seite **Policies (Richtlinien)**. 

1. Wählen Sie **Richtlinie erstellen** aus.

1. Wählen Sie im Bereich **Policy editor** (Richtlinien-Editor) die Option **JSON** aus.

1. Einfügen*clusterAuthPolicy*.

1. Wenn Sie mit dem Hinzufügen von Berechtigungen zur Richtlinie fertig sind, wählen Sie **Next** (Weiter) aus.

1. Geben Sie auf der Seite **Review and create** (Überprüfen und erstellen) unter **Name** einen Namen und unter **Description** (Beschreibung) (optional) eine Beschreibung für die Richtlinie ein, die Sie erstellen. Überprüfen Sie **Permissions defined in this policy** (In dieser Richtlinie definierte Berechtigungen), um die Berechtigungen einzusehen, die von Ihrer Richtlinie gewährt werden.

1. Wählen Sie **Create policy** (Richtlinie erstellen) aus, um Ihre neue Richtlinie zu speichern.

Weitere Informationen finden Sie unter [Erstellen von IAM-Richtlinien](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_create.html) in der IAM-Dokumentation.

Nachdem Sie nun über die entsprechenden IAM-Richtlinien verfügen, erstellen Sie eine Rolle und ordnen Sie sie dieser zu. Sie können dies über die Konsole mit dem folgenden Verfahren tun.

**So erstellen Sie eine Ausführungsrolle in der IAM-Konsole**

1. Öffnen Sie die Seite [Roles (Rollen)](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie **Rolle erstellen** aus.

1. Wählen Sie unter **Typ der vertrauenswürdigen Entität** die Option **AWS -Service** aus.

1. Wählen Sie unter **Anwendungsfall** **Lambda** aus.

1. Wählen Sie **Weiter** aus.

1. Wählen Sie die folgenden Richtlinien:
   + *clusterAuthPolicy*
   + `AWSLambdaMSKExecutionRole`

1. Wählen Sie **Weiter** aus.

1. Geben Sie **als Rollenname den Text Rolle** **erstellen ein *lambdaAuthRole* und wählen Sie dann Create role** aus.

Weitere Informationen finden Sie unter [Definieren von Lambda-Funktionsberechtigungen mit einer Ausführungsrolle](lambda-intro-execution-role.md).

## Erstellen Sie eine Lambda-Funktion zum Lesen aus Ihrem Amazon MSK-Thema
<a name="w2aad101c23c15c35c25"></a>

Erstellen Sie eine Lambda-Funktion, die für die Verwendung Ihrer IAM-Rolle konfiguriert ist. Sie können Ihre Lambda-Funktion über die Konsole erstellen.

**So erstellen Sie eine Lambda-Funktion mit Ihrer Authentifizierungskonfiguration**

1.  Öffnen Sie die Lambda-Konsole und wählen Sie im Header die Option **Funktion erstellen** aus. 

1. Wählen Sie **Verfassen von Grund auf** aus.

1. Geben Sie als **Funktionsnamen** einen geeigneten Namen Ihrer Wahl an.

1. Wählen Sie für **Laufzeit** die **neueste unterstützte** Version von `Node.js`, um den in diesem Tutorial bereitgestellten Code zu verwenden.

1. Wählen Sie **Standardeausführungsrolle ändern** aus.

1. Wählen Sie **Eine vorhandene Rolle verwenden** aus.

1. Wählen Sie für **Existierende Rolle** die Option aus*lambdaAuthRole*.

In einer Produktionsumgebung müssen Sie der Ausführungsrolle für Ihre Lambda-Funktion normalerweise weitere Richtlinien hinzufügen, um Ihre Amazon MSK-Ereignisse sinnvoll verarbeiten zu können. Weitere Informationen zum Hinzufügen von Richtlinien zu Ihrer Rolle finden Sie unter [Hinzufügen oder Entfernen von Identitätsberechtigungen](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console) in der IAM-Dokumentation.

## Erstellen einer Zuordnung der Ereignisquelle zu Ihrer Lambda-Funktion
<a name="w2aad101c23c15c35c27"></a>

Ihre Amazon MSK-Zuordnung von Ereignisquellen liefert dem Lambda-Service die notwendigen Informationen, um Ihr Lambda aufzurufen, wenn entsprechende Amazon MSK-Ereignisse auftreten. Sie können über die Konsole eine Amazon MSK-Zuordnung erstellen. Erstellen Sie einen Lambda-Trigger, dann wird die Zuordnung von Ereignisquellen automatisch eingerichtet.

**So erstellen Sie einen Lambda-Trigger (und eine Zuordnung von Ereignisquellen)**

1. Navigieren Sie zur Übersichtsseite Ihrer Lambda-Funktion.

1. Wählen Sie im Abschnitt Funktionsübersicht unten links **Auslöser hinzufügen**.

1. Wählen Sie in der Dropdownliste **Quelle auswählen** die Option **Amazon MSK** aus.

1. Legen Sie keine **Authentifizierung** fest.

1. Wählen Sie für **MSK-Cluster** den Namen Ihres Clusters aus.

1. Geben Sie für **Batch size (Stapelgröße)** 1 ein. Dieser Schritt erleichtert das Testen dieses Features, ist aber für die Produktion nicht ideal.

1. Geben Sie für **Themenname** den Namen Ihres Kafka-Themas ein.

1. Geben Sie unter **Verbrauchergruppen-ID** die ID Ihrer Kafka-Verbrauchergruppe an.

## Aktualisieren Sie Ihre Lambda-Funktion, um Ihre Streaming-Daten zu lesen
<a name="w2aad101c23c15c35c29"></a>

 Lambda liefert Informationen über Kafka-Ereignisse über den Parameter der Ereignismethode. Ein Beispiel für die Struktur eines Amazon MSK-Ereignisses finden Sie unter [Beispielereignis](with-msk.md#msk-sample-event). Nachdem Sie verstanden haben, wie die von Lambda weitergeleiteten Amazon MSK-Ereignisse zu interpretieren sind, können Sie Ihren Lambda-Funktionscode so ändern, dass er die von ihnen bereitgestellten Informationen nutzt. 

 Fügen Sie den folgenden Code in Ihre Lambda-Funktion ein, um den Inhalt eines Lambda Amazon MSK-Ereignisses zu Testzwecken zu protokollieren: 

------
#### [ .NET ]

**SDK für .NET**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Nutzen eines Amazon MSK-Ereignisses mit Lambda unter Verwendung von .NET.  

```
using System.Text;
using Amazon.Lambda.Core;
using Amazon.Lambda.KafkaEvents;


// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace MSKLambda;

public class Function
{
    
    
    /// <param name="input">The event for the Lambda function handler to process.</param>
    /// <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
    /// <returns></returns>
    public void FunctionHandler(KafkaEvent evnt, ILambdaContext context)
    {

        foreach (var record in evnt.Records)
        {
            Console.WriteLine("Key:" + record.Key); 
            foreach (var eventRecord in record.Value)
            {
                var valueBytes = eventRecord.Value.ToArray();    
                var valueText = Encoding.UTF8.GetString(valueBytes);
                
                Console.WriteLine("Message:" + valueText);
            }
        }
    }
    

}
```

------
#### [ Go ]

**SDK für Go V2**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Nutzen eines Amazon MSK-Ereignisses mit Lambda unter Verwendung von Go.  

```
package main

import (
	"encoding/base64"
	"fmt"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(event events.KafkaEvent) {
	for key, records := range event.Records {
		fmt.Println("Key:", key)

		for _, record := range records {
			fmt.Println("Record:", record)

			decodedValue, _ := base64.StdEncoding.DecodeString(record.Value)
			message := string(decodedValue)
			fmt.Println("Message:", message)
		}
	}
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK für Java 2.x**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Nutzen eines Amazon MSK-Ereignisses mit Lambda unter Verwendung von Java.  

```
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.KafkaEvent;
import com.amazonaws.services.lambda.runtime.events.KafkaEvent.KafkaEventRecord;

import java.util.Base64;
import java.util.Map;

public class Example implements RequestHandler<KafkaEvent, Void> {

    @Override
    public Void handleRequest(KafkaEvent event, Context context) {
        for (Map.Entry<String, java.util.List<KafkaEventRecord>> entry : event.getRecords().entrySet()) {
            String key = entry.getKey();
            System.out.println("Key: " + key);

            for (KafkaEventRecord record : entry.getValue()) {
                System.out.println("Record: " + record);

                byte[] value = Base64.getDecoder().decode(record.getValue());
                String message = new String(value);
                System.out.println("Message: " + message);
            }
        }

        return null;
    }
}
```

------
#### [ JavaScript ]

**SDK für JavaScript (v3)**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Ein Amazon MSK-Ereignis mit Lambda verwenden. JavaScript  

```
exports.handler = async (event) => {
    // Iterate through keys
    for (let key in event.records) {
      console.log('Key: ', key)
      // Iterate through records
      event.records[key].map((record) => {
        console.log('Record: ', record)
        // Decode base64
        const msg = Buffer.from(record.value, 'base64').toString()
        console.log('Message:', msg)
      }) 
    }
}
```
Ein Amazon MSK-Ereignis mit Lambda verwenden. TypeScript  

```
import { MSKEvent, Context } from "aws-lambda";
import { Buffer } from "buffer";
import { Logger } from "@aws-lambda-powertools/logger";

const logger = new Logger({
  logLevel: "INFO",
  serviceName: "msk-handler-sample",
});

export const handler = async (
  event: MSKEvent,
  context: Context
): Promise<void> => {
  for (const [topic, topicRecords] of Object.entries(event.records)) {
    logger.info(`Processing key: ${topic}`);

    // Process each record in the partition
    for (const record of topicRecords) {
      try {
        // Decode the message value from base64
        const decodedMessage = Buffer.from(record.value, 'base64').toString();

        logger.info({
          message: decodedMessage
        });
      }
      catch (error) {
        logger.error('Error processing event', { error });
        throw error;
      }
    };
  }
}
```

------
#### [ PHP ]

**SDK für PHP**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Nutzen eines Amazon MSK-Ereignisses mit Lambda unter Verwendung von PHP.  

```
<?php
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

// using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\Kafka\KafkaEvent;
use Bref\Event\Handler as StdHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler implements StdHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws JsonException
     * @throws \Bref\Event\InvalidLambdaEvent
     */
    public function handle(mixed $event, Context $context): void
    {
        $kafkaEvent = new KafkaEvent($event);
        $this->logger->info("Processing records");
        $records = $kafkaEvent->getRecords();

        foreach ($records as $record) {
            try {
                $key = $record->getKey();
                $this->logger->info("Key: $key");

                $values = $record->getValue();
                $this->logger->info(json_encode($values));

                foreach ($values as $value) {
                    $this->logger->info("Value: $value");
                }
                
            } catch (Exception $e) {
                $this->logger->error($e->getMessage());
            }
        }
        $totalRecords = count($records);
        $this->logger->info("Successfully processed $totalRecords records");
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

------
#### [ Python ]

**SDK für Python (Boto3)**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Nutzen eines Amazon MSK-Ereignisses mit Lambda unter Verwendung von Python.  

```
import base64

def lambda_handler(event, context):
    # Iterate through keys
    for key in event['records']:
        print('Key:', key)
        # Iterate through records
        for record in event['records'][key]:
            print('Record:', record)
            # Decode base64
            msg = base64.b64decode(record['value']).decode('utf-8')
            print('Message:', msg)
```

------
#### [ Ruby ]

**SDK für Ruby**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Nutzen eines Amazon MSK-Ereignisses mit Lambda unter Verwendung von Ruby.  

```
require 'base64'

def lambda_handler(event:, context:)
  # Iterate through keys
  event['records'].each do |key, records|
    puts "Key: #{key}"

    # Iterate through records
    records.each do |record|
      puts "Record: #{record}"

      # Decode base64
      msg = Base64.decode64(record['value'])
      puts "Message: #{msg}"
    end
  end
end
```

------
#### [ Rust ]

**SDK für Rust**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Nutzen eines Amazon-MSK-Ereignisses mit Lambda unter Verwendung von Rust.  

```
use aws_lambda_events::event::kafka::KafkaEvent;
use lambda_runtime::{run, service_fn, tracing, Error, LambdaEvent};
use base64::prelude::*;
use serde_json::{Value};
use tracing::{info};

/// Pre-Requisites:
/// 1. Install Cargo Lambda - see https://www.cargo-lambda.info/guide/getting-started.html
/// 2. Add packages tracing, tracing-subscriber, serde_json, base64
///
/// This is the main body for the function.
/// Write your code inside it.
/// There are some code example in the following URLs:
/// - https://github.com/awslabs/aws-lambda-rust-runtime/tree/main/examples
/// - https://github.com/aws-samples/serverless-rust-demo/

async fn function_handler(event: LambdaEvent<KafkaEvent>) -> Result<Value, Error> {

    let payload = event.payload.records;

    for (_name, records) in payload.iter() {

        for record in records {

         let record_text = record.value.as_ref().ok_or("Value is None")?;
         info!("Record: {}", &record_text);

         // perform Base64 decoding
         let record_bytes = BASE64_STANDARD.decode(record_text)?;
         let message = std::str::from_utf8(&record_bytes)?;
         
         info!("Message: {}", message);
        }

    }

    Ok(().into())
}

#[tokio::main]
async fn main() -> Result<(), Error> {

    // required to enable CloudWatch error logging by the runtime
    tracing::init_default_subscriber();
    info!("Setup CW subscriber!");

    run(service_fn(function_handler)).await
}
```

------

Sie können Ihrem Lambda Funktionscode über die Konsole zur Verfügung stellen.

**So aktualiseren Sie Ihren Funktionscode mit dem Code-Editor**

1. Öffnen Sie die [Funktionsseite](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole und wählen Sie Ihre Funktion aus.

1. Wählen Sie die Registerkarte **Code** aus.

1. Wählen Sie im Bereich **Codequelle** Ihre Quellcodedatei aus und bearbeiten Sie sie im integrierten Code-Editor.

1. Wählen Sie im Abschnitt **BEREITSTELLEN** die Option **Bereitstellen** aus, um den Code Ihrer Funktion zu aktualisieren:  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

## Testen Sie Ihre Lambda-Funktion, um zu überprüfen, ob sie mit Ihrem Amazon MSK-Thema verbunden ist
<a name="w2aad101c23c15c35c31"></a>

Sie können jetzt überprüfen, ob Ihr Lambda von der Ereignisquelle aufgerufen wird, indem Sie die Ereignisprotokolle überprüfen CloudWatch .

**So überprüfen Sie, ob Ihre Lambda-Funktion aufgerufen wird**

1. Verwenden Sie Ihren Kafka-Admin-Host, um Kafka-Ereignisse mithilfe der `kafka-console-producer`-CLI zu generieren. Weitere Informationen finden Sie in der Kafka-Dokumentation unter [Einige Ereignisse in das Thema schreiben](https://kafka.apache.org/documentation/#quickstart_send). Senden Sie so viele Ereignisse, dass der durch die Stapelgröße definierte Stapel für die im vorherigen Schritt definierte Zuordnung von Ereignisquellen gefüllt wird, oder Lambda wartet auf weitere Informationen, um den Aufruf zu starten.

1. Wenn Ihre Funktion ausgeführt wird, schreibt Lambda, was passiert ist. CloudWatch Navigieren Sie in der Konsole zur Detailseite Ihrer Lambda-Funktion.

1. Wählen Sie die Registerkarte **Configuration** aus.

1. Wählen Sie in der Seitenleiste die Option **Überwachungs- und Betriebstools**.

1. Identifizieren Sie die **CloudWatch Protokollgruppe** unter **Logging-Konfiguration**. Die Protokollgruppe sollte mit `/aws/lambda` beginnen. Wählen Sie den Link zur Protokollgruppe.

1. Suchen Sie in der CloudWatch Konsole in den **Protokollereignissen** nach den Protokollereignissen, die Lambda an den Protokollstream gesendet hat. Stellen Sie fest, ob es Protokollereignisse gibt, die die Nachricht aus Ihrem Kafka-Ereignis enthalten, wie in der folgenden Abbildung dargestellt. Falls ja, haben Sie erfolgreich eine Lambda-Funktion mit einer Lambda-Zuordnung von Ereignisquellen mit Amazon MSK verbunden.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/msk_tut_log.png)

# Verwendung von Lambda mit selbstverwaltetem Apache Kafka
<a name="with-kafka"></a>

In diesem Thema wird die Verwendung von Lambda mit einem selbstverwalteten Kafka-Cluster beschrieben. In der AWS Terminologie umfasst ein selbstverwalteter Cluster auch nicht AWS gehostete Kafka-Cluster. Sie können Ihren Kafka-Cluster beispielsweise bei einem Cloud-Anbieter wie [Confluent Cloud](https://www.confluent.io/confluent-cloud/) oder [Redpanda](https://www.redpanda.com/) hosten.

In diesem Kapitel wird erklärt, wie Sie einen selbstverwalteten Apache-Kafka-Cluster als Ereignisquelle für Ihre Lambda-Funktion verwenden. Der allgemeine Prozess zur Integration von selbstverwaltetem Apache Kafka mit Lambda umfasst die folgenden Schritte:

1. **[Cluster- und Netzwerkeinrichtung](with-kafka-cluster-network.md)** – Richten Sie zunächst Ihren selbstverwalteten Apache-Kafka-Cluster mit der richtigen Netzwerkkonfiguration ein, damit Lambda auf Ihren Cluster zugreifen kann.

1. **[Einrichtung der Zuordnung von Ereignisquellen](with-kafka-configure.md)** – Erstellen Sie anschließend die Ressource der [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md), die Lambda benötigt, um Ihren Apache-Kafka-Cluster sicher mit Ihrer Funktion zu verbinden.

1. **[Einrichtung von Funktionen und Berechtigungen](with-kafka-permissions.md)** – Stellen Sie abschließend sicher, dass Ihre Funktion korrekt eingerichtet ist und über die erforderlichen Berechtigungen in ihrer [Ausführungsrolle](lambda-intro-execution-role.md) verfügt.

Apache Kafka als Ereignisquelle funktioniert ähnlich wie die Verwendung von Amazon Simple Queue Service (Amazon SQS) oder Amazon Kinesis. Lambda fragt intern neue Nachrichten von der Ereignisquelle ab und ruft dann synchron die Ziel-Lambda-Funktion auf. Lambda liest die Nachrichten in Batches und stellt diese Ihrer Funktion als Ereignisnutzlast zur Verfügung. Die maximale Batchgröße ist konfigurierbar (Standardeinstellung: 100 Nachrichten). Weitere Informationen finden Sie unter [Batching-Verhalten](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

Um den Durchsatz Ihrer selbstverwalteten Apache Kafka-Zuordnungen von Ereignisquellen zu optimieren, konfigurieren Sie den Bereitstellungsmodus. Im Bereitstellungsmodus können Sie die minimale und maximale Anzahl von Event-Pollern definieren, die Zuordnung von Ereignisquellen zugewiesen werden. Dies kann die Fähigkeit Ihrer Zuordnung von Ereignisquellen verbessern, unerwartete Nachrichtenspitzen zu bewältigen. Weitere Informationen finden Sie unter [Bereitstellungsmodus](kafka-scaling-modes.md#kafka-provisioned-mode).

**Warnung**  
Zuordnung von Lambda-Ereignisquellen verarbeiten jedes Ereignis mindestens einmal und es kann zu einer doppelten Verarbeitung von Datensätzen kommen. Um mögliche Probleme im Zusammenhang mit doppelten Ereignissen zu vermeiden, empfehlen wir Ihnen dringend, Ihren Funktionscode idempotent zu machen. Weitere Informationen finden Sie im Knowledge Center unter [Wie mache ich meine Lambda-Funktion idempotent](https://repost.aws/knowledge-center/lambda-function-idempotent)?. AWS 

Für Kafka-basierte Ereignisquellen unterstützt Lambda die Verarbeitung von Steuerungsparametern wie Batch-Fenster und -Größe. Weitere Informationen finden Sie unter [Batching-Verhalten](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

Ein Beispiel für die Verwendung von selbstverwaltetem Kafka als Ereignisquelle finden Sie im Compute-Blog unter [Verwenden von selbst gehostetem Apache Kafka als Ereignisquelle](https://aws.amazon.com/blogs/compute/using-self-hosted-apache-kafka-as-an-event-source-for-aws-lambda/) für. AWS Lambda AWS 

**Topics**
+ [

## Beispielereignis
](#smaa-sample-event)
+ [

# Konfiguration Ihres selbstverwalteten Apache-Kafka-Clusters und -Netzwerks für Lambda
](with-kafka-cluster-network.md)
+ [

# Konfigurieren von Rollenberechtigungen für Lambda-Ausführungen
](with-kafka-permissions.md)
+ [

# Konfigurieren von selbstverwalteten Apache Kafka-Ereignisquellen für Lambda
](with-kafka-configure.md)

## Beispielereignis
<a name="smaa-sample-event"></a>

Lambda sendet den Batch von Nachrichten im Ereignisparameter, wenn es Ihre Lambda-Funktion aufruft. Die Ereignisquelle enthält ein Array von Nachrichten. Jedes Array-Element enthält Details zum Kafka-Thema und Kafka-Partitions-ID, zusammen mit einem Zeitstempel und einer base64-codierten Nachricht.

```
{
   "eventSource": "SelfManagedKafka",
   "bootstrapServers":"b-2.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092,b-1.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092",
   "records":{
      "mytopic-0":[
         {
            "topic":"mytopic",
            "partition":0,
            "offset":15,
            "timestamp":1545084650987,
            "timestampType":"CREATE_TIME",
            "key":"abcDEFghiJKLmnoPQRstuVWXyz1234==",
            "value":"SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
            "headers":[
               {
                  "headerKey":[
                     104,
                     101,
                     97,
                     100,
                     101,
                     114,
                     86,
                     97,
                     108,
                     117,
                     101
                  ]
               }
            ]
         }
      ]
   }
}
```

# Konfiguration Ihres selbstverwalteten Apache-Kafka-Clusters und -Netzwerks für Lambda
<a name="with-kafka-cluster-network"></a>

Um Ihre Lambda-Funktion mit Ihrem selbstverwalteten Apache-Kafka-Cluster zu verbinden, müssen Sie Ihren Cluster und das Netzwerk, in dem er sich befindet, korrekt konfigurieren. Auf dieser Seite wird beschrieben, wie Sie Ihren Cluster und Ihr Netzwerk konfigurieren. Wenn Ihr Cluster und Ihr Netzwerk bereits ordnungsgemäß konfiguriert sind, lesen Sie unter [Konfigurieren von selbstverwalteten Apache Kafka-Ereignisquellen für Lambda](with-kafka-configure.md) nach, wie Sie die Zuordnung von Ereignisquellen konfigurieren.

**Topics**
+ [

## Einrichten eines selbstverwalteten Apache Kafka-Clusters
](#kafka-cluster-setup)
+ [

## Konfigurieren der Netzwerksicherheit
](#services-kafka-vpc-config)

## Einrichten eines selbstverwalteten Apache Kafka-Clusters
<a name="kafka-cluster-setup"></a>

Sie können Ihren selbstverwalteten Apache-Kafka-Cluster bei Cloud-Anbietern wie [Confluent Cloud](https://www.confluent.io/confluent-cloud/) oder [Redpanda](https://www.redpanda.com/) hosten oder ihn in Ihrer eigenen Infrastruktur ausführen. Stellen Sie sicher, dass Ihr Cluster ordnungsgemäß konfiguriert ist und über das Netzwerk zugänglich ist, mit dem Ihre Lambda-Zuordnung von Ereignisquellen verbunden wird.

## Konfigurieren der Netzwerksicherheit
<a name="services-kafka-vpc-config"></a>

Um Lambda vollen Zugriff auf selbstverwaltetes Apache Kafka über Ihre Zuordnung von Ereignisquellen zu ermöglichen, muss Ihr Cluster entweder einen öffentlichen Endpunkt (öffentliche IP-Adresse) verwenden oder Sie müssen Zugriff auf die Amazon VPC gewähren, in der Sie den Cluster erstellt haben.

Wenn Sie selbstverwaltetes Apache Kafka mit Lambda verwenden, erstellen Sie [AWS PrivateLink VPC-Endpunkte](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html), die Ihrer Funktion Zugriff auf die Ressourcen in Ihrer Amazon VPC bieten.

**Anmerkung**  
AWS PrivateLink VPC-Endpunkte sind für Funktionen mit Zuordnungen von Ereignisquellen erforderlich, die den Standardmodus (auf Abruf) für Ereignisabfragen verwenden. Wenn Ihre Zuordnung von Ereignisquellen den [bereitgestellten Modus](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode) verwendet, müssen Sie keine AWS PrivateLink-VPC-Endpunkte konfigurieren.

Erstellen Sie einen Endpunkt, der den Zugriff auf die folgenden Ressourcen ermöglicht:
+  Lambda – Erstellen Sie einen Endpunkt für den Lambda-Serviceprinzipal. 
+  AWS STS – Erstellen Sie einen Endpunkt für den AWS STS, damit ein Serviceprinzipal eine Rolle in Ihrem Namen übernehmen kann. 
+  Secrets Manager – Wenn Ihr Cluster Secrets Manager zum Speichern von Anmeldeinformationen verwendet, erstellen Sie einen Endpunkt für Secrets Manager. 

Alternativ konfigurieren Sie ein NAT-Gateway auf jedem öffentlichen Subnetz in der Amazon-VPC. Weitere Informationen finden Sie unter [Aktivieren Sie den Internetzugang für VPC-verbundene Lambda-Funktionen](configuration-vpc-internet.md).

Wenn Sie eine Zuordnung von Ereignisquellen für selbstverwaltetes Apache Kafka erstellen, prüft Lambda, ob Elastic-Network-Schnittstelle (ENI) für die für Ihre Amazon VPC konfigurierten Subnetze und Sicherheitsgruppen bereits vorhanden sind. Findet Lambda vorhandene ENIs, versucht es, diese wiederzuverwenden. Andernfalls erstellt Lambda neue ENIs, um eine Verbindung mit der Ereignisquelle herzustellen und Ihre Funktion aufzurufen.

**Anmerkung**  
Lambda-Funktionen werden immer in einer VPCs ausgeführt, die dem Lambda-Service gehört. Die VPC-Konfiguration Ihrer Funktion hat keinen Einfluss auf die Zuordnung von Ereignisquellen. Nur die Netzwerkkonfiguration der Ereignisquelle bestimmt, wie Lambda sich mit Ihrer Ereignisquelle verbindet.

Konfigurieren Sie die Sicherheitsgruppen für die Amazon VPC, die Ihren Cluster enthält. Standardmäßig verwendet der selbstverwaltete Apache Kafka die folgenden Ports: `9092`.
+ Eingehende Regeln – Erlauben Sie den gesamten Datenverkehr auf dem Standard-Broker-Port für die Sicherheitsgruppe, die mit Ihrer Ereignisquelle verbunden ist. Alternativ können Sie eine selbstreferenzierende Regel für Sicherheitsgruppen verwenden, um den Zugriff von Instances innerhalb derselben Sicherheitsgruppe zuzulassen.
+ Regeln für ausgehenden Datenverkehr – Erlauben Sie den gesamten Datenverkehr an Port `443` für externe Ziele, wenn Ihre Funktion mit AWS-Services kommunizieren muss. Alternativ können Sie auch eine selbstreferenzierende Regel für Sicherheitsgruppen verwenden, um den Zugriff auf den Broker einzuschränken, wenn Sie nicht mit anderen AWS-Services kommunizieren müssen.
+ Regeln für eingehenden Datenverkehr auf Amazon-VPC-Endpunkten – Wenn Sie einen Amazon-VPC-Endpunkt verwenden, muss die Sicherheitsgruppe, die mit Ihrem Amazon-VPC-Endpunkt verbunden ist, eingehenden Verkehr auf Port `443` von der Cluster-Sicherheitsgruppe zulassen.

Wenn Ihr Cluster eine Authentifizierung verwendet, können Sie auch die Endpunktrichtlinie für den Secrets-Manager-Endpunkt einschränken. Für den Aufruf der Secrets-Manager-API verwendet Lambda Ihre Funktionsrolle und nicht den Lambda-Serviceprinzipal.

**Example VPC-Endpunktrichtlinie – Secrets Manager-Endpunkt**  

```
{
      "Statement": [
          {
              "Action": "secretsmanager:GetSecretValue",
              "Effect": "Allow",
              "Principal": {
                  "AWS": [
                      "arn:aws::iam::123456789012:role/my-role"
                  ]
              },
              "Resource": "arn:aws::secretsmanager:us-west-2:123456789012:secret:my-secret"
          }
      ]
  }
```

Wenn Sie Amazon VPC-Endpunkte verwenden, leitet AWS Ihre API-Aufrufe weiter, um Ihre Funktion über die Elastic-Network-Schnittstelle (ENI) des Endpunkts aufzurufen. Der Prinzipal des Lambda-Dienstes muss `lambda:InvokeFunction` für alle Rollen und Funktionen aufrufen, die diese ENI verwenden.

Standardmäßig verfügen Amazon VPC-Endpunkte über offene IAM-Richtlinien, die einen umfassenden Zugriff auf Ressourcen ermöglichen. Es empfiehlt sich, diese Richtlinien auf die Durchführung der erforderlichen Aktionen über diesen Endpunkt zu beschränken. Um sicherzustellen, dass Ihre Zuordnung von Ereignisquellen Ihre Lambda-Funktion aufrufen kann, muss die VPC-Endpunktrichtlinie dem Lambda-Serviceprinzipal erlauben, `sts:AssumeRole` und `lambda:InvokeFunction` aufzurufen. Wenn Sie Ihre VPC-Endpunktrichtlinien so einschränken, dass nur API-Aufrufe zugelassen werden, die aus Ihrem Unternehmen stammen, kann die Zuordnung von Ereignisquellen nicht richtig funktionieren, weshalb in diesen Richtlinien `"Resource": "*"` erforderlich ist.

Die folgenden Beispiel-VPC-Endpunktrichtlinien zeigen, wie der erforderliche Zugriff auf den Lambda-Serviceprinzipal für die AWS STS- und Lambda-Endpunkte gewährt wird.

**Example VPC-Endpunktrichtlinie – AWS STS-Endpunkt**  

```
{
      "Statement": [
          {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
    }
```

**Example VPC-Endpunktrichtlinie – Lambda-Endpunkt**  

```
{
      "Statement": [
          {
              "Action": "lambda:InvokeFunction",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
  }
```

# Konfigurieren von Rollenberechtigungen für Lambda-Ausführungen
<a name="with-kafka-permissions"></a>

Neben dem [Zugriff auf Ihren selbstverwalteten Kafka-Cluster](kafka-cluster-auth.md) benötigt Ihre Lambda-Funktion auch Berechtigungen, um verschiedene API-Aktionen auszuführen. Sie fügen diese Berechtigungen zur [Ausführungsrolle](lambda-intro-execution-role.md) der Funktion hinzu. Wenn Ihre Benutzer Zugriff auf API-Aktionen benötigen, fügen Sie der Identitätsrichtlinie für den AWS Identity and Access Management (IAM) -Benutzer oder die Rolle die erforderlichen Berechtigungen hinzu.

**Topics**
+ [

## Benötigte Lambda-Funktionsberechtigungen
](#smaa-api-actions-required)
+ [

## Optionale Lambda-Funktionsberechtigungen
](#smaa-api-actions-optional)
+ [

## Hinzufügen von Berechtigungen zu Ihrer Ausführungsrolle
](#smaa-permissions-add-policy)
+ [

## Gewähren von Benutzerzugriff mit einer IAM-Richtlinie
](#smaa-permissions-add-users)

## Benötigte Lambda-Funktionsberechtigungen
<a name="smaa-api-actions-required"></a>

Um Protokolle in einer Protokollgruppe in Amazon CloudWatch Logs zu erstellen und zu speichern, muss Ihre Lambda-Funktion in ihrer Ausführungsrolle über die folgenden Berechtigungen verfügen:
+ [Protokolle: CreateLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html)
+ [Protokolle: CreateLogStream](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogStream.html)
+ [Protokolle: PutLogEvents](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html)

## Optionale Lambda-Funktionsberechtigungen
<a name="smaa-api-actions-optional"></a>

Ihre Lambda-Funktion benötigt möglicherweise auch Berechtigungen für Folgendes:
+ Beschreiben Ihres Secrets-Manager-Secrets
+ Greifen Sie auf Ihren AWS Key Management Service (AWS KMS) vom Kunden verwalteten Schlüssel zu.
+ Zugriff auf Ihre Amazon VPC
+ Senden von Datensätzen zu fehlgeschlagenen Aufrufen an ein Ziel

### Secrets Manager und AWS KMS Berechtigungen
<a name="smaa-api-actions-secrets"></a>

Abhängig von der Art der Zugriffskontrolle, die Sie für Ihre Kafka-Broker konfigurieren, benötigt Ihre Lambda-Funktion möglicherweise die Erlaubnis, auf Ihr Secrets Manager-Geheimnis zuzugreifen oder Ihren vom AWS KMS Kunden verwalteten Schlüssel zu entschlüsseln. Um auf diese Ressourcen zuzugreifen, muss die Ausführungsrolle Ihrer Funktion die folgenden Berechtigungen besitzen:
+ [Secretsmanager: GetSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)

### VPC-Berechtigungen
<a name="smaa-api-actions-vpc"></a>

Wenn nur Benutzer innerhalb einer VPC auf Ihren selbstverwalteten Apache-Kafka-Cluster zugreifen können, muss Ihre Lambda-Funktion die Berechtigung zum Zugriff auf Ihre Amazon-VPC-Ressourcen haben. Zu diesen Ressourcen gehören Ihre VPC, Subnetze, Sicherheitsgruppen und Netzwerkschnittstellen. Um auf diese Ressourcen zuzugreifen, muss die Ausführungsrolle Ihrer Funktion die folgenden Berechtigungen besitzen:
+ [ec2: CreateNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html)
+ [ec2: DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)
+ [ec2: DescribeVpcs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html)
+ [ec2: DeleteNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterface.html)
+ [ec2: DescribeSubnets](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html)
+ [ec2: DescribeSecurityGroups](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)

## Hinzufügen von Berechtigungen zu Ihrer Ausführungsrolle
<a name="smaa-permissions-add-policy"></a>

[Um auf andere AWS Dienste zuzugreifen, die Ihr selbstverwalteter Apache Kafka-Cluster verwendet, verwendet Lambda die Berechtigungsrichtlinien, die Sie in der Ausführungsrolle Ihrer Lambda-Funktion definieren.](lambda-intro-execution-role.md)

Standardmäßig ist es Lambda nicht gestattet, die erforderlichen oder optionalen Aktionen für einen selbstverwalteten Apache-Kafka-Cluster durchzuführen. Sie müssen diese Aktionen in einer [IAM-Vertrauensrichtlinie](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-role-trust-policy.html) für Ihre Ausführungsrolle erstellen und definieren. In diesem Beispiel wird gezeigt, wie Sie eine Richtlinie erstellen können, die Lambda den Zugriff auf Ihre Amazon-VPC-Ressourcen erlaubt.

------
#### [ JSON ]

****  

```
{
        "Version":"2012-10-17",		 	 	 
        "Statement":[
           {
              "Effect":"Allow",
              "Action":[
                 "ec2:CreateNetworkInterface",
                 "ec2:DescribeNetworkInterfaces",
                 "ec2:DescribeVpcs",
                 "ec2:DeleteNetworkInterface",
                 "ec2:DescribeSubnets",
                 "ec2:DescribeSecurityGroups"
              ],
              "Resource":"*"
           }
        ]
     }
```

------

## Gewähren von Benutzerzugriff mit einer IAM-Richtlinie
<a name="smaa-permissions-add-users"></a>

Standardmäßig haben Benutzer und Rollen keine Berechtigung zum Ausführen von [Ereignisquellen-API-Vorgängen](invocation-eventsourcemapping.md#event-source-mapping-api). Um Benutzern in Ihrem Unternehmen oder Ihrem Konto Zugriff zu gewähren, erstellen oder aktualisieren Sie eine identitätsbasierte Richtlinie. *Weitere Informationen finden Sie unter [Steuern des Zugriffs auf AWS Ressourcen mithilfe von Richtlinien im IAM-Benutzerhandbuch](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_controlling.html).*

Informationen zur Behebung von Authentifizierungs- und Autorisierungsfehlern finden Sie unter [Fehlerbehebung bei der Kafka-Zuordnung von Ereignisquellen](with-kafka-troubleshoot.md).

# Konfigurieren von selbstverwalteten Apache Kafka-Ereignisquellen für Lambda
<a name="with-kafka-configure"></a>

Um einen selbstverwalteten Apache-Kafka-Cluster als Ereignisquelle für Ihre Lambda-Funktion zu verwenden, erstellen Sie eine [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md), die die beiden Ressourcen miteinander verbindet. Auf dieser Seite wird beschrieben, wie Sie eine Zuordnung von Ereignisquellen für selbstverwaltetes Apache Kafka erstellen.

Auf dieser Seite wird davon ausgegangen, dass Sie Ihren Kafka-Cluster und das Netzwerk, in dem er sich befindet, bereits ordnungsgemäß konfiguriert haben. Wenn Sie Ihren Cluster oder Ihr Netzwerk einrichten müssen, finden Sie entsprechende Informationen unter [Konfiguration Ihres selbstverwalteten Apache-Kafka-Clusters und -Netzwerks für Lambda](with-kafka-cluster-network.md).

**Topics**
+ [

## Verwenden eines selbstverwalteten Apache-Kafka-Clusters als Ereignisquelle
](#kafka-esm-overview)
+ [

# Konfiguration der Cluster-Authentifizierungsmethoden in Lambda
](kafka-cluster-auth.md)
+ [

# Erstellen einer Lambda-Zuordnung von Ereignisquellen für eine selbstverwaltete Apache-Kafka-Ereignisquelle
](kafka-esm-create.md)
+ [

# Alle Konfigurationsparameter für selbstverwaltete Apache-Kafka-Ereignisquellen in Lambda
](kafka-esm-parameters.md)

## Verwenden eines selbstverwalteten Apache-Kafka-Clusters als Ereignisquelle
<a name="kafka-esm-overview"></a>

Wenn Sie Ihren Apache Kafka-Cluster oder Amazon MSK als Auslöser für Ihre Lambda-Funktion hinzufügen, wird der Cluster als [Ereignisquelle](invocation-eventsourcemapping.md) verwendet.

Lambda liest Ereignisdaten aus den Kafka-Themen, die Sie wie `Topics` in einer [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)Anfrage angeben, basierend auf der von Ihnen angegebenen [Startposition](kafka-starting-positions.md). Nach erfolgreicher Verarbeitung wird Ihr Kafka-Thema Ihrem Kafka-Cluster zugeordnet.

Lambda liest Nachrichten sequentiell für jede Kafka-Themenpartition. Eine einzelne Lambda-Nutzlast kann Nachrichten von mehreren Partitionen enthalten. Wenn mehr Datensätze verfügbar sind, setzt Lambda die Verarbeitung von Datensätzen stapelweise fort, basierend auf dem BatchSize Wert, den Sie in einer [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)Anfrage angeben, bis Ihre Funktion das Thema eingeholt hat.

Nachdem Lambda jeden Batch verarbeitet hat, werden die Offsets der Nachrichten in diesem Batch festgeschrieben. Wenn Ihre Funktion einen Fehler für eine der Nachrichten in einem Batch zurückgibt, wiederholt Lambda den gesamten Nachrichtenbatch, bis die Verarbeitung erfolgreich ist oder die Nachrichten ablaufen. Sie können Datensätze, bei denen alle Wiederholungsversuche fehlschlagen, zur späteren Verarbeitung an ein Ausfallziel senden.

**Anmerkung**  
Während Lambda-Funktionen in der Regel ein maximales Timeout-Limit von 15 Minuten haben, unterstützen Ereignisquellenzuordnungen für Amazon MSK, selbstverwaltetes Apache Kafka, Amazon DocumentDB, Amazon MQ für ActiveMQ und RabbitMQ nur Funktionen mit einem maximalen Timeout-Limit von 14 Minuten.

# Konfiguration der Cluster-Authentifizierungsmethoden in Lambda
<a name="kafka-cluster-auth"></a>

Lambda unterstützt mehrere Methoden zur Authentifizierung mit Ihrem selbstverwalteten Apache-Kafka-Cluster. Stellen Sie sicher, dass Sie den Kafka-Cluster für die Verwendung einer der folgenden unterstützten Authentifizierungsmethoden konfigurieren. Weitere Informationen zur Sicherheit von Kafka finden Sie unter [Sicherheit](http://kafka.apache.org/documentation.html#security) in der Kafka-Dokumentation.

## SASL/SCRAM-Authentifizierung
<a name="smaa-auth-sasl"></a>

Lambda unterstützt die Authentifizierung Simple Authentication und Security Layer/Salted Challenge Response Authentication Mechanism (SASL/SCRAM) mit Transport Layer Security (TLS) -Verschlüsselung (). `SASL_SSL` Lambda sendet die verschlüsselten Anmeldeinformationen zur Authentifizierung mit dem Cluster. Lambda unterstützt SASL/SCRAM mit Klartext () `SASL_PLAINTEXT` nicht. Weitere Informationen zur SASL/SCRAM Authentifizierung finden Sie unter [RFC](https://tools.ietf.org/html/rfc5802) 5802.

Lambda unterstützt auch die SASL/PLAIN Authentifizierung. Da dieser Mechanismus Anmeldeinformationen im Klartext verwendet, muss die Verbindung zum Server TLS-Verschlüsselung verwenden, um sicherzustellen, dass die Anmeldeinformationen geschützt sind.

Für die SASL-Authentifizierung speichern Sie die Anmeldeinformationen als Secret in AWS Secrets Manager. Weitere Informationen zur Verwendung von Secrets Manager finden Sie unter [Create an AWS Secrets Manager Secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) im *AWS Secrets Manager Benutzerhandbuch*.

**Wichtig**  
Um Secrets Manager für die Authentifizierung zu verwenden, müssen Geheimnisse in derselben AWS Region wie Ihre Lambda-Funktion gespeichert werden.

## Gegenseitige TLS-Authentifizierung
<a name="smaa-auth-mtls"></a>

Gegenseitige TLS (mTLS) bietet eine bidirektionale Authentifizierung zwischen Client und Server. Der Client sendet ein Zertifikat an den Server, damit der Server den Client überprüfen kann, und der Server sendet ein Zertifikat an den Client, damit der Client den Server überprüfen kann. 

Im selbstverwalteten Apache Kafka fungiert Lambda als Client. Sie konfigurieren ein Client-Zertifikat (als Secret in Secrets Manager), um Lambda für Ihre Kafka-Broker zu authentifizieren. Das Client-Zertifikat muss von einer Zertifizierungsstelle im Trust Store des Servers signiert sein.

Der Kafka-Cluster sendet ein Serverzertifikat an Lambda, um die Kafka-Broker für Lambda zu authentifizieren. Das Serverzertifikat kann ein öffentliches CA-Zertifikat oder ein privat CA/self-signed certificate. The public CA certificate must be signed by a certificate authority (CA) that's in the Lambda trust store. For a private CA/self signiertes Zertifikat sein. Sie konfigurieren das Root-CA-Zertifikat des Servers (als geheim in Secrets Manager). Lambda verwendet das Root-Zertifikat, um die Kafka-Broker zu verifizieren.

Weitere Informationen über mTLS finden Sie unter [Vorstellung von gegenseitiger TLS-Authentifizierung für Amazon MSK als Ereignisquelle](https://aws.amazon.com/blogs/compute/introducing-mutual-tls-authentication-for-amazon-msk-as-an-event-source).

## Konfigurieren des Client-Zertifikat-Secrets
<a name="smaa-auth-secret"></a>

Das Secret CLIENT\$1CERTIFICATE\$1TLS\$1AUTH erfordert ein Zertifikatfeld und ein Feld für einen privaten Schlüssel. Für einen verschlüsselten privaten Schlüssel erfordert das Secret ein Passwort für den privaten Schlüssel. Sowohl das Zertifikat als auch der private Schlüssel müssen im PEM-Format vorliegen.

**Anmerkung**  
Lambda unterstützt die Verschlüsselungsalgorithmen mit privaten Schlüsseln [PBES1](https://datatracker.ietf.org/doc/html/rfc2898/#section-6.1)(aber nicht PBES2).

Das Zertifikatfeld muss eine Liste von Zertifikaten enthalten, beginnend mit dem Client-Zertifikat, gefolgt von etwaigen Zwischenzertifikaten und endend mit dem Root-Zertifikat. Jedes Zertifikat muss in einer neuen Zeile mit der folgenden Struktur beginnen:

```
-----BEGIN CERTIFICATE-----  
            <certificate contents>
-----END CERTIFICATE-----
```

Secrets Manager unterstützt Secrets von bis zu 65 536 Bytes, was genügend Platz für lange Zertifikatsketten bietet.

Der private Schlüssel muss im Format [PKCS \$18](https://datatracker.ietf.org/doc/html/rfc5208) mit folgender Struktur vorliegen:

```
-----BEGIN PRIVATE KEY-----  
             <private key contents>
-----END PRIVATE KEY-----
```

Verwenden Sie für einen verschlüsselten privaten Schlüssel die folgende Struktur:

```
-----BEGIN ENCRYPTED PRIVATE KEY-----  
              <private key contents>
-----END ENCRYPTED PRIVATE KEY-----
```

Im folgenden Beispiel sehen Sie den Inhalt eines Secrets für mTLS-Authentifizierung mit einem verschlüsselten privaten Schlüssel. Fügen Sie für einen verschlüsselten privaten Schlüssel das Passwort für den privaten Schlüssel in das Secret ein.

```
{"privateKeyPassword":"testpassword",
"certificate":"-----BEGIN CERTIFICATE-----
MIIE5DCCAsygAwIBAgIRAPJdwaFaNRrytHBto0j5BA0wDQYJKoZIhvcNAQELBQAw
...
j0Lh4/+1HfgyE2KlmII36dg4IMzNjAFEBZiCRoPimO40s1cRqtFHXoal0QQbIlxk
cmUuiAii9R0=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFgjCCA2qgAwIBAgIQdjNZd6uFf9hbNC5RdfmHrzANBgkqhkiG9w0BAQsFADBb
...
rQoiowbbk5wXCheYSANQIfTZ6weQTgiCHCCbuuMKNVS95FkXm0vqVD/YpXKwA/no
c8PH3PSoAaRwMMgOSA2ALJvbRz8mpg==
-----END CERTIFICATE-----",
"privateKey":"-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFKzBVBgkqhkiG9w0BBQ0wSDAnBgkqhkiG9w0BBQwwGgQUiAFcK5hT/X7Kjmgp
...
QrSekqF+kWzmB6nAfSzgO9IaoAaytLvNgGTckWeUkWn/V0Ck+LdGUXzAC4RxZnoQ
zp2mwJn2NYB7AZ7+imp0azDZb+8YG2aUCiyqb6PnnA==
-----END ENCRYPTED PRIVATE KEY-----"
}
```

## Konfigurieren des Secrets des Server-Root-CA-Zertifikats
<a name="smaa-auth-ca-cert"></a>

Sie erstellen dieses Secret, wenn Ihre Kafka-Broker TLS-Verschlüsselung mit Zertifikaten verwenden, die von einer privaten CA signiert wurden. Sie können die TLS-Verschlüsselung für die VPC- SASL/SCRAM, SASL/PLAIN oder mTLS-Authentifizierung verwenden.

Das Secret des Server-Root-CA-Zertifikats erfordert ein Feld, das das Root-CA-Zertifikat des Kafka-Brokers im PEM-Format enthält. Das folgende Beispiel zeigt die Struktur des Secrets.

```
{"certificate":"-----BEGIN CERTIFICATE-----
MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dG...
-----END CERTIFICATE-----"
}
```

# Erstellen einer Lambda-Zuordnung von Ereignisquellen für eine selbstverwaltete Apache-Kafka-Ereignisquelle
<a name="kafka-esm-create"></a>

Zum Erstellen einer Zuordnung von Ereignisquellen können Sie die Lambda-Konsole, die [AWS Command Line Interface (CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) oder ein [AWS SDK](https://aws.amazon.com/getting-started/tools-sdks/) verwenden.

Mit den folgenden Schritten in der Konsole fügen Sie einen selbstverwalteten Apache-Kafka-Cluster als Auslöser für Ihre Lambda-Funktion hinzu. Im Hintergrund wird dadurch eine Zuordnung von Ereignisquellen erstellt.

## Voraussetzungen
<a name="kafka-esm-prereqs"></a>
+ Selbstverwaltetes Apache-Kafka-Cluster. Lambda unterstützt Apache Kafka Version 0.10.1.0 und höher.
+ Eine [Ausführungsrolle mit der](lambda-intro-execution-role.md) Berechtigung, auf die AWS Ressourcen zuzugreifen, die Ihr selbstverwalteter Kafka-Cluster verwendet.

## Hinzufügen eines selbstverwalteten Kafka-Clusters (Konsole)
<a name="kafka-esm-console"></a>

Befolgen Sie diese Schritte, um Ihren selbstverwalteten Apache-Kafka-Cluster und ein Kafka-Thema als Auslöser für Ihre Lambda-Funktion hinzuzufügen.

**So fügen Sie Ihrer Lambda-Funktion (Konsole) einen Apache-Kafka-Auslöser hinzu**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie den Namen Ihrer Lambda-Funktion aus.

1. Wählen Sie unter **Function overview (Funktionsübersicht)** die Option **Add trigger (Trigger hinzufügen)**.

1. Führen Sie unter **Auslöser-Konfiguration** die folgenden Schritte aus:

   1. Wählen Sie den **Apache-Kafka**-Auslösertyp.

   1. Geben Sie für **Bootstrap-Server** die Host- und Portpaaradresse eines Kafka-Brokers in Ihrem Cluster ein und wählen Sie dann **Hinzufügen**. Wiederholen Sie den Vorgang für jeden Kafka-Broker im Cluster.

   1. Geben Sie für **Themenname** den Namen des Kafka-Themas ein, das zum Speichern von Datensätzen im Cluster verwendet wird.

   1. Wenn Sie den Bereitstellungsmodus konfigurieren, geben Sie einen Wert für **Minimale Anzahl von Ereignisabfragen**, einen Wert für **Maximale Anzahl an Ereignisabfragen** und einen optionalen Wert ein, PollerGroupName um die Gruppierung mehrerer ESMs innerhalb derselben Ereignisquellen-VPC anzugeben.

   1. (Optional) Geben Sie für **Batchgröße** die maximale Anzahl von Datensätzen ein, die in einem einzelnen Batch empfangen werden sollen.

   1. Geben Sie für **Batch window** (Batch-Fenster) die maximale Zeit in Sekunden ein, die Lambda mit dem Sammeln von Datensätzen verbringt, bevor die Funktion aufgerufen wird.

   1. (Optional) Geben Sie für **Konsumentengruppen-ID** die ID einer Kafka-Konsumentengruppe ein, der Sie beitreten möchten.

   1. (Optional) Wählen Sie für **Startposition** die Option **Neueste**, um mit dem Lesen des Streams aus dem letzten Datensatz zu beginnen, **Horizont trimmen**, um mit dem frühesten verfügbaren Datensatz zu beginnen, oder **Am Zeitstempel**, um einen Zeitstempel anzugeben, ab dem mit dem Lesen begonnen werden soll.

   1. (Optional) Wählen Sie bei **VPC** die Amazon VPC für Ihren Kafka-Cluster aus. Wählen Sie dann **VPC subnets** (VPC-Subnetze) und **VPC security groups** (VPC-Sicherheitsgruppen) aus.

      Diese Einstellung ist erforderlich, wenn nur Benutzer innerhalb Ihrer VPC auf Ihre Broker zugreifen.

      

   1. (Optional) Wählen Sie bei **Authentication** (Authentifizierung) die Option **Add** (Hinzufügen) aus und gehen Sie dann folgendermaßen vor:

      1. Wählen Sie das Zugriffs- oder Authentifizierungsprotokoll der Kafka-Broker in Ihrem Cluster aus.
         + **Wenn Ihr Kafka-Broker Authentifizierung verwendet, wählen Sie BASIC\$1AUTH. SASL/PLAIN **
         + Wenn Ihr Broker SASL/SCRAM Authentifizierung verwendet, wählen Sie eines der Protokolle. **SASL\$1SCRAM**
         + Falls Sie die mTLS-Authentifizierung konfigurieren, wählen Sie das Protokoll **CLIENT\$1CERTIFICATE\$1TLS\$1AUTH** aus.

      1. Wählen Sie für SASL/SCRAM die mTLS-Authentifizierung den geheimen Schlüssel von Secrets Manager, der die Anmeldeinformationen für Ihren Kafka-Cluster enthält.

   1. (Optional) Wählen Sie bei **Encryption** (Verschlüsselung) das Secrets-Manager-Secret aus, das das Root-CA-Zertifikat enthält, das Ihre Kafka-Broker zur TLS-Verschlüsselung verwenden, falls Ihre Kafka-Broker von einer privaten Zertifizierungsstelle signierte Zertifikate verwenden.

      Diese Einstellung gilt für die TLS-Verschlüsselung für SASL/SCRAM oder SASL/PLAIN und für die mTLS-Authentifizierung.

   1. Um den Auslöser zu Testzwecken in einem deaktivierten Zustand zu erstellen (empfohlen), deaktivieren Sie **Auslöser aktivieren**. Um den Auslöser sofort zu aktivieren, wählen Sie **Auslöser aktivieren**.

1. Wählen Sie **hinzufügen** aus, um den Auslöser zu erstellen.

## Selbstverwaltetes Apache-Kafka-Cluster hinzufügen (AWS CLI)
<a name="kafka-esm-cli"></a>

Verwenden Sie die folgenden AWS CLI Beispielbefehle, um einen selbstverwalteten Apache Kafka-Trigger für Ihre Lambda-Funktion zu erstellen und anzuzeigen.

### Verwenden von SASL/SCRAM
<a name="kafka-esm-cli-create"></a>

Wenn Kafka-Benutzer über das Internet auf Ihre Kafka-Broker zugreifen, geben Sie das Secrets Manager Manager-Geheimnis an, das Sie für SASL/SCRAM die Authentifizierung erstellt haben. Im folgenden Beispiel wird der [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html) AWS CLI Befehl verwendet, um eine Lambda-Funktion mit dem Namen einem Kafka-Thema namens `my-kafka-function` zuzuordnen. `AWSKafkaTopic`

```
aws lambda create-event-source-mapping \ 
  --topics AWSKafkaTopic \
  --source-access-configuration Type=SASL_SCRAM_512_AUTH,URI=arn:aws:secretsmanager:us-east-1:111122223333:secret:MyBrokerSecretName \
  --function-name arn:aws:lambda:us-east-1:111122223333:function:my-kafka-function \
  --self-managed-event-source '{"Endpoints":{"KAFKA_BOOTSTRAP_SERVERS":["abc3.xyz.com:9092", "abc2.xyz.com:9092"]}}'
```

### Verwenden einer VPC
<a name="kafka-esm-cli-create-vpc"></a>

Wenn nur Kafka-Benutzer in Ihrer VPC auf Ihre Kafka-Broker zugreifen, müssen Sie Ihre VPC, Subnetze und VPC-Sicherheitsgruppe angeben. Im folgenden Beispiel wird der [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html) AWS CLI Befehl verwendet, um eine Lambda-Funktion mit dem Namen einem Kafka-Thema namens `my-kafka-function` zuzuordnen. `AWSKafkaTopic`

```
aws lambda create-event-source-mapping \ 
  --topics AWSKafkaTopic \
  --source-access-configuration '[{"Type": "VPC_SUBNET", "URI": "subnet:subnet-0011001100"}, {"Type": "VPC_SUBNET", "URI": "subnet:subnet-0022002200"}, {"Type": "VPC_SECURITY_GROUP", "URI": "security_group:sg-0123456789"}]' \
  --function-name arn:aws:lambda:us-east-1:111122223333:function:my-kafka-function \
  --self-managed-event-source '{"Endpoints":{"KAFKA_BOOTSTRAP_SERVERS":["abc3.xyz.com:9092", "abc2.xyz.com:9092"]}}'
```

### Den Status mit dem anzeigen AWS CLI
<a name="kafka-esm-cli-view"></a>

Im folgenden Beispiel wird der [get-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-event-source-mapping.html) AWS CLI Befehl verwendet, um den Status der von Ihnen erstellten Ereignisquellenzuordnung zu beschreiben.

```
aws lambda get-event-source-mapping
              --uuid dh38738e-992b-343a-1077-3478934hjkfd7
```

# Alle Konfigurationsparameter für selbstverwaltete Apache-Kafka-Ereignisquellen in Lambda
<a name="kafka-esm-parameters"></a>

Alle Lambda-Ereignisquelltypen verwenden dieselben [CreateEventSourceMapping[UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)API-Operationen. Allerdings gelten nur einige der Parameter für selbstverwaltetes Apache Kafka, wie in der folgenden Tabelle dargestellt.


| Parameter | Erforderlich | Standard | Hinweise | 
| --- | --- | --- | --- | 
|  BatchSize  |  N  |  100  |  Höchstwert: 10 000.  | 
|  DestinationConfig  |  N  |  –  |  [Erfassen verworfener Batches für Amazon MSK und selbstverwaltete Apache-Kafka-Ereignisquellen](kafka-on-failure.md)  | 
|  Aktiviert  |  N  |  Wahr  |  | 
|  FilterCriteria  |  N  |  –  |  [Steuern Sie, welche Ereignisse Lambda an Ihre Funktion sendet](invocation-eventfiltering.md)  | 
|  FunctionName  |  Y  |  –  |    | 
|  KMSKeyArn  |  N  |  –  |  [Verschlüsselung der Filterkriterien](invocation-eventfiltering.md#filter-criteria-encryption)  | 
|  MaximumBatchingWindowInSeconds  |  N  |  500 ms  |  [Batching-Verhalten](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching)  | 
|  ProvisionedPollersConfig  |  N  |  `MinimumPollers`: Standardwert von 1, wenn nicht angegeben `MaximumPollers`: Standardwert von 200, wenn nicht angegeben `PollerGroupName`: N/A  |  [Modus bereitgestellter Kapazität](kafka-scaling-modes.md#kafka-provisioned-mode)  | 
|  SelfManagedEventSource  |  Y  | – |  Liste der Kafka Broker. Kann nur auf „Erstellen“ festgelegt werden  | 
|  SelfManagedKafkaEventSourceConfig  |  N  |  Enthält das ConsumerGroupId Feld, das standardmäßig einen eindeutigen Wert hat.  |  Kann nur auf „Erstellen“ festgelegt werden  | 
|  SourceAccessConfigurations  |  N  |  Keine Anmeldeinformationen  |  VPC-Informationen oder Authentifizierungsanmeldeinformationen für den Cluster   Für SASL\$1PLAIN, auf BASIC\$1AUTH gesetzt  | 
|  StartingPosition  |  Y  |  –  |  AT\$1TIMESTAMP, TRIM\$1HORIZON, oder LATEST Kann nur auf „Erstellen“ festgelegt werden  | 
|  StartingPositionTimestamp  |  N  |  –  |  Erforderlich, wenn der Wert auf StartingPosition AT\$1TIMESTAMP gesetzt ist  | 
|  Tags (Markierungen)  |  N  |  –  |  [Verwendung von Tags für Zuordnungen von Ereignisquellen](tags-esm.md)  | 
|  Topics  |  Y  |  –  |  Themenname Kann nur auf „Erstellen“ festgelegt werden  | 

**Anmerkung**  
Wenn Sie a angeben`PollerGroupName`, können sich mehrere ESMs innerhalb derselben Amazon VPC die Kapazität der Event Poller Unit (EPU) teilen. Sie können diese Option verwenden, um die Kosten für den Bereitstellungsmodus für Sie zu optimieren. ESMs Anforderungen für die ESM-Gruppierung:  
ESMs muss sich in derselben Amazon VPC befinden
Maximal 100 ESMs pro Befragungsgruppe
Die Gesamtzahl der Befragten ESMs in einer Gruppe darf 2000 nicht überschreiten
Sie können den aktualisieren`PollerGroupName`, um einen ESM in eine andere Gruppe zu verschieben, oder einen ESM aus einer Gruppe entfernen, indem Sie ihn `PollerGroupName` auf eine leere Zeichenfolge („“) setzen.

# Skalierungsmodi des Ereignis-Pollers von Apache Kafka in Lambda
<a name="kafka-scaling-modes"></a>

Sie können zwischen zwei Skalierungsmodi von Ereignis-Pollern für Zuordnungen von Ereignisquellen von Amazon MSK und selbstverwaltetem Apache Kafka wählen.
+ [On-Demand-Modus (Standard)](#kafka-default-mode)
+ [Modus bereitgestellter Kapazität](#kafka-provisioned-mode)

## On-Demand-Modus (Standard)
<a name="kafka-default-mode"></a>

Wenn Sie zuerst eine Kafka-Ereignisquelle erstellen, weist Lambda eine Standardanzahl von Ereignis-Pollern zu, um alle Partitionen im Kafka-Thema zu verarbeiten. Lambda erhöht oder verringert automatisch die Anzahl der [Ereignis-Poller](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode) je nach Nachrichtenlast.

In Intervallen von einer Minute wertet Lambda den Offset-Lag aller Partitionen des Themas aus. Wenn die Offset-Verzögerung zu hoch ist, empfängt die Partition Nachrichten schneller als Lambda sie verarbeiten kann. Falls erforderlich, fügt Lambda dem Thema Ereignis-Poller hinzu oder entfernt sie. Dieser Prozess der automatischen Skalierung durch Hinzufügen oder Entfernen von Ereignis-Pollern erfolgt innerhalb von drei Minuten nach der Auswertung.

Wenn Ihre Ziel-Lambda-Funktion gedrosselt ist, reduziert Lambda die Anzahl der Ereignis-Poller. Diese Aktion verringert den Workload der Funktion, indem sie die Anzahl der Nachrichten reduziert, die Ereignis-Poller abrufen und an die Funktion senden können.

## Modus bereitgestellter Kapazität
<a name="kafka-provisioned-mode"></a>

Für Workloads, bei denen Sie den Durchsatz Ihrer Zuordnung von Ereignisquellen optimieren müssen, können Sie den Bereitstellungsmodus verwenden. Im Bereitstellungsmodus definieren Sie Mindest- und Höchstgrenzen für die Anzahl der bereitgestellten Ereignis-Poller. Diese bereitgestellten Event-Poller sind auf Ihre Zuordnung von Ereignisquellen ausgerichtet und können unerwartete Nachrichtenspitzen durch reaktionsschnelle Autoskalierung bewältigen. Wir empfehlen die Verwendung des Bereitstellungsmodus für Kafka-Workloads, die strenge Leistungsanforderungen haben.

In Lambda ist ein Event Poller eine Recheneinheit mit Durchsatzmöglichkeiten, die je nach Art der Ereignisquelle variieren. Bei Amazon MSK und selbstverwaltetem Apache Kafka kann jeder Event Poller bis zu 5% MB/sec des Durchsatzes oder bis zu 5 gleichzeitige Aufrufe verarbeiten. Wenn Ihre Ereignisquelle beispielsweise eine durchschnittliche Nutzlast von 1 MB erzeugt und die durchschnittliche Dauer Ihrer Funktion 1 Sekunde beträgt, kann ein einziger Kafka-Event-Poller 5 MB/sec Durchsatz- und 5 gleichzeitige Lambda-Aufrufe unterstützen (vorausgesetzt, es gibt keine Payload-Transformation). Für Amazon SQS kann jeder Event Poller bis zu 1 MB/sec Durchsatz oder bis zu 10 gleichzeitige Aufrufe verarbeiten. Bei der Verwendung des Bereitstellungsmodus fallen zusätzliche Kosten an, die von Ihrer Nutzung des Event-Pollers abhängen. Details zu den Preisen finden Sie unter [AWS Lambda -Preise](https://aws.amazon.com/lambda/pricing/).

**Anmerkung**  
Wenn Sie den Bereitstellungsmodus verwenden, müssen Sie im Rahmen Ihrer Netzwerkkonfiguration keine AWS PrivateLink VPC-Endpoints erstellen oder die zugehörigen Berechtigungen gewähren.

Im Bereitstellungsmodus liegt der Bereich der akzeptierten Werte für die Mindestanzahl der Ereignis-Poller (`MinimumPollers`) zwischen 1 und 200 (einschließlich). Der Bereich der akzeptierten Werte für die maximale Anzahl von Event-Pollern (`MaximumPollers`) liegt zwischen 1 und einschließlich 2.000. `MaximumPollers` muss größer als oder gleich `MinimumPollers` sein. Um eine geordnete Verarbeitung innerhalb der Partitionen zu gewährleisten, begrenzt Lambda das `MaximumPollers` auf die Anzahl der Partitionen im Thema.

Weitere Einzelheiten zur Auswahl geeigneter Werte für minimale und maximale Ereignis-Poller finden Sie unter [Best Practices](#kafka-provisioned-mode-bp).

Sie können den Bereitstellungsmodus für Ihre Kafka-Zuordnung von Ereignisquellen über die Konsole oder die Lambda-API konfigurieren.

**Konfigurieren des Bereitstellungsmodus für eine vorhandene Zuordnung von Ereignisquellen (Konsole)**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion mit der Zuordnung von Ereignisquellen aus, für die Sie den Bereitstellungsmodus konfigurieren möchten.

1. Wählen Sie **Konfiguration** und anschließend **Auslöser** aus.

1. Wählen Sie die Zuordnung von Ereignisquellen, für die Sie den Bereitstellungsmodus konfigurieren möchten, und wählen Sie dann **Bearbeiten**.

1. Wählen Sie unter **Bereitstellungsmodus** die Option **Konfigurieren** aus.
   + Geben Sie für **Minimum Event Pollers** einen Wert zwischen 1 und 200 ein. Wenn Sie keinen Wert angeben, wählt Lambda einen Standardwert von 1.
   + Geben Sie für **Maximum Event Pollers** einen Wert zwischen 1 und 2000 ein. Dieser Wert muss größer oder gleich Ihrem Wert für **Minimum Event Pollers** sein. Wenn Sie keinen Wert angeben, wählt Lambda einen Standardwert von 200.

1. Wählen Sie **Speichern**.

Sie können den Bereitstellungsmodus programmgesteuert mithilfe des Objekts in Ihrem konfigurieren. [ProvisionedPollerConfig[ EventSourceMappingConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_EventSourceMappingConfiguration.html)](https://docs.aws.amazon.com/lambda/latest/api/API_ProvisionedPollerConfig.html) Der folgende [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)CLI-Befehl konfiguriert beispielsweise einen `MinimumPollers` Wert von 5 und einen `MaximumPollers` Wert von 100.

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --provisioned-poller-config '{"MinimumPollers": 5, "MaximumPollers": 100}'
```

Nachdem Sie den Bereitstellungsmodus konfiguriert haben, können Sie die Verwendung von Event-Pollern für Ihren Workload beobachten, indem Sie die `ProvisionedPollers`-Metrik überwachen. Weitere Informationen finden Sie unter [Metriken zur Zuordnung von Ereignisquellen](monitoring-metrics-types.md#event-source-mapping-metrics).

Um den Bereitstellungsmodus zu deaktivieren und zum Standardmodus (auf Abruf) zurückzukehren, können Sie den folgenden [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)CLI-Befehl verwenden:

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --provisioned-poller-config '{}'
```

## Erweiterte Funktionen zur Fehlerbehandlung und Leistung
<a name="services-kafka-advanced-features"></a>

Für Kafka-Ereignisquellenzuordnungen mit aktiviertem Bereitstellungsmodus können Sie zusätzliche Funktionen konfigurieren, um die Fehlerbehandlung und Leistung zu verbessern:
+ [Wiederholungskonfigurationen — Steuern Sie](kafka-retry-configurations.md), wie Lambda mit fehlgeschlagenen Datensätzen umgeht, indem Sie maximale Wiederholungsversuche, Altersbeschränkungen für Datensätze, Batch-Splitting und partielle Batch-Antworten festlegen.
+ [Kafka-Ziele bei einem Ausfall](kafka-on-failure-destination.md) — Senden Sie fehlgeschlagene Datensätze zur späteren Verarbeitung oder Analyse an ein Kafka-Thema.

## Bewährte Verfahren und Überlegungen bei der Verwendung des Bereitstellungsmodus
<a name="kafka-provisioned-mode-bp"></a>

Die optimale Konfiguration der minimalen und maximalen Ereignispoller für Ihre Zuordnung von Ereignisquellen hängt von den Leistungsanforderungen Ihrer Anwendung ab. Wir empfehlen Ihnen, mit den standardmäßigen Minimum Event Pollers zu beginnen, um das Leistungsprofil zu erstellen. Passen Sie Ihre Konfiguration auf der Grundlage der beobachteten Nachrichtenverarbeitungsmuster und Ihres gewünschten Leistungsprofils an.

Erhöhen Sie bei Workloads mit starkem Datenverkehr und strengen Leistungsanforderungen die Mindestanzahl der Event-Poller, um plötzliche Nachrichtenfluten zu bewältigen. Um zu ermitteln, wie viele Event-Poller mindestens erforderlich sind, sollten Sie die Nachrichten pro Sekunde Ihres Workloads und die durchschnittliche Payload-Größe berücksichtigen und die Durchsatzkapazität eines einzelnen Event-Pollers (bis zu 5) als Referenz verwenden. MBps

Um eine geordnete Verarbeitung innerhalb einer Partition aufrechtzuerhalten, begrenzt Lambda die maximale Anzahl der Event-Poller auf die Anzahl der Partitionen im Thema. Darüber hinaus hängt die maximale Anzahl von Event-Pollern, auf die Ihr Zuordnung von Ereignisquellen skaliert werden kann, von den Gleichzeitigkeitseinstellungen der Funktion ab.

Wenn Sie den Bereitstellungsmodus aktivieren, aktualisieren Sie Ihre Netzwerkeinstellungen, um AWS PrivateLink VPC-Endpunkte und zugehörige Berechtigungen zu entfernen.

## Kostenoptimierung für den Bereitstellungsmodus
<a name="kafka-cost-optimization"></a>

### Preisgestaltung im Bereitstellungsmodus
<a name="kafka-provisioned-pricing"></a>

Der Bereitstellungsmodus wird auf der Grundlage der bereitgestellten Mindestanzahl an Event-Pollern und der Anzahl der während der automatischen Skalierung verbrauchten Event-Poller berechnet. Die Gebühren werden anhand einer Abrechnungseinheit berechnet, die als Event Poller Unit (EPU) bezeichnet wird. Sie zahlen für die Anzahl und Dauer der EPUs Nutzung, gemessen in. Event-Poller-Unit-hours Sie können den Bereitstellungsmodus entweder mit einem einzigen ESM für leistungssensitive Anwendungen verwenden oder Sie können mehrere ESMs innerhalb derselben VPC gruppieren, um EPU-Kapazität und Kosten gemeinsam zu nutzen. Wir werden uns eingehend mit zwei Funktionen befassen, mit denen Sie Ihre Kosten für den Bereitstellungsmodus optimieren können. Preisdetails finden Sie unter [AWS Lambda-Preise](https://aws.amazon.com/lambda/pricing/).

### Verbesserte EPU-Nutzung
<a name="kafka-enhanced-epu-utilization"></a>

Jede EPU unterstützt bis zu 20 MB/s Durchsatzkapazitäten für Ereignisabfragen und unterstützt standardmäßig 10 Ereignisabfragen. Wenn Sie einen Bereitstellungsmodus für Kafka ESM erstellen, indem Sie Mindest- und Höchstwerte für Poller festlegen, wird für die Bereitstellung eine Mindestanzahl von Pollern verwendet, EPUs basierend auf der Standardeinstellung von 10 Event-Pollern pro EPU. Jeder Event-Poller kann jedoch unabhängig skaliert werden, um bis zu 5% MB/s der Durchsatzkapazität zu unterstützen, was möglicherweise eine geringere Dichte von Event-Pollern auf einer bestimmten EPU erfordert und eine Skalierung von auslösen kann. EPUs Die Anzahl der Event Poller, die einer EPU zugewiesen sind, hängt von der Rechenkapazität ab, die von jedem Event Poller verbraucht wird. Dieser Ansatz der verbesserten EPU-Nutzung ermöglicht es Event-Pollern mit unterschiedlichen Durchsatzanforderungen, die EPU-Kapazität effektiv zu nutzen und so die Kosten für alle zu senken. ESMs

### ESM-Gruppierung
<a name="kafka-esm-grouping-cost"></a>

Um Ihre Kosten für den Bereitstellungsmodus weiter zu optimieren, können Sie mehrere Kafka gruppieren, um die EPU-Kapazität gemeinsam ESMs zu nutzen. Mit ESM-Gruppierung und verbesserter EPU-Nutzung können Sie die Kosten für Workloads mit geringem Durchsatz im Bereitstellungsmodus um bis zu 90% senken, verglichen mit der Ausführung im ESM-Modus. Alle ESMs , die weniger als 1 EPU-Kapazität benötigen, profitieren von der ESM-Gruppierung. Für solche Anwendungen sind ESMs in der Regel nur wenige Mindestanzahl an Event-Pollern erforderlich, um ihren Durchsatzbedarf zu decken. Mit dieser Funktion können Sie den Bereitstellungsmodus für all Ihre Kafka-Workloads verwenden und von Funktionen wie Schemavalidierung, Filterung von Avro/Protobuf Ereignissen, Aufrufen mit geringer Latenz und verbesserter Fehlerbehandlung profitieren, die nur im Bereitstellungsmodus verfügbar sind.

Wenn Sie den `PollerGroupName` Parameter mit demselben Wert für mehrere ESMs innerhalb derselben Amazon VPC konfigurieren, ESMs teilen sich diese EPU-Ressourcen, anstatt jeweils eine eigene EPU-Kapazität zu benötigen. Sie können bis zu 100 ESMs pro Abfragergruppe gruppieren, wobei die maximale Gesamtzahl der Abfragenden ESMs in einer Gruppe 2000 nicht überschreiten darf.

#### So konfigurieren Sie die ESM-Gruppierung (Konsole)
<a name="kafka-esm-grouping-console-cost"></a>

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie Ihre Funktion.

1. Wählen Sie **Konfiguration** und anschließend **Auslöser** aus.

1. **Wenn Sie eine neue Kafka-Ereignisquellenzuordnung erstellen oder eine bestehende bearbeiten, wählen Sie im Bereitstellungsmodus die Option **Konfigurieren** aus.**

1. Geben Sie für **Minimum Event Pollers** einen Wert zwischen 1 und 200 ein.

1. Geben Sie für **Maximum Event Pollers** einen Wert zwischen 1 und 2000 ein.

1. Geben Sie **unter Poller-Gruppenname** einen Bezeichner für die Gruppe ein. Verwenden Sie denselben Namen für andere Personen, die ESMs Sie gruppieren möchten.

1. Wählen Sie **Speichern**.

#### So konfigurieren Sie die ESM-Gruppierung (CLI)AWS
<a name="kafka-esm-grouping-cli-cost"></a>

Im folgenden Beispiel wird ein ESM mit einer Poller-Gruppe namens erstellt: `production-app-group`

```
aws lambda create-event-source-mapping \
  --function-name myFunction1 \
  --event-source-arn arn:aws:kafka:us-east-1:123456789012:cluster/MyCluster/abcd1234 \
  --topics topic1 \
  --starting-position LATEST \
  --provisioned-poller-config '{
    "MinimumPollers": 1, 
    "MaximumPollers": 10, 
    "PollerGroupName": "production-app-group"
  }'
```

Um derselben Gruppe einen weiteren ESM hinzuzufügen (mit gemeinsamer EPU-Kapazität), verwenden Sie dasselbe: PollerGroupName

```
aws lambda create-event-source-mapping \
  --function-name myFunction2 \
  --event-source-arn arn:aws:kafka:us-east-1:123456789012:cluster/MyCluster/abcd1234 \
  --topics topic2 \
  --starting-position LATEST \
  --provisioned-poller-config '{
    "MinimumPollers": 1, 
    "MaximumPollers": 10, 
    "PollerGroupName": "production-app-group"
  }'
```

**Anmerkung**  
Sie können den aktualisieren`PollerGroupName`, um einen ESM in eine andere Gruppe zu verschieben, oder einen ESM aus einer Gruppe entfernen, indem Sie eine leere Zeichenfolge („“) übergeben für: `PollerGroupName`

```
# Move ESM to a different group
aws lambda update-event-source-mapping \
  --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
  --provisioned-poller-config '{
    "MinimumPollers": 1, 
    "MaximumPollers": 10, 
    "PollerGroupName": "new-group-name"
  }'

# Remove ESM from group (use dedicated resources)
aws lambda update-event-source-mapping \
  --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
  --provisioned-poller-config '{
    "MinimumPollers": 1, 
    "MaximumPollers": 10, 
    "PollerGroupName": ""
  }'
```

#### Überlegungen zur Gruppierungsstrategie
<a name="kafka-grouping-strategy-considerations"></a>
+ **Anwendungsgrenze** — Gruppen ESMs , die zu denselben Anwendungen oder Diensten gehören, um die Kosten besser verteilen und verwalten zu können. Erwägen Sie die Verwendung von Namenskonventionen wie `app-name-environment` (z. B.`order-processor-prod`).
+ **Verkehrsmuster** — Vermeiden Sie Gruppierungen ESMs mit hohem Durchsatz und starken Datenverkehrsmustern, da dies zu Ressourcenkonflikten führen kann.
+ **Explosionsradius** — Berücksichtigen Sie die Auswirkungen, wenn Probleme mit der gemeinsam genutzten Infrastruktur auftreten. Alle ESMs Mitglieder derselben Gruppe sind von Beschränkungen gemeinsam genutzter Ressourcen betroffen. Für geschäftskritische Workloads möchten Sie möglicherweise separate oder dedizierte Gruppen verwenden. ESMs

#### Beispiel für Kostenoptimierung
<a name="kafka-cost-optimization-example"></a>

Stellen Sie sich ein Szenario vor, in dem Sie 10 haben ESMs, die jeweils mit einem Event Poller und einem Durchsatz von unter 2 MB/s konfiguriert sind:

**Ohne Gruppierung:**
+ Jeder ESM benötigt eine eigene EPU
+ Insgesamt EPUs benötigt: 10
+ Kosten pro EPU: 0,185 USD/Stunde in USA Ost (Nord-Virginia)
+ Monatliche EPU-Kosten (720 Stunden): 10 × 720 × 0,185\$1 = 1.332\$1

**Mit Gruppierung:**
+ Alle 10 ESMs teilen sich die EPU-Kapazität
+ 10 Event-Poller passen in 1 EPU (mit neuer Unterstützung für 10 Poller pro EPU)
+ Insgesamt benötigt: 1 EPUs 
+ Monatliche EPU-Kosten (720 Stunden): 1 × 720 × 0,185\$1 = 133,20\$1
+ **Kosteneinsparungen: 90% (Einsparungen von 1.198,80 USD pro** Monat)

# Apache-Kafka-Abfrage und Stream-Startpositionen in Lambda
<a name="kafka-starting-positions"></a>

Der [StartingPosition](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-StartingPosition)-Parameter teilt Lambda mit, wann mit dem Lesen von Nachrichten aus Ihrem Stream von Amazon MSK oder selbstverwaltetem Apache Kafka begonnen werden soll. Es stehen drei Optionen zur Auswahl:
+ **Neueste** – Lambda beginnt unmittelbar nach dem neuesten Datensatz im Kafka-Thema mit dem Lesen.
+ **Horizont trimmen** –Lambda beginnt ab dem letzten ungetrimmten Datensatz im Kafka-Thema mit dem Lesen. Dies ist auch der älteste Datensatz im Thema.
+ **Am Zeitstempel** – Lambda beginnt an einer durch einen Zeitstempel definierten Position in Unix-Zeitsekunden mit dem Lesen. Verwenden Sie den Parameter [StartingPositionTimeStamp](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-StartingPositionTimestamp), um den Zeitstempel anzugeben.

Die Stream-Abfrage während der Erstellung oder Aktualisierung einer Zuordnung von Ereignisquellen ist letztendlich konsistent:
+ Bei der Erstellung der Zuordnung von Ereignisquellen kann es mehrere Minuten dauern, bis mit der Abfrage von Ereignissen aus dem Stream begonnen wird.
+ Während Aktualisierungen der Zuordnung von Ereignisquellen kann es bis zu 90 Sekunden dauern, bis die Abfrage von Ereignissen aus dem Stream gestoppt und neu gestartet wird.

Dieses Verhalten bedeutet, dass die Zuordnung von Ereignisquellen Ereignisse während der Erstellung oder Aktualisierung verpassen könnte, wenn Sie `LATEST` als Startposition für den Stream angeben. Um sicherzustellen, dass keine Ereignisse verpasst werden, geben Sie entweder `TRIM_HORIZON` oder `AT_TIMESTAMP` an.

# Anpassbare Verbrauchergruppen-ID in Lambda
<a name="kafka-consumer-group-id"></a>

Wenn Sie Amazon MSK oder selbstverwaltetes Apache Kafka als Quelle einrichten, können Sie eine [Verbrauchergruppen](https://developer.confluent.io/learn-more/kafka-on-the-go/consumer-groups/)-ID angeben. Diese Verbrauchergruppen-ID ist eine vorhandene Kennung für die Kafka-Verbrauchergruppe, der Ihre Lambda-Funktion beitreten soll. Mit diesem Feature können Sie alle laufenden Kafka-Datensatzverarbeitungs-Setups nahtlos von anderen Verbrauchern auf Lambda migrieren.

Kafka verteilt Nachrichten an alle Verbraucher in einer Verbrauchergruppe. Wenn Sie eine Verbrauchergruppen-ID angeben, die andere aktive Verbraucher hat, empfängt Lambda nur einen Teil der Nachrichten aus dem Kafka-Thema. Wenn Sie möchten, dass Lambda alle Nachrichten im Thema verarbeitet, deaktivieren Sie alle anderen Verbraucher in dieser Verbrauchergruppe.

Wenn Sie außerdem eine Verbrauchergruppen-ID angeben und Kafka eine gültige vorhandene Verbrauchergruppe mit derselben ID findet, ignoriert Lambda die [StartingPosition](kafka-starting-positions.md) für Ihre Zuordnung von Ereignisquellen. Stattdessen beginnt Lambda mit der Verarbeitung von Datensätzen gemäß dem zugesagten Versatz der Konsumentengruppe. Wenn Sie eine Konsumentengruppen-ID angeben und Kafka keine vorhandene Konsumentengruppe finden kann, konfiguriert Lambda Ihre Ereignisquelle mit der angegebenen `StartingPosition`.

Die Konsumentengruppen-ID, die Sie angeben, muss unter all Ihren Kafka-Ereignisquellen eindeutig sein. Nachdem Sie eine Kafka-Ereignisquellenzuordnung mit der angegebenen Konsumentengruppen-ID erstellt haben, können Sie diesen Wert nicht aktualisieren.

# Filtern von Ereignissen aus Amazon MSK und selbstverwalteten Apache-Kafka-Ereignisquellen
<a name="kafka-filtering"></a>

Sie können die Ereignisfilterung verwenden, um zu steuern, welche Datensätze aus einem Stream oder einer Warteschlange Lambda an Ihre Funktion sendet. Allgemeine Informationen über die Funktionsweise der Ereignisfilterung finden Sie unter [Steuern Sie, welche Ereignisse Lambda an Ihre Funktion sendet](invocation-eventfiltering.md).

**Anmerkung**  
Zuordnungen von Ereignisquellen von Amazon MSK und selbstverwaltetem Apache Kafka unterstützen nur die Filterung nach dem Schlüssel `value`.

**Topics**
+ [

## Grundlagen der Kafka-Ereignisfilterung
](#filtering-kafka)

## Grundlagen der Kafka-Ereignisfilterung
<a name="filtering-kafka"></a>

Angenommen, ein Producer schreibt Nachrichten zu einem Thema in Ihrem Kafka-Cluster, entweder im gültigen JSON-Format oder als einfache Zeichenfolgen. Ein Beispieldatensatz würde wie folgt aussehen, wobei die Nachricht im `value`-Feld in eine Base64-kodierte Zeichenfolge umgewandelt wurde.

```
{
    "mytopic-0":[
        {
            "topic":"mytopic",
            "partition":0,
            "offset":15,
            "timestamp":1545084650987,
            "timestampType":"CREATE_TIME",
            "value":"SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
            "headers":[]
        }
    ]
}
```

Angenommen, Ihr Apache-Kafka-Producer schreibt Nachrichten zu Ihrem Thema im folgenden JSON-Format.

```
{
    "device_ID": "AB1234",
    "session":{
        "start_time": "yyyy-mm-ddThh:mm:ss",
        "duration": 162
    }
}
```

Sie können den `value`-Schlüssel verwenden, um Datensätze zu filtern. Angenommen, Sie möchten nur die Datensätze filtern, bei denen `device_ID` mit den Buchstaben AB beginnen. Das `FilterCriteria`-Objekt würde wie folgt aussehen.

```
{
    "Filters": [
        {
            "Pattern": "{ \"value\" : { \"device_ID\" : [ { \"prefix\": \"AB\" } ] } }"
        }
    ]
}
```

Zur Verdeutlichung sehen Sie hier den Wert des Filter-`Pattern` in reinem JSON.

```
{
    "value": {
        "device_ID": [ { "prefix": "AB" } ]
      }
}
```

Sie können Ihren Filter mithilfe der Konsole, AWS CLI oder einer AWS SAM-Vorlage hinzufügen.

------
#### [ Console ]

Um diesen Filter mithilfe der Konsole hinzuzufügen, folgen Sie den Anweisungen unter [Anhängen von Filterkriterien an eine Ereignisquellenzuordnung (Konsole)](invocation-eventfiltering.md#filtering-console) und geben Sie die folgende Zeichenfolge für die **Filterkriterien** ein.

```
{ "value" : { "device_ID" : [ { "prefix":  "AB" } ] } }
```

------
#### [ AWS CLI ]

Um eine neue Zuordnung von Ereignisquellen mit diesen Filterkriterien über die AWS Command Line Interface (AWS CLI) zu erstellen, führen Sie den folgenden Befehl aus.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:kafka:us-east-2:123456789012:cluster/my-cluster/b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"value\" : { \"device_ID\" : [ { \"prefix\":  \"AB\" } ] } }"}]}'
```

Führen Sie den folgenden Befehl aus, um diese Filterkriterien zu einer vorhandenen Zuordnung von Ereignisquellen hinzuzufügen.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"value\" : { \"device_ID\" : [ { \"prefix\":  \"AB\" } ] } }"}]}'
```

------
#### [ AWS SAM ]

Um diesen Filter mit der AWS SAM hinzuzufügen, fügen Sie das folgende Snippet zur YAML-Vorlage für Ihre Ereignisquelle hinzu.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "value" : { "device_ID" : [ { "prefix":  "AB" } ] } }'
```

------

Mit Kafka können Sie auch Datensätze filtern, bei denen die Nachricht eine einfache Zeichenfolge ist. Angenommen, Sie möchten die Meldungen ignorieren, in denen die Zeichenfolge „error“ ist. Das `FilterCriteria`-Objekt würde wie folgt aussehen.

```
{
    "Filters": [
        {
            "Pattern": "{ \"value\" : [ { \"anything-but\": [ \"error\" ] } ] }"
        }
    ]
}
```

Zur Verdeutlichung sehen Sie hier den Wert des Filter-`Pattern` in reinem JSON.

```
{
    "value": [
        {
        "anything-but": [ "error" ]
        }
    ]
}
```

Sie können Ihren Filter mithilfe der Konsole, AWS CLI oder einer AWS SAM-Vorlage hinzufügen.

------
#### [ Console ]

Um diesen Filter mithilfe der Konsole hinzuzufügen, folgen Sie den Anweisungen unter [Anhängen von Filterkriterien an eine Ereignisquellenzuordnung (Konsole)](invocation-eventfiltering.md#filtering-console) und geben Sie die folgende Zeichenfolge für die **Filterkriterien** ein.

```
{ "value" : [ { "anything-but": [ "error" ] } ] }
```

------
#### [ AWS CLI ]

Um eine neue Zuordnung von Ereignisquellen mit diesen Filterkriterien über die AWS Command Line Interface (AWS CLI) zu erstellen, führen Sie den folgenden Befehl aus.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:kafka:us-east-2:123456789012:cluster/my-cluster/b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"value\" : [ { \"anything-but\": [ \"error\" ] } ] }"}]}'
```

Führen Sie den folgenden Befehl aus, um diese Filterkriterien zu einer vorhandenen Zuordnung von Ereignisquellen hinzuzufügen.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"value\" : [ { \"anything-but\": [ \"error\" ] } ] }"}]}'
```

------
#### [ AWS SAM ]

Um diesen Filter mit der AWS SAM hinzuzufügen, fügen Sie das folgende Snippet zur YAML-Vorlage für Ihre Ereignisquelle hinzu.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "value" : [ { "anything-but": [ "error" ] } ] }'
```

------

Kafka-Nachrichten müssen UTF-8-codierte Zeichenfolgen sein (entweder einfache Zeichenfolgen oder im JSON-Format). Das liegt daran, dass Lambda Byte-Arrays von Kafka vor Anwendung der Filterkriterien in UTF-8 dekodiert. Wenn Ihre Nachrichten eine andere Kodierung nutzen, z. B. UTF-16 oder ASCII, oder das Nachrichtenformat nicht dem `FilterCriteria`-Format entspricht, verarbeitet Lambda nur Metadatenfilter. In der folgenden Tabelle ist das Verhalten zusammengefasst:


| -Format der eingehenden Nachricht | Filtermusterformat für Nachrichteneigenschaften | Resultierende Aktion | 
| --- | --- | --- | 
|  Einfache Zeichenfolge  |  Einfache Zeichenfolge  |  Lambda filtert basierend auf Ihren Filterkriterien.  | 
|  Einfache Zeichenfolge  |  Kein Filtermuster für Dateneigenschaften  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Einfache Zeichenfolge  |  Gültiges JSON  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Gültiges JSON  |  Einfache Zeichenfolge  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Gültiges JSON  |  Kein Filtermuster für Dateneigenschaften  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Gültiges JSON  |  Gültiges JSON  |  Lambda filtert basierend auf Ihren Filterkriterien.  | 
|  Nicht UTF-8-kodierte Zeichenfolge  |  JSON, einfache Zeichenfolge oder kein Muster  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 

# Verwenden von Schemaregistern mit Kafka-Ereignisquellen in Lambda
<a name="services-consume-kafka-events"></a>

 Schemaregister unterstützen Sie bei der Definition und Verwaltung von Datenstromschemas. Ein Schema definiert die Struktur und das Format eines Datensatzes. Im Zusammenhang mit Zuordnungen von Kafka-Ereignisquellen können Sie eine Schemaregistrierung konfigurieren, um die Struktur und das Format von Kafka-Nachrichten anhand vordefinierter Schemas zu validieren, bevor sie Ihre Lambda-Funktion erreichen. Dies erweitert Ihre Anwendung um eine Ebene der Daten-Governance und ermöglicht Ihnen die effiziente Verwaltung von Datenformaten, die Sicherstellung der Schema-Compliance und die Kostenoptimierung durch Ereignisfilterung. 

 Dieses Feature ist mit allen Programmiersprachen kompatibel, jedoch sollten Sie folgende wichtige Punkte beachten: 
+ Powertools for Lambda bietet spezifische Unterstützung für Java, Python und TypeScript gewährleistet die Konsistenz mit bestehenden Kafka-Entwicklungsmustern und ermöglicht den direkten Zugriff auf Geschäftsobjekte ohne benutzerdefinierten Deserialisierungscode.
+ Dieses Feature ist nur für Zuordnungen von Ereignisquellen im Bereitstellungsmodus verfügbar. Die Schemaregistrierung unterstützt keine Zuordnungen von Ereignisquellen im On-Demand-Modus. Wenn Sie den Bereitstellungsmodus verwenden und eine Schemaregistrierung konfiguriert haben, können Sie nicht in den On-Demand-Modus wechseln, es sei denn, Sie entfernen zuvor Ihre Schemaregistrierungskonfiguration. Weitere Informationen finden Sie unter [Modus bereitgestellter Kapazität](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode).
+ Sie können nur eine Schemaregistrierung pro Zuordnung von Ereignisquellen (Event Source Mapping, (ESM) konfigurieren. Die Verwendung einer Schemaregistrierung mit Ihrer Kafka-Ereignisquelle kann zu einer erhöhten Nutzung Ihrer Lambda Event Poller Unit (EPU) führen, die eine Preisdimension für den Bereitstellungsmodus darstellt. 

**Topics**
+ [

## Optionen für die Schemaregistrierung
](#services-consume-kafka-events-options)
+ [

## So führt Lambda die Schemavalidierung für Kafka-Nachrichten durch
](#services-consume-kafka-events-how)
+ [

## Konfiguration einer Kafka-Schemaregistrierung
](#services-consume-kafka-events-config)
+ [

## Filterung nach Avro und Protobuf
](#services-consume-kafka-events-filtering)
+ [

## Nutzdatenformate und Deserialisierungsverhalten
](#services-consume-kafka-events-payload)
+ [

## Arbeiten mit deserialisierten Daten in Lambda-Funktionen
](#services-consume-kafka-events-payload-examples)
+ [

## Authentifizierungsmethoden für Ihre Schemaregistrierung
](#services-consume-kafka-events-auth)
+ [

## Fehlerbehandlung und -behebung bei Problemen mit der Schemaregistrierung
](#services-consume-kafka-events-troubleshooting)

## Optionen für die Schemaregistrierung
<a name="services-consume-kafka-events-options"></a>

 Lambda unterstützt die folgenden Optionen für die Schemaregistrierung: 
+ [AWS Glue Schemaregistrierung](https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html)
+ [Confluent-Cloud-Schemaregistrierung](https://docs.confluent.io/platform/current/schema-registry/index.html)
+ [Selbstverwaltete Confluent-Schemaregistrierung](https://docs.confluent.io/platform/current/schema-registry/index.html)

 Ihre Schemaregistrierung unterstützt die Validierung von Nachrichten in den folgenden Datenformaten: 
+ Apache Avro
+ Protokollpuffer (Protobuf)
+ JSON-Schema (JSON-SE)

 Um eine Schemaregistrierung zu verwenden, stellen Sie zunächst sicher, dass sich Ihre Zuordnung von Ereignisquellen im Bereitstellungsmodus befindet. Wenn Sie eine Schemaregistrierung verwenden, fügt Lambda Metadaten zum Schema zu den Nutzdaten hinzu. Weitere Informationen finden Sie unter [Nutzdatenformate und Deserialisierungsverhalten](#services-consume-kafka-events-payload). 

## So führt Lambda die Schemavalidierung für Kafka-Nachrichten durch
<a name="services-consume-kafka-events-how"></a>

 Wenn Sie eine Schemaregistrierung konfigurieren, führt Lambda für jede Kafka-Nachricht die folgenden Schritte aus: 

1. Lambda fragt den Kafka-Datensatz aus Ihrem Cluster ab.

1. Lambda validiert ausgewählte Nachrichtenattribute im Datensatz anhand eines bestimmten Schemas in Ihrer Schemaregistrierung.
   + Wenn das der Nachricht zugeordnete Schema nicht in der Registrierung gefunden wird, sendet Lambda die Nachricht mit dem Ursachencode `SCHEMA_NOT_FOUND` an eine DLQ.

1. Lambda deserialisiert die Nachricht gemäß der Schemaregistrierungskonfiguration, um die Nachricht zu validieren. Wenn eine Ereignisfilterung konfiguriert ist, führt Lambda anschließend eine Filterung basierend auf den konfigurierten Filterkriterien durch.
   + Wenn die Deserialisierung fehlschlägt, sendet Lambda die Nachricht mit dem Ursachencode `DESERIALIZATION_ERROR` an eine DLQ. Wenn keine DLQ konfiguriert ist, verwirft Lambda die Nachricht.

1. Wenn die Nachricht von der Schemaregistrierung validiert und nicht durch Ihre Filterkriterien herausgefiltert wird, ruft Lambda Ihre Funktion mit der Nachricht auf.

 Dieses Feature dient zur Validierung von Nachrichten, die bereits mit Kafka-Clients erstellt wurden, die in eine Schemaregistrierung integriert sind. Wir empfehlen, Ihre Kafka-Producer so zu konfigurieren, dass sie mit Ihrer Schemaregistrierung zusammenarbeiten, um korrekt formatierte Nachrichten zu erstellen. 

## Konfiguration einer Kafka-Schemaregistrierung
<a name="services-consume-kafka-events-config"></a>

 Die folgenden Konsolenschritte fügen Ihrer Zuordnung von Ereignisquellen eine Kafka-Schemaregistrierungskonfiguration hinzu. 

**Hinzufügen einer Kafka-Schemaregistrierungskonfiguration zu Ihrer Zuordnung von Ereignisquellen (Konsole)**

1. Öffnen Sie die Seite [Funktion](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie **Konfiguration**.

1. Wählen Sie **Auslöser**.

1. Wählen Sie die Kafka-Zuordnung von Ereignisquellen, für die Sie eine Schemaregistrierung konfigurieren möchten und wählen Sie **Bearbeiten**.

1. Wählen Sie unter **Konfiguration des Event-Pollers** die Option **Schemaregistrierung konfigurieren** aus. Ihre Zuordnung von Ereignisquellen muss sich im Bereitstellungsmodus befinden, damit diese Option angezeigt wird.

1. Geben Sie für **Schema Registry URI** den ARN Ihrer AWS Glue Schemaregistry oder die HTTPS-URL Ihrer Confluent Cloud-Schemaregistry oder Self-Managed Confluent Schema Registry ein.

1. Die folgenden Konfigurationsschritte teilen Lambda mit, wie auf Ihre Schemaregistrierung zugegriffen werden kann. Weitere Informationen finden Sie unter [Authentifizierungsmethoden für Ihre Schemaregistrierung](#services-consume-kafka-events-auth).
   + Wählen Sie für **Zugriffskonfigurationstyp** den Authentifizierungstyp aus, den Lambda für den Zugriff auf Ihre Schemaregistrierung verwendet.
   + Geben Sie für **URI der Zugriffskonfiguration** die ARN des Secrets-Manager-Geheimnisses ein, um sich bei Ihrer Schemaregistrierung zu authentifizieren, falls zutreffend. Stellen Sie sicher, dass die [Ausführungsrolle](with-msk-permissions.md) Ihrer Funktion die richtigen Berechtigungen enthält.

1. Das Feld **Verschlüsselung** gilt nur, wenn Ihre Schemaregistrierung von einer privaten Zertifizierungsstelle (CA) oder einer Zertifizierungsstelle (CA) signiert ist, die sich nicht im Lambda-Vertrauensspeicher befindet. Geben Sie gegebenenfalls den geheimen Schlüssel mit dem privaten CA-Zertifikat an, das von Ihrer Schemaregistrierung für die TLS-Verschlüsselung verwendet wird.

1. Wählen Sie unter **Ereignisdatensatzformat** aus, wie Lambda die Datensätze nach der Schemavalidierung an Ihre Funktion übermitteln soll. Weitere Informationen finden Sie unter [Beispiele für das Nutzdatenformat](#services-consume-kafka-events-payload).
   + Wenn Sie **JSON** wählen, liefert Lambda die Attribute, die Sie unten unter „Schemavalidierungsattribut“ auswählen, im Standard-JSON-Format. Die Attribute, die Sie nicht auswählen, liefert Lambda unverändert.
   + Wenn Sie **SOURCE** wählen, liefert Lambda die Attribute, die Sie unten unter „Schemavalidierungsattribut“ auswählen, im ursprünglichen Quellformat.

1. Wählen Sie für **Schemavalidierungsattribut** die Nachrichtenattribute aus, die Lambda mithilfe Ihrer Schemaregistrierung validieren und deserialisieren soll. Sie müssen mindestens entweder **KEY** oder **VALUE** auswählen. Wenn Sie JSON als Ereignisdatensatzformat ausgewählt haben, deserialisiert Lambda auch die ausgewählten Nachrichtenattribute, bevor sie an Ihre Funktion gesendet werden. Weitere Informationen finden Sie unter [Nutzdatenformate und Deserialisierungsverhalten](#services-consume-kafka-events-payload).

1. Wählen Sie **Speichern**.

 Sie können auch die Lambda-API verwenden, um Ihre Zuordnung von Ereignisquellen mit einer Schemaregistrierungskonfiguration zu erstellen oder zu aktualisieren. *Die folgenden Beispiele zeigen, wie Sie eine AWS Glue oder Confluent-Schemaregistry mithilfe von konfigurieren AWS CLI, was den API-Operationen [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)und [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)in der API-Referenz entspricht:AWS Lambda * 

**Wichtig**  
Wenn Sie ein Konfigurationsfeld für die Schemaregistrierung mithilfe der AWS CLI oder der `update-event-source-mapping` API aktualisieren, müssen Sie alle Felder der Schemaregistrierungskonfiguration aktualisieren.

------
#### [ Create Event Source Mapping ]

```
aws lambda create-event-source-mapping \
  --function-name my-schema-validator-function \
  --event-source-arn arn:aws:kafka:us-east-1:123456789012:cluster/my-cluster/a1b2c3d4-5678-90ab-cdef-11111EXAMPLE \
  --topics my-kafka-topic \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=1 \
  --amazon-managed-kafka-event-source-mapping '{
      "SchemaRegistryConfig" : {
          "SchemaRegistryURI": "https://abcd-ef123.us-west-2.aws.confluent.cloud",
          "AccessConfigs": [{
              "Type": "BASIC_AUTH", 
              "URI": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName"
          }],
          "EventRecordFormat": "JSON",
          "SchemaValidationConfigs": [
          { 
              "Attribute": "KEY" 
          },
          { 
              "Attribute": "VALUE" 
          }]
      }
  }'
```

------
#### [ Update AWS Glue Schema Registry ]

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --amazon-managed-kafka-event-source-mapping '{
        "SchemaRegistryConfig" : {
            "SchemaRegistryURI": "arn:aws:glue:us-east-1:123456789012:registry/registryName",
            "EventRecordFormat": "JSON",
            "SchemaValidationConfigs": [
            { 
                "Attribute": "KEY" 
            },
            { 
                "Attribute": "VALUE" 
            }]
        }
    }'
```

------
#### [ Update Confluent Schema Registry with Authentication ]

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --amazon-managed-kafka-event-source-mapping '{
        "SchemaRegistryConfig" : {
            "SchemaRegistryURI": "https://abcd-ef123.us-west-2.aws.confluent.cloud",
            "AccessConfigs": [{
                "Type": "BASIC_AUTH", 
                "URI": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName"
            }],
            "EventRecordFormat": "JSON",
            "SchemaValidationConfigs": [
            { 
                "Attribute": "KEY" 
            },
            { 
                "Attribute": "VALUE" 
            }]
        }
    }'
```

------
#### [ Update Confluent Schema Registry without Authentication ]

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --amazon-managed-kafka-event-source-mapping '{
        "SchemaRegistryConfig" : {
            "SchemaRegistryURI": "https://abcd-ef123.us-west-2.aws.confluent.cloud",
            "EventRecordFormat": "JSON",
            "SchemaValidationConfigs": [
            { 
                "Attribute": "KEY" 
            },
            { 
                "Attribute": "VALUE" 
            }]
        }
    }'
```

------
#### [ Remove Schema Registry Configuration ]

Um eine Schemaregistrierungskonfiguration aus Ihrer Ereignisquellenzuordnung zu entfernen, können Sie den CLI-Befehl [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)in der *AWS Lambda API-Referenz* verwenden.

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --amazon-managed-kafka-event-source-mapping '{
        "SchemaRegistryConfig" : {}
    }'
```

------

## Filterung nach Avro und Protobuf
<a name="services-consume-kafka-events-filtering"></a>

 Wenn Sie die Formate Avro oder Protobuf mit einer Schemaregistrierung verwenden, können Sie die Ereignisfilterung auf Ihre Lambda-Funktion anwenden. Die Filtermuster werden nach der Schemavalidierung auf die deserialisierte klassische JSON-Darstellung Ihrer Daten angewendet. Mit einem Avro-Schema, das Produktdetails einschließlich des Preises definiert, können Sie beispielsweise Nachrichten basierend auf dem Preiswert filtern: 

**Anmerkung**  
 Bei der Deserialisierung wird Avro in Standard-JSON konvertiert, was bedeutet, dass es nicht direkt wieder in ein Avro-Objekt konvertiert werden kann. Wenn Sie eine Konvertierung in ein Avro-Objekt benötigen, verwenden Sie stattdessen das SOURCE-Format.   
 Bei der Protobuf-Deserialisierung stimmen die Feldnamen im resultierenden JSON mit denen überein, die in Ihrem Schema definiert sind, anstatt wie bei Protobuf üblich in Camelcase konvertiert zu werden. Beachten Sie dies bei der Erstellung von Filtermustern. 

```
aws lambda create-event-source-mapping \
    --function-name myAvroFunction \
    --topics myAvroTopic \
    --starting-position TRIM_HORIZON \
    --kafka-bootstrap-servers '["broker1:9092", "broker2:9092"]' \
    --schema-registry-config '{
        "SchemaRegistryURI": "arn:aws:glue:us-east-1:123456789012:registry/myAvroRegistry",
        "EventRecordFormat": "JSON",
        "SchemaValidationConfigs": [
            { 
                "Attribute": "VALUE" 
            }
        ]
    }' \
    --filter-criteria '{
        "Filters": [
            {
                "Pattern": "{ \"value\" : { \"field_1\" : [\"value1\"], \"field_2\" : [\"value2\"] } }"
            }
        ]
    }'
```

 In diesem Beispiel analysiert das Filtermuster das `value`-Objekt und gleicht Nachrichten in `field_1` mit `"value1"` und `field_2` mit `"value2"` ab. Die Filterkriterien werden anhand der deserialisierten Daten ausgewertet, nachdem Lambda die Nachricht vom Avro-Format in JSON konvertiert hat. 

 Ausführlichere Informationen zur Ereignisfilterung finden Sie unter [Lambda-Ereignisfilterung](invocation-eventfiltering.md). 

## Nutzdatenformate und Deserialisierungsverhalten
<a name="services-consume-kafka-events-payload"></a>

 Bei Verwendung einer Schemaregistrierung liefert Lambda die endgültigen Nutzdaten in einem Format, das den [regulären Ereignisnutzdaten](with-msk.md#msk-sample-event) ähnelt, jedoch einige zusätzliche Felder enthält. Die zusätzlichen Felder hängen vom Parameter `SchemaValidationConfigs` ab. Für jedes Attribut, das Sie für die Validierung auswählen (Schlüssel oder Wert), fügt Lambda den Nutzdaten entsprechende Schemametadaten hinzu. 

**Anmerkung**  
Sie müssen Ihr System [aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-events)auf Version 3.16.0 oder höher aktualisieren, um Schema-Metadatenfelder verwenden zu können.

 Wenn Sie beispielsweise das Feld `value` validieren, fügt Lambda Ihren Nutzdaten ein Feld namens `valueSchemaMetadata` hinzu. In ähnlicher Weise fügt Lambda für das Feld `key` ein Feld namens `keySchemaMetadata` hinzu. Diese Metadaten enthalten Informationen über das Datenformat und die Schema-ID, die für die Validierung verwendet werden: 

```
"valueSchemaMetadata": {
    "dataFormat": "AVRO",
    "schemaId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
}
```

 Der Parameter `EventRecordFormat` kann entweder auf `JSON` oder `SOURCE` gesetzt werden. Damit wird festgelegt, wie Lambda schemavalidierte Daten verarbeitet, bevor sie an Ihre Funktion übermittelt werden. Jede Option bietet unterschiedliche Verarbeitungsmöglichkeiten: 
+ `JSON` – Lambda deserialisiert die validierten Attribute in das Standard-JSON-Format, sodass die Daten direkt in Sprachen mit nativer JSON-Unterstützung verwendet werden können. Dieses Format ist ideal, wenn Sie das ursprüngliche Binärformat nicht beibehalten oder mit generierten Klassen arbeiten müssen.
+ `SOURCE` – Lambda behält das ursprüngliche Binärformat der Daten als Base64-codierte Zeichenfolge bei, sodass eine direkte Konvertierung in Avro- oder Protobuf-Objekte möglich ist. Dieses Format ist unerlässlich, wenn Sie mit stark typisierten Sprachen arbeiten oder die volle Leistungsfähigkeit von Avro- oder Protobuf-Schemas beibehalten müssen.

Basierend auf diesen Formatmerkmalen und sprachspezifischen Überlegungen empfehlen wir die folgenden Formate:


**Empfohlene Formate basierend auf der Programmiersprache**  

| Sprache | Avro | Protobuf | JSON | 
| --- | --- | --- | --- | 
| Java | SOURCE | SOURCE | SOURCE | 
| Python | JSON | JSON | JSON | 
| NodeJS | JSON | JSON | JSON | 
| .NET | SOURCE | SOURCE | SOURCE | 
| Weitere | JSON | JSON | JSON | 

In den folgenden Abschnitten werden diese Formate ausführlich beschrieben und Beispielnutzdaten für jedes Format bereitgestellt.

### JSON-Format
<a name="services-consume-kafka-events-payload-json"></a>

 Wenn Sie dies wählen `JSON``EventRecordFormat`, validiert und deserialisiert Lambda die Nachrichtenattribute, die Sie in dem `SchemaValidationConfigs` Feld ausgewählt haben (die Attribute). `key` and/or `value` Lambda liefert diese ausgewählten Attribute als Base64-codierte Zeichenfolgen ihrer Standard-JSON-Darstellung in Ihrer Funktion. 

**Anmerkung**  
 Bei der Deserialisierung wird Avro in Standard-JSON konvertiert, was bedeutet, dass es nicht direkt wieder in ein Avro-Objekt konvertiert werden kann. Wenn Sie eine Konvertierung in ein Avro-Objekt benötigen, verwenden Sie stattdessen das SOURCE-Format.   
 Bei der Protobuf-Deserialisierung stimmen die Feldnamen im resultierenden JSON mit denen überein, die in Ihrem Schema definiert sind, anstatt wie bei Protobuf üblich in Camelcase konvertiert zu werden. Beachten Sie dies bei der Erstellung von Filtermustern. 

 Im Folgenden finden Sie ein Beispiel für Nutzdaten, wobei davon ausgegangen wird, dass Sie `JSON` als `EventRecordFormat` und sowohl die `key`- als auch die `value`-Attribute als `SchemaValidationConfigs` wählen. 

```
{
   "eventSource":"aws:kafka",
   "eventSourceArn":"arn:aws:kafka:us-east-1:123456789012:cluster/vpc-2priv-2pub/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111-1",
   "bootstrapServers":"b-2.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092,b-1.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092",
   "records":{
      "mytopic-0":[
         {
            "topic":"mytopic",
            "partition":0,
            "offset":15,
            "timestamp":1545084650987,
            "timestampType":"CREATE_TIME",
            "key":"abcDEFghiJKLmnoPQRstuVWXyz1234==", //Base64 encoded string of JSON
            "keySchemaMetadata": {
                "dataFormat": "AVRO",
                "schemaId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
            },
            "value":"abcDEFghiJKLmnoPQRstuVWXyz1234", //Base64 encoded string of JSON
            "valueSchemaMetadata": {
                "dataFormat": "AVRO",
                "schemaId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
            },
            "headers":[
               {
                  "headerKey":[
                     104,
                     101,
                     97,
                     100,
                     101,
                     114,
                     86,
                     97,
                     108,
                     117,
                     101
                  ]
               }
            ]
         }
      ]
   }
}
```

 In diesem Beispiel: 
+ Sowohl `key` als auch `value` sind Base64-codierte Zeichenfolgen ihrer JSON-Darstellung nach der Deserialisierung.
+ Lambda enthält Schemametadaten für beide Attribute in `keySchemaMetadata` und`valueSchemaMetadata`.
+ Ihre Funktion kann die `key`- und `value`-Zeichenfolgen decodieren, um auf die deserialisierten JSON-Daten zuzugreifen.

 Das JSON-Format wird für Sprachen empfohlen, die nicht stark typisiert sind, wie Python oder Node.js. Diese Sprachen bieten native Unterstützung für die Konvertierung von JSON in Objekte. 

### Quellformat
<a name="services-consume-kafka-events-payload-source"></a>

 Wenn Sie `SOURCE` als `EventRecordFormat` auswählen, validiert Lambda den Datensatz trotzdem anhand der Schemaregistrierung, liefert jedoch die ursprünglichen Binärdaten ohne Deserialisierung an Ihre Funktion. Diese Binärdaten werden als Base64-codierte Zeichenfolge der ursprünglichen Byte-Daten geliefert, wobei die vom Producer angehängten Metadaten entfernt werden. Dadurch können Sie die binären Rohdaten direkt in Avro- und Protobuf-Objekte innerhalb Ihres Funktionscodes konvertieren. Wir empfehlen die Verwendung von Powertools for AWS Lambda, das die rohen Binärdaten deserialisiert und Ihnen Avro- und Protobuf-Objekte direkt zur Verfügung stellt. 

 Wenn Sie beispielsweise Lambda so konfigurieren, dass sowohl die `key`- als auch die `value`-Attribute validiert werden, aber das `SOURCE`-Format verwenden, erhält Ihre Funktion Nutzdaten wie diese: 

```
{
    "eventSource": "aws:kafka",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/vpc-2priv-2pub/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111-1",
    "bootstrapServers": "b-2.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092,b-1.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092",
    "records": {
        "mytopic-0": [
            {
                "topic": "mytopic",
                "partition": 0,
                "offset": 15,
                "timestamp": 1545084650987,
                "timestampType": "CREATE_TIME",
                "key": "abcDEFghiJKLmnoPQRstuVWXyz1234==", // Base64 encoded string of Original byte data, producer-appended metadata removed
                "keySchemaMetadata": {
                    "dataFormat": "AVRO",
                    "schemaId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
                },
                "value": "abcDEFghiJKLmnoPQRstuVWXyz1234==", // Base64 encoded string of Original byte data, producer-appended metadata removed
                "valueSchemaMetadata": {
                    "dataFormat": "AVRO",
                    "schemaId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
                },
                "headers": [
                    {
                        "headerKey": [
                            104,
                            101,
                            97,
                            100,
                            101,
                            114,
                            86,
                            97,
                            108,
                            117,
                            101
                        ]
                    }
                ]
            }
        ]
    }
}
```

 In diesem Beispiel: 
+ Sowohl `key` als auch `value` enthalten die ursprünglichen Binärdaten als Base64-codierte Zeichenfolgen.
+ Ihre Funktion muss die Deserialisierung mit den entsprechenden Bibliotheken verarbeiten.

 Die Auswahl von `SOURCE` für `EventRecordFormat` wird empfohlen, wenn Sie mit Avro oder Protobuf generierte Objekte verwenden, insbesondere mit Java-Funktionen. Dies liegt daran, dass Java stark typisiert ist und spezifische Deserialisierer für die Formate Avro und Protobuf erfordert. In Ihrem Funktionscode können Sie Ihre bevorzugte Avro- oder Protobuf-Bibliothek verwenden, um die Daten zu deserialisieren. 

## Arbeiten mit deserialisierten Daten in Lambda-Funktionen
<a name="services-consume-kafka-events-payload-examples"></a>

Powertools for AWS Lambda hilft Ihnen dabei, Kafka-Datensätze in Ihrem Funktionscode auf der Grundlage des von Ihnen verwendeten Formats zu deserialisieren. Dieses Tool vereinfacht die Arbeit mit Kafka-Datensätzen, indem es die Datenkonvertierung übernimmt und Objekte bereitstellt. ready-to-use

 Um Powertools for AWS Lambda in Ihrer Funktion zu verwenden, müssen Sie Powertools for AWS Lambda entweder als Ebene oder als Abhängigkeit hinzufügen, wenn Sie Ihre Lambda-Funktion erstellen. Anweisungen zur Einrichtung und weitere Informationen finden Sie in der AWS Lambda Powertools-Dokumentation für Ihre bevorzugte Sprache: 
+ [Powertools für AWS Lambda (Java)](https://docs.powertools.aws.dev/lambda/java/latest/utilities/kafka/)
+ [Powertools für AWS Lambda (Python)](https://docs.powertools.aws.dev/lambda/python/latest/utilities/kafka/)
+ [Elektrowerkzeuge für AWS Lambda () TypeScript](https://docs.powertools.aws.dev/lambda/typescript/latest/features/kafka/)
+ [Elektrowerkzeuge für AWS Lambda (.NET)](https://docs.powertools.aws.dev/lambda/dotnet/utilities/kafka/)

**Anmerkung**  
Bei der Arbeit mit der Schemaregistrierungsintegration können Sie zwischen dem `SOURCE`- und dem `JSON`-Format wählen. Jede Option unterstützt verschiedene Serialisierungsformate, wie unten gezeigt:  


| Format | Unterstützt | 
| --- | --- | 
|  SOURCE  |  Avro und Protobuf (unter Verwendung der Lambda-Schemaregistrierungsintegration)  | 
|  JSON  |  JSON-Daten  | 

 Wenn Sie das `JSON` Format `SOURCE` oder verwenden, können Sie Powertools for verwenden, AWS um die Daten in Ihrem Funktionscode zu deserialisieren. Hier sind Beispiele für den Umgang mit verschiedenen Datenformaten: 

------
#### [ AVRO ]

Java-Beispiel:

```
package org.demo.kafka;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.demo.kafka.avro.AvroProduct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import software.amazon.lambda.powertools.kafka.Deserialization;
import software.amazon.lambda.powertools.kafka.DeserializationType;
import software.amazon.lambda.powertools.logging.Logging;

public class AvroDeserializationFunction implements RequestHandler<ConsumerRecords<String, AvroProduct>, String> {

    private static final Logger LOGGER = LoggerFactory.getLogger(AvroDeserializationFunction.class);

    @Override
    @Logging
    @Deserialization(type = DeserializationType.KAFKA_AVRO)
    public String handleRequest(ConsumerRecords<String, AvroProduct> records, Context context) {
        for (ConsumerRecord<String, AvroProduct> consumerRecord : records) {
            LOGGER.info("ConsumerRecord: {}", consumerRecord);

            AvroProduct product = consumerRecord.value();
            LOGGER.info("AvroProduct: {}", product);

            String key = consumerRecord.key();
            LOGGER.info("Key: {}", key);
        }

        return "OK";
    }

}
```

Python-Beispiel:

```
from aws_lambda_powertools.utilities.kafka_consumer.kafka_consumer import kafka_consumer
from aws_lambda_powertools.utilities.kafka_consumer.schema_config import SchemaConfig
from aws_lambda_powertools.utilities.kafka_consumer.consumer_records import ConsumerRecords

from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools import Logger

logger = Logger(service="kafkaConsumerPowertools")

value_schema_str = open("customer_profile.avsc", "r").read()

schema_config = SchemaConfig(
value_schema_type="AVRO",
value_schema=value_schema_str)

@kafka_consumer(schema_config=schema_config)
def lambda_handler(event: ConsumerRecords, context:LambdaContext):

  for record in event.records:
      value = record.value
      logger.info(f"Received value: {value}")
```

TypeScript Beispiel:

```
import { kafkaConsumer } from '@aws-lambda-powertools/kafka';

import type { ConsumerRecords } from '@aws-lambda-powertools/kafka/types';
import { Logger } from '@aws-lambda-powertools/logger';
import type { Context } from 'aws-lambda';

const logger = new Logger();

type Value = {
    id: number;
    name: string;
    price: number;
};

const schema = '{   
    "type": "record",   
    "name": "Product",   
    "fields": [     
        { "name": "id", "type": "int" },     
        { "name": "name", "type": "string" },     
        { "name": "price", "type": "double" }   
    ] 
}';

export const handler = kafkaConsumer<string, Value>(
    (event: ConsumerRecords<string, Value>, _context: Context) => {
        for (const record of event.records) {
            logger.info(Processing record with key: ${record.key});
            logger.info(Record value: ${JSON.stringify(record.value)});
            // You can add more processing logic here
        }
    },
    {
        value: {
            type: 'avro',
            schema: schema,
        },
    }
);
```

.NET-Beispiel:

```
using Amazon.Lambda.Core;
using AWS.Lambda.Powertools.Kafka;
using AWS.Lambda.Powertools.Kafka.Avro;
using AWS.Lambda.Powertools.Logging;
using Com.Example;

// Assembly attribute to enable the Lambda function's Kafka event to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(PowertoolsKafkaAvroSerializer))]

namespace ProtoBufClassLibrary;

public class Function
{
    public string FunctionHandler(ConsumerRecords<string, CustomerProfile> records, ILambdaContext context)
    {
        foreach (var record in records)
        {
            Logger.LogInformation("Processing messagem from topic: {topic}", record.Topic);
            Logger.LogInformation("Partition: {partition}, Offset: {offset}", record.Partition, record.Offset);
            Logger.LogInformation("Produced at: {timestamp}", record.Timestamp);
            
            foreach (var header in record.Headers.DecodedValues())
            {
                Logger.LogInformation($"{header.Key}: {header.Value}");
            }
            
            Logger.LogInformation("Processing order for: {fullName}", record.Value.FullName);
        }
    
        return "Processed " + records.Count() + " records";
    }
}
```

------
#### [ PROTOBUF ]

Java-Beispiel:

```
package org.demo.kafka;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.demo.kafka.protobuf.ProtobufProduct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import software.amazon.lambda.powertools.kafka.Deserialization;
import software.amazon.lambda.powertools.kafka.DeserializationType;
import software.amazon.lambda.powertools.logging.Logging;

public class ProtobufDeserializationFunction
        implements RequestHandler<ConsumerRecords<String, ProtobufProduct>, String> {

    private static final Logger LOGGER = LoggerFactory.getLogger(ProtobufDeserializationFunction.class);

    @Override
    @Logging
    @Deserialization(type = DeserializationType.KAFKA_PROTOBUF)
    public String handleRequest(ConsumerRecords<String, ProtobufProduct> records, Context context) {
        for (ConsumerRecord<String, ProtobufProduct> consumerRecord : records) {
            LOGGER.info("ConsumerRecord: {}", consumerRecord);

            ProtobufProduct product = consumerRecord.value();
            LOGGER.info("ProtobufProduct: {}", product);

            String key = consumerRecord.key();
            LOGGER.info("Key: {}", key);
        }

        return "OK";
    }

}
```

Python-Beispiel:

```
from aws_lambda_powertools.utilities.kafka_consumer.kafka_consumer import kafka_consumer

from aws_lambda_powertools.utilities.kafka_consumer.schema_config import SchemaConfig
from aws_lambda_powertools.utilities.kafka_consumer.consumer_records import ConsumerRecords

from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools import Logger

from user_pb2 import User # protobuf generated class

logger = Logger(service="kafkaConsumerPowertools")

schema_config = SchemaConfig(
value_schema_type="PROTOBUF",
value_schema=User)

@kafka_consumer(schema_config=schema_config)
def lambda_handler(event: ConsumerRecords, context:LambdaContext):

  for record in event.records:
      value = record.value
      logger.info(f"Received value: {value}")
```

TypeScript Beispiel:

```
import { kafkaConsumer } from '@aws-lambda-powertools/kafka';
import type { ConsumerRecords } from '@aws-lambda-powertools/kafka/types';
import { Logger } from '@aws-lambda-powertools/logger';
import type { Context } from 'aws-lambda';
import { Product } from './product.generated.js';

const logger = new Logger();

type Value = {
    id: number;
    name: string;
    price: number;
};

export const handler = kafkaConsumer<string, Value>(
    (event: ConsumerRecords<string, Value>, _context: Context) => {
        for (const record of event.records) {
            logger.info(Processing record with key: ${record.key});
            logger.info(Record value: ${JSON.stringify(record.value)});
        }
    },
    {
        value: {
            type: 'protobuf',
            schema: Product,
        },
    }
);
```

.NET-Beispiel:

```
using Amazon.Lambda.Core;
using AWS.Lambda.Powertools.Kafka;
using AWS.Lambda.Powertools.Kafka.Protobuf;
using AWS.Lambda.Powertools.Logging;
using Com.Example;

// Assembly attribute to enable the Lambda function's Kafka event to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(PowertoolsKafkaProtobufSerializer))]

namespace ProtoBufClassLibrary;

public class Function
{
    public string FunctionHandler(ConsumerRecords<string, CustomerProfile> records, ILambdaContext context)
    {
        foreach (var record in records)
        {
            Logger.LogInformation("Processing messagem from topic: {topic}", record.Topic);
            Logger.LogInformation("Partition: {partition}, Offset: {offset}", record.Partition, record.Offset);
            Logger.LogInformation("Produced at: {timestamp}", record.Timestamp);
            
            foreach (var header in record.Headers.DecodedValues())
            {
                Logger.LogInformation($"{header.Key}: {header.Value}");
            }
            
            Logger.LogInformation("Processing order for: {fullName}", record.Value.FullName);
        }
    
        return "Processed " + records.Count() + " records";
    }
}
```

------
#### [ JSON ]

Java-Beispiel:

```
package org.demo.kafka;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import software.amazon.lambda.powertools.kafka.Deserialization;
import software.amazon.lambda.powertools.kafka.DeserializationType;
import software.amazon.lambda.powertools.logging.Logging;

public class JsonDeserializationFunction implements RequestHandler<ConsumerRecords<String, Product>, String> {

    private static final Logger LOGGER = LoggerFactory.getLogger(JsonDeserializationFunction.class);

    @Override
    @Logging
    @Deserialization(type = DeserializationType.KAFKA_JSON)
    public String handleRequest(ConsumerRecords<String, Product> consumerRecords, Context context) {
        for (ConsumerRecord<String, Product> consumerRecord : consumerRecords) {
            LOGGER.info("ConsumerRecord: {}", consumerRecord);

            Product product = consumerRecord.value();
            LOGGER.info("Product: {}", product);

            String key = consumerRecord.key();
            LOGGER.info("Key: {}", key);
        }

        return "OK";
    }
}
```

Python-Beispiel:

```
from aws_lambda_powertools.utilities.kafka_consumer.kafka_consumer import kafka_consumer

from aws_lambda_powertools.utilities.kafka_consumer.schema_config import SchemaConfig
from aws_lambda_powertools.utilities.kafka_consumer.consumer_records import ConsumerRecords

from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools import Logger

logger = Logger(service="kafkaConsumerPowertools")

schema_config = SchemaConfig(value_schema_type="JSON")

@kafka_consumer(schema_config=schema_config)
def lambda_handler(event: ConsumerRecords, context:LambdaContext):

  for record in event.records:
      value = record.value
      logger.info(f"Received value: {value}")
```

TypeScript Beispiel:

```
import { kafkaConsumer } from '@aws-lambda-powertools/kafka';
import type { ConsumerRecords } from '@aws-lambda-powertools/kafka/types';
import { Logger } from '@aws-lambda-powertools/logger';
import type { Context } from 'aws-lambda';

const logger = new Logger();

type Value = {
    id: number;
    name: string;
    price: number;
};

export const handler = kafkaConsumer<string, Value>(
    (event: ConsumerRecords<string, Value>, _context: Context) => {
        for (const record of event.records) {
            logger.info(Processing record with key: ${record.key});
            logger.info(Record value: ${JSON.stringify(record.value)});
            // You can add more processing logic here
        }
    },
    {
        value: {
            type: 'json',
        },
    }
);
```

.NET-Beispiel:

```
using Amazon.Lambda.Core;
using AWS.Lambda.Powertools.Kafka;
using AWS.Lambda.Powertools.Kafka.Json;
using AWS.Lambda.Powertools.Logging;
using Com.Example;

// Assembly attribute to enable the Lambda function's Kafka event to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(PowertoolsKafkaJsonSerializer))]

namespace JsonClassLibrary;

public class Function
{
    public string FunctionHandler(ConsumerRecords<string, CustomerProfile> records, ILambdaContext context)
    {
        foreach (var record in records)
        {
            Logger.LogInformation("Processing messagem from topic: {topic}", record.Topic);
            Logger.LogInformation("Partition: {partition}, Offset: {offset}", record.Partition, record.Offset);
            Logger.LogInformation("Produced at: {timestamp}", record.Timestamp);
            
            foreach (var header in record.Headers.DecodedValues())
            {
                Logger.LogInformation($"{header.Key}: {header.Value}");
            }
            
            Logger.LogInformation("Processing order for: {fullName}", record.Value.FullName);
        }
    
        return "Processed " + records.Count() + " records";
    }
}
```

------

## Authentifizierungsmethoden für Ihre Schemaregistrierung
<a name="services-consume-kafka-events-auth"></a>

 Um eine Schemaregistrierung verwenden zu können, muss Lambda in der Lage sein, sicher darauf zuzugreifen. Wenn Sie mit einer AWS Glue Schemaregistrierung arbeiten, stützt sich Lambda auf die IAM-Authentifizierung. Das bedeutet, dass die [Ausführungsrolle](lambda-intro-execution-role.md) Ihrer Funktion über die folgenden Berechtigungen für den Zugriff auf die AWS Glue Registrierung verfügen muss: 
+ [GetRegistry](https://docs.aws.amazon.com/glue/latest/webapi/API_GetRegistry.html)in der *AWS Glue Web-API-Referenz*
+ [GetSchemaVersion](https://docs.aws.amazon.com/glue/latest/webapi/API_GetSchemaVersion.html)in der *AWS Glue Web-API-Referenz*

Beispiel für die erforderliche IAM-Richtlinie: 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetRegistry",
                "glue:GetSchemaVersion"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

**Anmerkung**  
 Wenn Sie bei AWS Glue Schemaregistern eine AWS Glue Registrierung angeben`AccessConfigs`, gibt Lambda eine Validierungsausnahme zurück. 

Wenn Sie mit einer Confluent-Schemaregistry arbeiten, können Sie eine von drei unterstützten Authentifizierungsmethoden für den `Type` Parameter Ihres Objekts wählen: [KafkaSchemaRegistryAccessConfig](https://docs.aws.amazon.com/lambda/latest/api/API_KafkaSchemaRegistryAccessConfig)
+ **BASIC\$1AUTH** – Lambda verwendet die Authentifizierung mit Benutzername und Passwort oder API-Schlüssel und API-Geheimnis, um auf Ihre Registrierung zuzugreifen. Wenn Sie diese Option auswählen, geben Sie die Secrets-Manager-ARN mit Ihren Anmeldeinformationen im Feld „URI“ an.
+ **CLIENT\$1CERTIFICATE\$1TLS\$1AUTH** – Lambda verwendet die gegenseitige TLS-Authentifizierung mit Client-Zertifikaten. Um diese Option zu verwenden, benötigt Lambda Zugriff sowohl auf das Zertifikat als auch auf den privaten Schlüssel. Geben Sie den Secrets-Manager-ARN mit diesen Anmeldeinformationen im URI-Feld an.
+ **NO\$1AUTH** – Das öffentliche CA-Zertifikat muss von einer Zertifizierungsstelle (CA) signiert sein, die sich im Lambda-Vertrauensspeicher befindet. Für ein privates CA-/selbstsigniertes Zertifikat konfigurieren Sie das Root-CA-Zertifikat des Servers. Um diese Option zu verwenden, lassen Sie den Parameter `AccessConfigs` weg.

 Wenn Lambda Zugriff auf ein privates CA-Zertifikat benötigt, um das TLS-Zertifikat Ihrer Schemaregistrierung zu überprüfen, wählen Sie zusätzlich `SERVER_ROOT_CA_CERT` als `Type` und geben Sie den Secrets-Manager-ARN für das Zertifikat in das URI-Feld ein. 

**Anmerkung**  
 Um die Option `SERVER_ROOT_CA_CERT` in der Konsole zu konfigurieren, geben Sie den Geheimnis-ARN, der das Zertifikat enthält, in das Feld **Verschlüsselung** ein. 

 Die Authentifizierungskonfiguration für Ihre Schemaregistrierung ist unabhängig von der Authentifizierung, die Sie für Ihren Kafka-Cluster konfiguriert haben. Sie müssen beide separat konfigurieren, auch wenn sie ähnliche Authentifizierungsmethoden verwenden. 

## Fehlerbehandlung und -behebung bei Problemen mit der Schemaregistrierung
<a name="services-consume-kafka-events-troubleshooting"></a>

Bei der Verwendung einer Schemaregistrierung mit Ihrer Amazon-MSK-Ereignisquelle können verschiedene Fehler auftreten. Dieser Abschnitt enthält Anleitungen zu häufigen Problemen und deren Behebung.

### Konfigurationsfehler
<a name="consume-kafka-events-troubleshooting-configuration-errors"></a>

Diese Fehler treten beim Einrichten Ihrer Schemaregistrierungskonfiguration auf.

Bereitstellungsmodus erforderlich  
**Fehlermeldung**: `SchemaRegistryConfig is only available for Provisioned Mode. To configure Schema Registry, please enable Provisioned Mode by specifying MinimumPollers in ProvisionedPollerConfig.`  
**Lösung:** Aktivieren Sie den Bereitstellungsmodus für Ihre Zuordnung von Ereignisquellen, indem Sie den Parameter `MinimumPollers` in `ProvisionedPollerConfig` konfigurieren.

Ungültige Schemaregistrierungs-URL  
**Fehlermeldung**: `Malformed SchemaRegistryURI provided. Please provide a valid URI or ARN. For example, https://schema-registry.example.com:8081 or arn:aws:glue:us-east-1:123456789012:registry/ExampleRegistry.`  
**Lösung:** Geben Sie eine gültige HTTPS-URL für Confluent Schema Registry oder einen gültigen ARN für AWS Glue Schema Registry an.

Ungültiges oder fehlendes Ereignisdatensatzformat  
**Fehlermeldung**: `EventRecordFormat is a required field for SchemaRegistryConfig. Please provide one of supported format types: SOURCE, JSON.`  
**Lösung:** Geben Sie EventRecordFormat in Ihrer Schemaregistrierungskonfiguration entweder SOURCE oder JSON an.

Doppelte Validierungsattribute  
**Fehlermeldung**: `Duplicate KEY/VALUE Attribute in SchemaValidationConfigs. SchemaValidationConfigs must contain at most one KEY/VALUE Attribute.`  
**Lösung:** Entfernen Sie doppelte KEY- oder VALUE-Attribute aus Ihrem SchemaValidationConfigs. Jeder Attributtyp darf nur einmal vorkommen.

Fehlende Validierungskonfiguration  
**Fehlermeldung**: `SchemaValidationConfigs is a required field for SchemaRegistryConfig.`  
**Lösung:** Fügen Sie SchemaValidationConfigs es zu Ihrer Konfiguration hinzu und geben Sie mindestens ein Validierungsattribut (KEY oder VALUE) an.

### Zugriffs- und Berechtigungsfehler
<a name="consume-kafka-events-troubleshooting-access-errors"></a>

Diese Fehler treten auf, wenn Lambda aufgrund von Berechtigungs- oder Authentifizierungsproblemen nicht auf die Schemaregistrierung zugreifen kann.

AWS Glue Zugriff auf die Schemaregistrierung verweigert  
**Fehlermeldung**: `Cannot access Glue Schema with provided role. Please ensure the provided role can perform the GetRegistry and GetSchemaVersion Actions on your schema.`  
**Lösung:** Fügen Sie die erforderlichen Berechtigungen (`glue:GetRegistry` und `glue:GetSchemaVersion`) zur Ausführungsrolle Ihrer Funktion hinzu.

Zugriff auf Confluent-Schemaregistrierung verweigert  
**Fehlermeldung**: `Cannot access Confluent Schema with the provided access configuration.`  
**Lösung:** Stellen Sie sicher, dass Ihre Authentifizierungsanmeldeinformationen (gespeichert in Secrets Manager) korrekt sind und über die erforderlichen Berechtigungen für den Zugriff auf die Schemaregistrierung verfügen.

Kontoübergreifende AWS Glue Schemaregistrierung  
**Fehlermeldung**: `Cross-account Glue Schema Registry ARN not supported.`  
**Lösung:** Verwenden Sie eine AWS Glue Schemaregistry, die sich im selben AWS Konto wie Ihre Lambda-Funktion befindet.

Regionsübergreifende Schemaregistrierung AWS Glue   
**Fehlermeldung**: `Cross-region Glue Schema Registry ARN not supported.`  
**Lösung:** Verwenden Sie eine AWS Glue Schemaregistry, die sich in derselben Region wie Ihre Lambda-Funktion befindet.

Probleme beim Zugriff auf Geheimnisse  
**Fehlermeldung**: `Lambda received InvalidRequestException from Secrets Manager.`  
**Lösung:** Stellen Sie sicher, dass die Ausführungsrolle Ihrer Funktion berechtigt ist, auf das Geheimnis zuzugreifen, und dass das Geheimnis nicht mit einem AWS KMS Standardschlüssel verschlüsselt ist, wenn Sie von einem anderen Konto aus zugreifen.

### Verbindungsfehler
<a name="consume-kafka-events-troubleshooting-connection-errors"></a>

Diese Fehler treten auf, wenn Lambda keine Verbindung mit der Schemaregistrierung herstellen kann.

Probleme mit der VPC-Konnektivität  
**Fehlermeldung**: `Cannot connect to your Schema Registry. Your Kafka cluster's VPC must be able to connect to the schema registry. You can provide access by configuring AWS PrivateLink or a NAT Gateway or VPC Peering between Kafka Cluster VPC and the schema registry VPC.`  
**Lösung:** Konfigurieren Sie Ihr VPC-Netzwerk so, dass Verbindungen zur Schemaregistry über AWS PrivateLink ein NAT-Gateway oder VPC-Peering möglich sind.

TLS-Handshake-Fehler  
**Fehlermeldung**: `Unable to establish TLS handshake with the schema registry. Please provide correct CA-certificate or client certificate using Secrets Manager to access your schema registry.`  
**Lösung:** Überprüfen Sie, ob Ihre CA-Zertifikate und Client-Zertifikate (für mTLS) korrekt sind und ordnungsgemäß in Secrets Manager konfiguriert wurden.

Drosselung  
**Fehlermeldung**: `Receiving throttling errors when accessing the schema registry. Please increase API TPS limits for your schema registry.`  
**Lösung:** Erhöhen Sie die API-Ratenlimits für Ihre Schemaregistrierung oder reduzieren Sie die Anzahl der Anforderungen von Ihrer Anwendung.

Fehler bei selbstverwalteten Schemaregistrierungen  
**Fehlermeldung**: `Lambda received an internal server an unexpected error from the provided self-managed schema registry.`  
**Lösung:** Überprüfen Sie den Zustand und die Konfiguration des Servers Ihrer selbstverwalteten Schemaregistrierung.

# Verarbeitung mit niedriger Latenz für Kafka-Ereignisquellen
<a name="with-kafka-low-latency"></a>

AWS Lambda unterstützt nativ die Ereignisverarbeitung mit niedriger Latenz für Anwendungen, die konsistente end-to-end Latenzen von weniger als 100 Millisekunden benötigen. Auf dieser Seite finden Sie Konfigurationsdetails und Empfehlungen zur Aktivierung von Workflows mit geringer Latenz.

## Verarbeitung mit geringer Latenz aktivieren
<a name="enable-low-latency"></a>

Um die Verarbeitung mit geringer Latenz für eine Kafka-Zuordnung von Ereignisquellen zu aktivieren, ist die folgende Grundkonfiguration erforderlich: 
+ Aktivieren Sie den Bereitstellungsmodus. Weitere Informationen finden Sie unter [Modus bereitgestellter Kapazität](kafka-scaling-modes.md#kafka-provisioned-mode).
+ Setzen Sie den Parameter `MaximumBatchingWindowInSeconds` der Zuordnung von Ereignisquellen auf 0. Weitere Informationen finden Sie unter [Batching-Verhalten](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

## Feinabstimmung Ihres Kafka ESM mit niedriger Latenz
<a name="recommendations-low-latency"></a>

Beachten Sie die folgenden Empfehlungen, um Ihre Kafka-Zuordnung von Ereignisquellen für geringe Latenz zu optimieren:

### Konfiguration des Bereitstellungsmodus
<a name="recommendations-pollers"></a>

Im Bereitstellungsmodus für die Kafka-Zuordnung von Ereignisquellen können Sie mit Lambda den Durchsatz Ihrer Zuordnung von Ereignisquellen optimieren, indem Sie eine minimale und maximale Anzahl von Ressourcen konfigurieren, die als **Ereignis-Poller** bezeichnet werden. Ein Event Poller (oder **ein Poller) stellt eine** Rechenressource dar, die einer Zuordnung von Ereignisquellen im bereitgestellten Modus zugrunde liegt und bis zu 5 Durchsätze zuweist. MB/s Jeder Ereignis-Poller unterstützt bis zu 5 gleichzeitige Lambda-Aufrufe.

Um die optimale Poller-Konfiguration für Ihre Anwendung zu ermitteln, berücksichtigen Sie Ihre maximale Erfassungsrate und Ihre Verarbeitungsanforderungen. Sehen wir uns ein vereinfachtes Beispiel an:

Bei einer Batchgröße von 20 Datensätzen und einer durchschnittlichen Zielfunktionsdauer von 50 ms kann jeder Poller 2.000 Datensätze pro Sekunde verarbeiten, wobei eine Grenze von 5 eingehalten wird. MB/s Dies wird wie folgt berechnet: (20 Datensätze × 1 000 ms/50 ms) × 5 gleichzeitige Lambda-Aufrufe. Wenn Ihre gewünschte Spitzenerfassungsrate also 20 000 Datensätze pro Sekunde beträgt, benötigen Sie mindestens 10 Ereignis-Poller.

**Anmerkung**  
Wir empfehlen, zusätzliche Ereignis-Pollers als Puffer bereitzustellen, um einen konstanten Betrieb bei maximaler Kapazität zu vermeiden.

Der Bereitstellungsmodus skaliert Ihre Ereignis-Poller automatisch basierend auf den Datenverkehrsmustern innerhalb der konfigurierten minimalen und maximalen **Ereignis-Poller**, was eine Neugewichtung auslösen und somit zusätzliche Latenz verursachen kann. Sie können Auto Scaling deaktivieren, indem Sie denselben Wert für den minimalen und maximalen **Ereignis-Poller** konfigurieren.

### Weitere Überlegungen
<a name="additional-considerations-low-latency"></a>

Zu den weiteren Überlegungen gehören:
+ Kaltstarts beim Aufruf Ihrer Lambda-Zielfunktion können die Latenz potenziell erhöhen end-to-end. Um dieses Risiko zu verringern, sollten Sie in Erwägung ziehen, die [bereitgestellte Parallelität](provisioned-concurrency.md) oder [SnapStart](snapstart.md)die Zielfunktion Ihres Event-Quellen-Mappings zu aktivieren. Optimieren Sie außerdem die Speicherzuweisung Ihrer Funktion, um eine konsistente und optimale Ausführung sicherzustellen.
+ Wenn `MaximumBatchingWindowInSeconds` auf 0 gesetzt ist, verarbeitet Lambda alle verfügbaren Datensätze sofort, ohne auf das Erreichen der vollständigen Batchgröße zu warten. Wenn Ihre Batchgröße beispielsweise auf 1 000 Datensätze festgelegt ist, aber nur 100 Datensätze verfügbar sind, verarbeitet Lambda diese 100 Datensätze sofort, anstatt zu warten, bis die vollständigen 1 000 Datensätze gesammelt sind.

**Wichtig**  
Die optimale Konfiguration für eine Verarbeitung mit geringer Latenz hängt stark von Ihrer spezifischen Workload ab. Wir empfehlen dringend, verschiedene Konfigurationen mit Ihrer tatsächlichen Workload zu testen, um die besten Einstellungen für Ihren Anwendungsfall zu ermitteln. 

# Konfiguration der Fehlerbehandlungssteuerungen für Kafka-Ereignisquellen
<a name="kafka-retry-configurations"></a>

Sie können konfigurieren, wie Lambda Fehler und Wiederholungen für Ihre Kafka-Ereignisquellenzuordnungen behandelt. Mit diesen Konfigurationen können Sie steuern, wie Lambda fehlgeschlagene Datensätze verarbeitet und das Wiederholungsverhalten verwaltet.

## Verfügbare Wiederholungskonfigurationen
<a name="kafka-retry-options"></a>

Die folgenden Wiederholungskonfigurationen sind sowohl für Amazon MSK als auch für selbstverwaltete Kafka-Ereignisquellen verfügbar:
+ **Maximale Wiederholungsversuche** — Die maximale Anzahl von Wiederholungsversuchen von Lambda, wenn Ihre Funktion einen Fehler zurückgibt. Der erste Aufrufversuch wird dabei nicht mitgezählt. Die Standardeinstellung ist -1 (unendlich). Wenn Sie sowohl unendliche Wiederholungsversuche als auch ein [Ziel für den Fall eines Fehlers](kafka-on-failure-destination.md) konfigurieren, wendet Lambda automatisch maximal 10 Wiederholungsversuche an.
+ **Maximales Datensatzalter** — Das maximale Alter eines Datensatzes, den Lambda an Ihre Funktion sendet. Die Standardeinstellung ist -1 (unendlich).
+ **Batch bei Fehler aufteilen** — Wenn Ihre Funktion einen Fehler zurückgibt, teilen Sie den Batch in zwei kleinere Batches auf und versuchen Sie es jeweils einzeln erneut. Dies hilft, problematische Datensätze zu isolieren.
+ **Partielle Batch-Antwort** — Erlauben Sie Ihrer Funktion, Informationen darüber zurückzugeben, welche Datensätze in einem Batch nicht verarbeitet werden konnten, sodass Lambda nur die fehlgeschlagenen Datensätze erneut versuchen kann.

## Konfiguration von Steuerelementen zur Fehlerbehandlung (Konsole)
<a name="kafka-retry-console"></a>

Sie können das Wiederholungsverhalten konfigurieren, wenn Sie eine Kafka-Ereignisquellenzuordnung in der Lambda-Konsole erstellen oder aktualisieren.

**So konfigurieren Sie das Wiederholungsverhalten für eine Kafka-Ereignisquelle (Konsole)**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie den Namen Ihrer Funktion.

1. Führen Sie eine der folgenden Aktionen aus:
   + Um einen neuen Kafka-Trigger hinzuzufügen, wählen Sie unter **Funktionsübersicht** die Option **Trigger hinzufügen** aus.
   + **Um einen vorhandenen Kafka-Trigger zu ändern, wählen Sie den Auslöser aus und klicken Sie dann auf Bearbeiten.**

1. Wählen Sie unter **Konfiguration des Event-Pollers** den Bereitstellungsmodus aus, um die Kontrollen zur Fehlerbehandlung zu konfigurieren:

   1. Geben Sie für **Wiederholungsversuche** die maximale Anzahl von Wiederholungsversuchen ein (0-10000 oder -1 für unendlich).

   1. Geben Sie für **Maximales Datensatzalter** das Höchstalter in Sekunden ein (60-604800 oder -1 für unendlich).

   1. Um die Stapelaufteilung bei Fehlern zu aktivieren, wählen Sie Batch bei Fehler **aufteilen** aus.

   1. Um die teilweise Batch-Antwort zu aktivieren, wählen Sie **ReportBatchItemFailures**.

1. Wählen **Sie Hinzufügen** oder **Speichern**.

## Konfiguration des Wiederholungsverhaltens ()AWS CLI
<a name="kafka-retry-cli"></a>

Verwenden Sie die folgenden AWS CLI Befehle, um das Wiederholungsverhalten für Ihre Kafka-Ereignisquellenzuordnungen zu konfigurieren.

### Erstellen einer Ereignisquellenzuordnung mit Wiederholungskonfigurationen
<a name="kafka-retry-cli-create"></a>

Im folgenden Beispiel wird eine selbstverwaltete Kafka-Ereignisquellenzuordnung mit Steuerelementen zur Fehlerbehandlung erstellt:

```
aws lambda create-event-source-mapping \
  --function-name my-kafka-function \
  --topics my-kafka-topic \
  --source-access-configuration Type=SASL_SCRAM_512_AUTH,URI=arn:aws:secretsmanager:us-east-1:111122223333:secret:MyBrokerSecretName \
  --self-managed-event-source '{"Endpoints":{"KAFKA_BOOTSTRAP_SERVERS":["abc.xyz.com:9092"]}}' \
  --starting-position LATEST \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=1 \
  --maximum-retry-attempts 3 \
  --maximum-record-age-in-seconds 3600 \
  --bisect-batch-on-function-error \
  --function-response-types "ReportBatchItemFailures"
```

Für Amazon MSK-Ereignisquellen:

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:cluster/my-cluster/fc2f5bdf-fd1b-45ad-85dd-15b4a5a6247e-2 \
  --topics AWSMSKKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function \
  --source-access-configurations '[{"Type": "SASL_SCRAM_512_AUTH","URI": "arn:aws:secretsmanager:us-east-1:111122223333:secret:my-secret"}]' \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=1 \
  --maximum-retry-attempts 3 \
  --maximum-record-age-in-seconds 3600 \
  --bisect-batch-on-function-error \
  --function-response-types "ReportBatchItemFailures"
```

### Wiederholungskonfigurationen werden aktualisiert
<a name="kafka-retry-cli-update"></a>

Verwenden Sie den `update-event-source-mapping` Befehl, um Wiederholungskonfigurationen für eine bestehende Ereignisquellenzuordnung zu ändern:

```
aws lambda update-event-source-mapping \
  --uuid 12345678-1234-1234-1234-123456789012 \
  --maximum-retry-attempts 5 \
  --maximum-record-age-in-seconds 7200 \
  --bisect-batch-on-function-error \
  --function-response-types "ReportBatchItemFailures"
```

## PartialBatchResponse
<a name="kafka-partial-batch-response"></a>

Die partielle Batch-Antwort, auch bekannt als ReportBatchItemFailures, ist eine wichtige Funktion für die Fehlerbehandlung bei der Integration von Lambda mit Kafka-Quellen. Ohne diese Funktion führt ein Fehler in einem der Elemente in einem Batch dazu, dass alle Nachrichten in diesem Batch erneut verarbeitet werden. Wenn die partielle Batch-Antwort aktiviert und implementiert ist, gibt der Handler nur Identifikatoren für die fehlgeschlagenen Nachrichten zurück, sodass Lambda nur diese spezifischen Elemente erneut versuchen kann. Dies ermöglicht eine bessere Kontrolle darüber, wie Batches mit fehlgeschlagenen Nachrichten verarbeitet werden.

Um Batchfehler zu melden, verwenden Sie dieses JSON-Schema:

```
{
  "batchItemFailures": [
    {
      "itemIdentifier": {
        "partition": "topic-partition_number",
        "offset": 100
      }
    },
    ...
  ]
}
```

**Wichtig**  
Wenn Sie einen leeren, gültigen JSON-Code oder einen Nullwert zurückgeben, betrachtet die Zuordnung der Ereignisquelle einen Batch als erfolgreich verarbeitet. Jede zurückgegebene ungültige Topic-Partition\$1Number oder Offset, die im aufgerufenen Ereignis nicht enthalten waren, wird als Fehler behandelt, und der gesamte Batch wird erneut versucht.

Die folgenden Codebeispiele zeigen, wie eine partielle Batch-Antwort für Lambda-Funktionen implementiert wird, die Ereignisse aus Kafka-Quellen empfangen. Die Funktion meldet die Batch-Elementfehler in der Antwort und signalisiert Lambda, diese Nachrichten später erneut zu versuchen.

Hier ist eine Python-Lambda-Handler-Implementierung, die diesen Ansatz zeigt:

```
import base64
from typing import Any, Dict, List

def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, List[Dict[str, Dict[str, Any]]]]:
    failures: List[Dict[str, Dict[str, Any]]] = []
    records_dict = event.get("records", {})
    
    for topic_partition, records_list in records_dict.items():
        for record in records_list:
            topic = record.get("topic")
            partition = record.get("partition")
            offset = record.get("offset")
            value_b64 = record.get("value")
            
            try:
                data = base64.b64decode(value_b64).decode("utf-8")
                process_message(data)
            except Exception as exc:
                print(f"Failed to process record topic={topic} partition={partition} offset={offset}: {exc}")
                item_identifier: Dict[str, Any] = {
                    "partition": f"{topic}-{partition}",
                    "offset": int(offset) if offset is not None else None,
                }
                failures.append({"itemIdentifier": item_identifier})
    
    return {"batchItemFailures": failures}

def process_message(data: str) -> None:
    # Your business logic for a single message
    pass
```

Hier ist eine Version von Node.js:

```
const { Buffer } = require("buffer");

const handler = async (event) => {
  const failures = [];
  
  for (let topicPartition in event.records) {
    const records = event.records[topicPartition];
    
    for (const record of records) {
      const topic = record.topic;
      const partition = record.partition;
      const offset = record.offset;
      const valueBase64 = record.value;
      const data = Buffer.from(valueBase64, "base64").toString("utf8");
      
      try {
        await processMessage(data);
      } catch (error) {
        console.error("Failed to process record", { topic, partition, offset, error });
        const itemIdentifier = {
          "partition": `${topic}-${partition}`,
          "offset": Number(offset),
        };
        failures.push({ itemIdentifier });
      }
    }
  }
  
  return { batchItemFailures: failures };
};

async function processMessage(payload) {
  // Your business logic for a single message
}

module.exports = { handler };
```

# Erfassen verworfener Batches für Amazon MSK und selbstverwaltete Apache-Kafka-Ereignisquellen
<a name="kafka-on-failure"></a>

Um Datensätze zu fehlgeschlagenen Aufrufen zur Zuordnung von Ereignisquellen beizubehalten, fügen Sie der Zuordnung von Ereignisquellen Ihrer Funktion ein Ziel hinzu. Jeder an das Ziel gesendete Datensatz ist ein JSON-Dokument mit Metadaten über den fehlgeschlagenen Aufruf. Bei Amazon S3-Zielen sendet Lambda auch den gesamten Aufrufdatensatz zusammen mit den Metadaten. Sie können jedes Amazon SNS SNS-Thema, jede Amazon SQS SQS-Warteschlange, jeden Amazon S3 S3-Bucket oder Kafka als Ziel konfigurieren.

Bei Amazon-S3-Zielen können Sie das Feature [Amazon S3 Event Notifications](https://docs.aws.amazon.com/) verwenden, um Benachrichtigungen zu erhalten, wenn Objekte in Ihren S3-Ziel-Bucket hochgeladen werden. Sie können S3-Ereignisbenachrichtigungen auch so konfigurieren, dass sie eine andere Lambda-Funktion aufrufen, um eine automatische Verarbeitung für fehlgeschlagene Stapel durchzuführen.

Ihre Ausführungsrolle muss über Berechtigungen für das Ziel verfügen:
+ **[Für ein SQS-Ziel: sqs: SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)**
+ **[Für ein SNS-Ziel: sns:Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)**
+ **Für ein S3-Ziel: s3:** [und [s3: PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/ListObjectsV2.html)
+ **Für ein Kafka-Ziel: [kafka-cluster](https://docs.aws.amazon.com/msk/latest/developerguide/kafka-actions.html):** WriteData

Sie können ein Kafka-Thema als Ziel für den Fall eines Fehlers für Ihre Quellenzuordnungen für Kafka-Ereignisse konfigurieren. Wenn Lambda Datensätze nach anstrengenden Wiederholungsversuchen nicht verarbeiten kann oder wenn Datensätze das Höchstalter überschreiten, sendet Lambda die fehlgeschlagenen Datensätze zur späteren Verarbeitung an das angegebene Kafka-Thema. Weitere Informationen finden Sie unter [Ein Kafka-Thema als Ziel für den Fall eines Fehlers verwenden](kafka-on-failure-destination.md).

Sie müssen einen VPC-Endpunkt für Ihren Fehlerziel-Service innerhalb Ihrer Kafka-Cluster-VPC bereitstellen.

Wenn Sie einen KMS-Schlüssel für Ihr Ziel konfiguriert haben, benötigt Lambda außerdem je nach Zieltyp folgende Berechtigungen:
+ [Wenn Sie die Verschlüsselung mit Ihrem eigenen KMS-Schlüssel für ein S3-Ziel aktiviert haben, ist kms: erforderlich. GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) Wenn sich der KMS-Schlüssel und das S3-Bucket-Ziel in einem anderen Konto als Ihre Lambda-Funktion und Ausführungsrolle befinden, konfigurieren Sie den KMS-Schlüssel so, dass er der Ausführungsrolle vertraut, die zugelassen kms: GenerateDataKey wird.
+ [Wenn Sie die Verschlüsselung mit Ihrem eigenen KMS-Schlüssel für das SQS-Ziel aktiviert haben, sind [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) und kms: erforderlich. GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) [Wenn sich der KMS-Schlüssel und das SQS-Warteschlangenziel in einem anderen Konto als Ihre Lambda-Funktion und Ausführungsrolle befinden, konfigurieren Sie den KMS-Schlüssel so, dass er der Ausführungsrolle vertraut, um kms: Decrypt, kms:GenerateDataKey, [kms: und kms: DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) zuzulassen. ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html)
+ [Wenn Sie die Verschlüsselung mit Ihrem eigenen KMS-Schlüssel für das SNS-Ziel aktiviert haben, sind [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) und kms: erforderlich. GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) [Wenn sich der KMS-Schlüssel und das SNS-Themenziel in einem anderen Konto als Ihre Lambda-Funktion und Ausführungsrolle befinden, konfigurieren Sie den KMS-Schlüssel so, dass er der Ausführungsrolle vertraut, um kms: Decrypt, kms:GenerateDataKey, [kms: und kms: DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) zuzulassen. ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html)

## Konfigurieren von Fehlerzielen für eine Kafka-Zuordnung von Ereignisquellen
<a name="kafka-onfailure-destination"></a>

Gehen Sie folgendermaßen vor, um ein Ausfallziel mit der Konsole zu konfigurieren:

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie eine Funktion aus.

1. Wählen Sie unter **Function overview (Funktionsübersicht)** die Option **Add destination (Ziel hinzufügen)**.

1. Wählen Sie als **Quelle** die Option **Aufruf der Zuordnung von Ereignisquellen** aus.

1. Wählen Sie für die **Zuordnung von Ereignisquellen** eine Ereignisquelle aus, die für diese Funktion konfiguriert ist.

1. Wählen Sie für **Bedingung** die Option **Bei Ausfall** aus. Für Aufrufe zur Zuordnung von Ereignisquellen ist dies die einzig akzeptierte Bedingung.

1. Wählen Sie unter **Zieltyp** den Zieltyp aus, an den Lambda Aufrufdatensätze sendet.

1. Wählen Sie unter **Destination (Ziel)** eine Ressource aus.

1. Wählen Sie **Speichern**.

Sie können mit der AWS CLI auch ein Ausfallziel konfigurieren. Mit dem folgenden [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)Befehl wird beispielsweise eine Ereignisquellenzuordnung mit einem SQS-Ziel für den Fall eines Fehlers hinzugefügt: `MyFunction`

```
aws lambda create-event-source-mapping \
--function-name "MyFunction" \
--event-source-arn arn:aws:kafka:us-east-1:123456789012:cluster/vpc-2priv-2pub/751d2973-a626-431c-9d4e-d7975eb44dd7-2 \
--destination-config '{"OnFailure": {"Destination": "arn:aws:sqs:us-east-1:123456789012:dest-queue"}}'
```

Mit dem folgenden [update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html)Befehl wird der mit der Eingabe verknüpften Ereignisquelle ein S3-Ziel für den Fall eines Fehlers hinzugefügt: `uuid`

```
aws lambda update-event-source-mapping \
--uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
--destination-config '{"OnFailure": {"Destination": "arn:aws:s3:::dest-bucket"}}'
```

Um ein Ziel zu entfernen, geben Sie eine leere Zeichenfolge als Argument für den `destination-config`-Parameter an:

```
aws lambda update-event-source-mapping \
--uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
--destination-config '{"OnFailure": {"Destination": ""}}'
```

### Bewährte Methoden für die Sicherheit in Amazon S3-Zielen
<a name="kafka-s3-destination-security"></a>

Das Löschen eines S3-Buckets, der als Ziel konfiguriert ist, ohne das Ziel aus der Konfiguration Ihrer Funktion zu entfernen, kann ein Sicherheitsrisiko darstellen. Wenn ein anderer Benutzer den Namen Ihres Ziel-Buckets kennt, kann er den Bucket in seinem AWS-Konto neu erstellen. Aufzeichnungen über fehlgeschlagene Aufrufe werden an den entsprechenden Bucket gesendet, wodurch möglicherweise Daten aus Ihrer Funktion verfügbar gemacht werden.

**Warnung**  
Um sicherzustellen, dass Aufrufdatensätze Ihrer Funktion nicht an einen S3-Bucket in einem anderen gesendet werden können AWS-Konto, fügen Sie der Ausführungsrolle Ihrer Funktion eine Bedingung hinzu, die die `s3:PutObject` Berechtigungen auf Buckets in Ihrem Konto beschränkt. 

-Das folgende Beispiel zeigt eine IAM-Richtlinie, die die `s3:PutObject`-Berechtigungen Ihrer Funktion auf Buckets in Ihrem Konto beschränkt. Diese Richtlinie gibt Lambda auch die `s3:ListBucket`-Erlaubnis, einen S3-Bucket als Ziel zu verwenden.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*/*",
                "arn:aws:s3:::*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

Um der Ausführungsrolle Ihrer Funktion mithilfe von AWS-Managementkonsole oder eine Berechtigungsrichtlinie hinzuzufügen AWS CLI, lesen Sie die Anweisungen in den folgenden Verfahren:

------
#### [ Console ]

**So fügen Sie der Ausführungsrolle einer Funktion (Konsole) eine Berechtigungsrichtlinie hinzu**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Lambda-Funktion aus, deren Ausführungsrolle Sie ändern möchten.

1. Klicken Sie in der Registerkarte **Konfiguration** auf die Option **Berechtigungen**.

1. Wählen Sie auf der Registerkarte **Ausführungsrolle** den **Rollennamen** Ihrer Funktion aus, um die IAM-Konsolenseite der Rolle zu öffnen.

1. Fügen Sie der Rolle wie folgt eine Richtlinie mit Berechtigungen hinzu:

   1. Wählen Sie im Bereich **Berechtigungsrichtlinien** die Optionen **Berechtigungen hinzufügen** und dann **Inline-Richtlinie erstellen** aus.

   1. Wählen Sie im **Richtlinien-Editor** **JSON** aus.

   1. Fügen Sie die Richtlinie, die Sie hinzufügen möchten, in den Editor ein (indem Sie die vorhandene JSON-Datei ersetzt) und wählen Sie dann **Weiter** aus.

   1. Geben Sie unter **Richtliniendetails** für den **Richtliniennamen** ein.

   1. Wählen Sie **Richtlinie erstellen** aus.

------
#### [ AWS CLI ]

**So fügen Sie der Ausführungsrolle einer Funktion (CLI) eine Berechtigungsrichtlinie hinzu**

1. Erstellen Sie ein JSON-Richtliniendokument mit den erforderlichen Berechtigungen und speichern Sie es in einem lokalen Verzeichnis.

1. Verwenden Sie den `put-role-policy` IAM-CLI-Befehl, um die Berechtigungen zur Ausführungsrolle Ihrer Funktion hinzuzufügen. Führen Sie den folgenden Befehl in dem Verzeichnis aus, in dem Sie Ihr JSON-Richtliniendokument gespeichert haben und ersetzen Sie den Rollennamen, den Richtliniennamen und das Richtliniendokument durch Ihre eigenen Werte.

   ```
   aws iam put-role-policy \
   --role-name my_lambda_role \
   --policy-name LambdaS3DestinationPolicy \
   --policy-document file://my_policy.json
   ```

------

### SNS- und SQS-Beispiel-Aufrufsatz
<a name="kafka-sns-sqs-destinations"></a>

Das folgende Beispiel zeigt, was Lambda bei einem fehlgeschlagenen Aufruf der Kafka-Ereignisquelle an ein SNS-Thema oder eine SQS-Warteschlange sendet. Jeder der Schlüssel unter `recordsInfo` enthält sowohl das Kafka-Thema als auch die Kafka-Partition, getrennt durch einen Bindestrich. Bei dem Schlüssel `"Topic-0"` handelt es sich beispielsweise bei `Topic` um das Kafka-Thema und bei `0` um die Partition. Für jedes Thema und jede Partition können Sie die Offsets und Zeitstempeldaten verwenden, um die ursprünglichen Aufrufdatensätze zu finden.

```
{
    "requestContext": {
        "requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81",
        "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:myfunction",
        "condition": "RetryAttemptsExhausted" | "MaximumPayloadSizeExceeded",
        "approximateInvokeCount": 1
    },
    "responseContext": { // null if record is MaximumPayloadSizeExceeded
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "version": "1.0",
    "timestamp": "2019-11-14T00:38:06.021Z",
    "KafkaBatchInfo": {
        "batchSize": 500,
        "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/vpc-2priv-2pub/751d2973-a626-431c-9d4e-d7975eb44dd7-2",
        "bootstrapServers": "...",
        "payloadSize": 2039086, // In bytes
        "recordsInfo": {
            "Topic-0": {
                "firstRecordOffset": "49601189658422359378836298521827638475320189012309704722",
                "lastRecordOffset": "49601189658422359378836298522902373528957594348623495186",
                "firstRecordTimestamp": "2019-11-14T00:38:04.835Z",
                "lastRecordTimestamp": "2019-11-14T00:38:05.580Z",
            },
            "Topic-1": {
                "firstRecordOffset": "49601189658422359378836298521827638475320189012309704722",
                "lastRecordOffset": "49601189658422359378836298522902373528957594348623495186",
                "firstRecordTimestamp": "2019-11-14T00:38:04.835Z",
                "lastRecordTimestamp": "2019-11-14T00:38:05.580Z",
            }
        }
    }
}
```

### S3-Ziel Beispiel-Aufrufsatz
<a name="kafka-s3-destinations"></a>

Für S3-Ziele sendet Lambda den gesamten Aufrufdatensatz zusammen mit den Metadaten an das Ziel. Das folgende Beispiel zeigt, was Lambda bei einem fehlgeschlagenen Aufruf der Kafka-Ereignisquelle an ein S3-Bucket-Ziel sendet. Zusätzlich zu allen Feldern aus dem vorherigen Beispiel für SQS- und SNS-Ziele enthält das Feld `payload` den ursprünglichen Aufrufdatensatz als maskierte JSON-Zeichenfolge.

```
{
    "requestContext": {
        "requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81",
        "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:myfunction",
        "condition": "RetryAttemptsExhausted" | "MaximumPayloadSizeExceeded",
        "approximateInvokeCount": 1
    },
    "responseContext": { // null if record is MaximumPayloadSizeExceeded
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "version": "1.0",
    "timestamp": "2019-11-14T00:38:06.021Z",
    "KafkaBatchInfo": {
        "batchSize": 500,
        "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/vpc-2priv-2pub/751d2973-a626-431c-9d4e-d7975eb44dd7-2",
        "bootstrapServers": "...",
        "payloadSize": 2039086, // In bytes
        "recordsInfo": {
            "Topic-0": {
                "firstRecordOffset": "49601189658422359378836298521827638475320189012309704722",
                "lastRecordOffset": "49601189658422359378836298522902373528957594348623495186",
                "firstRecordTimestamp": "2019-11-14T00:38:04.835Z",
                "lastRecordTimestamp": "2019-11-14T00:38:05.580Z",
            },
            "Topic-1": {
                "firstRecordOffset": "49601189658422359378836298521827638475320189012309704722",
                "lastRecordOffset": "49601189658422359378836298522902373528957594348623495186",
                "firstRecordTimestamp": "2019-11-14T00:38:04.835Z",
                "lastRecordTimestamp": "2019-11-14T00:38:05.580Z",
            }
        }
    },
    "payload": "<Whole Event>" // Only available in S3
}
```

**Tipp**  
Wir empfehlen außerdem, die S3-Versionsverwaltung in Ihrem Ziel-Bucket zu aktivieren.

# Ein Kafka-Thema als Ziel für den Fall eines Fehlers verwenden
<a name="kafka-on-failure-destination"></a>

Sie können ein Kafka-Thema als Ziel für den Fall eines Fehlers für Ihre Quellenzuordnungen für Kafka-Ereignisse konfigurieren. Wenn Lambda Datensätze nach anstrengenden Wiederholungsversuchen nicht verarbeiten kann oder wenn Datensätze das Höchstalter überschreiten, sendet Lambda die fehlgeschlagenen Datensätze zur späteren Verarbeitung an das angegebene Kafka-Thema. Wenn Sie sowohl [unendliche Wiederholungsversuche](kafka-retry-configurations.md) als auch ein Ziel für den Fall eines Fehlers konfigurieren, wendet Lambda automatisch maximal 10 Wiederholungsversuche an.

## So funktioniert ein Kafka-Ziel für den Fall eines Fehlers
<a name="kafka-ofd-overview"></a>

Wenn Sie ein Kafka-Thema als Ziel für den Fall eines Fehlers konfigurieren, fungiert Lambda als Kafka-Producer und schreibt fehlgeschlagene Datensätze in das Zielthema. Auf diese Weise entsteht in Ihrer Kafka-Infrastruktur ein Muster mit veralteten Themen (DLT).
+ **Gleiche Clusteranforderung** — Das Zielthema muss im selben Kafka-Cluster wie Ihre Quellthemen vorhanden sein.
+ **Tatsächlicher Datensatzinhalt** — Kafka-Ziele erhalten die tatsächlich fehlgeschlagenen Datensätze zusammen mit den Fehlermetadaten.
+ **Rekursionsprävention** — Lambda verhindert Endlosschleifen, indem es Konfigurationen blockiert, bei denen Quell- und Zielthemen identisch sind.

## Konfiguration eines Kafka-Ziels für den Fall eines Fehlers
<a name="kafka-ofd-configure"></a>

Sie können ein Kafka-Thema als Ziel für den Fall eines Fehlers konfigurieren, wenn Sie eine Kafka-Ereignisquellenzuordnung erstellen oder aktualisieren.

### Konfiguration eines Kafka-Ziels (Konsole)
<a name="kafka-ofd-console"></a>

**Um ein Kafka-Thema als Ziel für den Fall eines Fehlers zu konfigurieren (Konsole)**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie den Namen Ihrer Funktion.

1. Führen Sie eine der folgenden Aktionen aus:
   + Um einen neuen Kafka-Trigger hinzuzufügen, wählen Sie unter **Funktionsübersicht** die Option **Trigger hinzufügen** aus.
   + **Um einen vorhandenen Kafka-Trigger zu ändern, wählen Sie den Auslöser aus und klicken Sie dann auf Bearbeiten.**

1. Wählen Sie unter **Zusätzliche Einstellungen** für **Ziel bei einem Fehler** die Option **Kafka-Thema** aus.

1. Geben Sie als **Themenname** den Namen des Kafka-Themas ein, an das Sie fehlerhafte Datensätze senden möchten.

1. Wählen Sie **Hinzufügen** oder **Speichern**.

### Konfiguration eines Kafka-Ziels ()AWS CLI
<a name="kafka-ofd-cli"></a>

Verwenden Sie das `kafka://` Präfix, um ein Kafka-Thema als Ziel für den Fall eines Fehlers anzugeben.

#### Erstellen einer Ereignisquellenzuordnung mit einem Kafka-Ziel
<a name="kafka-ofd-cli-create"></a>

Im folgenden Beispiel wird eine Amazon MSK-Ereignisquellenzuordnung mit einem Kafka-Thema als Ziel für den Fall eines Fehlers erstellt:

```
aws lambda create-event-source-mapping \
  --function-name my-kafka-function \
  --topics AWSKafkaTopic \
  --event-source-arn arn:aws:kafka:us-east-1:123456789012:cluster/my-cluster/abc123 \
  --starting-position LATEST \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=3 \
  --destination-config '{"OnFailure":{"Destination":"kafka://failed-records-topic"}}'
```

Verwenden Sie für selbstverwaltetes Kafka dieselbe Syntax:

```
aws lambda create-event-source-mapping \
  --function-name my-kafka-function \
  --topics AWSKafkaTopic \
  --self-managed-event-source '{"Endpoints":{"KAFKA_BOOTSTRAP_SERVERS":["abc.xyz.com:9092"]}}' \
  --starting-position LATEST \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=3 \
  --destination-config '{"OnFailure":{"Destination":"kafka://failed-records-topic"}}'
```

#### Aktualisierung einer Kafka-Destination
<a name="kafka-ofd-cli-update"></a>

Verwenden Sie den `update-event-source-mapping` Befehl, um ein Kafka-Ziel hinzuzufügen oder zu ändern:

```
aws lambda update-event-source-mapping \
  --uuid 12345678-1234-1234-1234-123456789012 \
  --destination-config '{"OnFailure":{"Destination":"kafka://failed-records-topic"}}'
```

## Datensatzformat für ein Kafka-Ziel
<a name="kafka-ofd-record-format"></a>

Wenn Lambda fehlgeschlagene Datensätze an ein Kafka-Thema sendet, enthält jede Nachricht sowohl Metadaten über den Fehler als auch den eigentlichen Datensatzinhalt.

### Metadaten für den Fehler
<a name="kafka-ofd-metadata"></a>

Die Metadaten enthalten Informationen darüber, warum der Datensatz fehlgeschlagen ist, und Details zum ursprünglichen Batch:

```
{
  "requestContext": {
    "requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e",
    "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function:$LATEST",
    "condition": "RetriesExhausted",
    "approximateInvokeCount": 3
  },
  "responseContext": {
    "statusCode": 200,
    "executedVersion": "$LATEST",
    "functionError": "Unhandled"
  },
  "version": "1.0",
  "timestamp": "2019-11-14T18:16:05.568Z",
  "KafkaBatchInfo": {
    "batchSize": 1,
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-cluster/abc123",
    "bootstrapServers": "b-1.mycluster.abc123.kafka.us-east-1.amazonaws.com:9098",
    "payloadSize": 1162,
    "recordInfo": {
      "offset": "49601189658422359378836298521827638475320189012309704722",
      "timestamp": "2019-11-14T18:16:04.835Z"
    }
  },
  "payload": {
    "bootstrapServers": "b-1.mycluster.abc123.kafka.us-east-1.amazonaws.com:9098",
    "eventSource": "aws:kafka",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-cluster/abc123",
    "records": {
      "my-topic-0": [
        {
          "headers": [],
          "key": "dGVzdC1rZXk=",
          "offset": 100,
          "partition": 0,
          "timestamp": 1749116692330,
          "timestampType": "CREATE_TIME",
          "topic": "my-topic",
          "value": "dGVzdC12YWx1ZQ=="
        }
      ]
    }
  }
}
```

### Verhalten der Partitionsschlüssel
<a name="kafka-ofd-partitioning"></a>

Lambda verwendet beim Produzieren zum Zielthema denselben Partitionsschlüssel wie im Originaldatensatz. Wenn der ursprüngliche Datensatz keinen Schlüssel hatte, verwendet Lambda die standardmäßige Round-Robin-Partitionierung von Kafka für alle verfügbaren Partitionen im Zielthema.

## Anforderungen und Einschränkungen
<a name="kafka-ofd-requirements"></a>
+ **Bereitgestellter Modus erforderlich** — Ein Kafka-Ziel für den Fall eines Fehlers ist nur für Zuordnungen von Ereignisquellen verfügbar, bei denen der Bereitstellungsmodus aktiviert ist.
+ **Nur derselbe Cluster** — Das Zielthema muss im selben Kafka-Cluster wie Ihre Quellthemen vorhanden sein.
+ **Themenberechtigungen** — Ihre Zuordnung zur Ereignisquelle muss über Schreibberechtigungen für das Zielthema verfügen. Beispiel:

  ```
  {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "ClusterPermissions",
              "Effect": "Allow",
              "Action": [
                  "kafka-cluster:Connect",
                  "kafka-cluster:DescribeCluster",
                  "kafka-cluster:DescribeTopic",
                  "kafka-cluster:WriteData",
                  "kafka-cluster:ReadData"
              ],
              "Resource": [
                  "arn:aws:kafka:*:*:cluster/*"
              ]
          },
          {
              "Sid": "TopicPermissions",
              "Effect": "Allow",
              "Action": [
                  "kafka-cluster:DescribeTopic",
                  "kafka-cluster:WriteData",
                  "kafka-cluster:ReadData"
              ],
              "Resource": [
                  "arn:aws:kafka:*:*:topic/*/*"
              ]
          },
          {
              "Effect": "Allow",
              "Action": [
                  "kafka:DescribeCluster",
                  "kafka:GetBootstrapBrokers",
                  "kafka:Produce"
              ],
              "Resource": "arn:aws:kafka:*:*:cluster/*"
          },
          {
              "Effect": "Allow",
              "Action": [
                  "ec2:CreateNetworkInterface",
                  "ec2:DescribeNetworkInterfaces",
                  "ec2:DeleteNetworkInterface",
                  "ec2:DescribeSubnets",
                  "ec2:DescribeSecurityGroups"
              ],
              "Resource": "*"
          }
      ]
  }
  ```
+ **Keine Rekursion** — Der Name des Zielthemas darf nicht mit einem Ihrer Quellthemennamen identisch sein.

# Protokollierung der Zuordnung von Kafka-Ereignisquellen
<a name="esm-logging"></a>

Sie können die Protokollierung auf Systemebene für Ihre Kafka-Ereignisquellenzuordnungen konfigurieren, um die Systemprotokolle zu aktivieren und zu filtern, an die Lambda-Ereignisabfragen senden. CloudWatch 

[Diese Funktion ist nur für Kafka-Ereignisquellenzuordnungen und im Bereitstellungsmodus verfügbar.](https://docs.aws.amazon.com/lambda/latest/dg/kafka-scaling-modes.html#kafka-provisioned-mode)

Für die Zuordnung von Ereignisquellen mit Protokollierungskonfiguration können Sie jetzt auch die Systemprotokolle aus vorgefertigten Protokollabfragen auf der Registerkarte **Monitor** auf der Seite Konsole **Lambda** > **Zusätzliche Ressourcen** > **Ereignisquellenzuordnungen** überprüfen.

## Wie funktioniert die Protokollierung
<a name="esm-logging-overview"></a>

Wenn Sie die Protokollierungskonfiguration mit Protokollebene in Ihrer Ereignisquellenzuordnung festlegen, sendet der Lambda-Ereignisabfrage entsprechende Protokolle (Systemprotokolle für die Ereignisquellenzuweisung).

Die Zuordnung der Ereignisquelle verwendet dasselbe [Protokollziel](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-logs.html#configuring-log-destinations) wie Ihre Lambda-Funktion erneut. Stellen Sie sicher, dass die Ausführungsrolle Ihrer Lambda-Funktion über die erforderlichen Protokollierungsberechtigungen verfügt.

Die Zuordnung der Ereignisquelle wird über einen eigenen Protokollstream verfügen, mit Datum und UUID für die Zuordnung der Ereignisquelle als Protokollstreamname, z. B. `2020/01/01/12345678-1234-1234-1234-12345678901`

Für Systemprotokolle zur Zuordnung von Ereignisquellen können Sie zwischen den folgenden Protokollebenen wählen.


| Protokollebene | Usage | 
| --- | --- | 
| DEBUG (am detailliertesten) | Detaillierte Informationen zum Fortschritt der Verarbeitung der Ereignisquelle | 
| INFO | Meldungen über den normalen Betrieb Ihrer Ereignisquellenzuordnung | 
| WARN (am wenigsten Details) | Meldungen über mögliche Warnungen und Fehler, die zu unerwartetem Verhalten führen können | 

Wenn Sie eine Protokollebene auswählen, sendet der Lambda-Ereignisabfrage Protokolle auf dieser Ebene und niedriger. Wenn Sie beispielsweise die Systemprotokollebene für die Zuordnung von Ereignisquellen auf INFO setzen, sendet der Event-Poller keine Protokollausgaben auf der DEBUG-Ebene.

## Konfigurieren der Protokollierung
<a name="esm-logging-configure"></a>

Sie können die Protokollierungskonfiguration festlegen, wenn Sie eine Kafka-Ereignisquellenzuordnung erstellen oder aktualisieren.

### Konfiguration der Protokollierung (Konsole)
<a name="esm-logging-console"></a>

**Um die Protokollierung zu konfigurieren (Konsole)**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie den Namen Ihrer Funktion.

1. Führen Sie eine der folgenden Aktionen aus:
   + Um einen neuen Kafka-Trigger hinzuzufügen, wählen Sie unter **Funktionsübersicht** die Option **Trigger hinzufügen** aus.
   + **Um einen vorhandenen Kafka-Trigger zu ändern, wählen Sie den Auslöser aus und klicken Sie dann auf Bearbeiten.**

1. **Aktivieren Sie unter **Konfiguration des Event-Pollers** für den **Bereitstellungsmodus** das Kontrollkästchen Konfigurieren.** Und die Einstellung für die **Protokollebene** würde angezeigt.

1.  Klicken Sie auf die Dropdownliste **Protokollebene** und wählen Sie eine Ebene für die Zuordnung der Ereignisquellen aus.

1. Wählen Sie unten **Hinzufügen** oder **Speichern**, um die Zuordnung der Ereignisquellen zu erstellen oder zu aktualisieren.

### Protokollierung konfigurieren (AWS CLI)
<a name="esm-logging-cli"></a>

#### Erstellen einer Ereignisquellenzuordnung mit Protokollierung
<a name="esm-logging-cli-create"></a>

Das folgende Beispiel erstellt eine Amazon MSK-Ereignisquellenzuordnung mit Protokollierungskonfiguration:

```
aws lambda create-event-source-mapping \
  --function-name my-kafka-function \
  --topics AWSKafkaTopic \
  --event-source-arn arn:aws:kafka:us-east-1:123456789012:cluster/my-cluster/abc123 \
  --starting-position LATEST \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=3 \
  --logging-config '{"SystemLogLevel":"DEBUG"}'
```

Verwenden Sie für selbstverwaltetes Kafka dieselbe Syntax:

```
aws lambda create-event-source-mapping \
  --function-name my-kafka-function \
  --topics AWSKafkaTopic \
  --self-managed-event-source '{"Endpoints":{"KAFKA_BOOTSTRAP_SERVERS":["abc.xyz.com:9092"]}}' \
  --starting-position LATEST \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=3 \
  --logging-config '{"SystemLogLevel":"DEBUG"}'
```

#### Die Logging-Konfiguration wird aktualisiert
<a name="esm-logging-cli-update"></a>

Verwenden Sie den `update-event-source-mapping` Befehl, um die Protokollierungskonfiguration hinzuzufügen oder zu ändern:

```
aws lambda update-event-source-mapping \
  --uuid 12345678-1234-1234-1234-123456789012 \
  --logging-config '{"SystemLogLevel":"WARN"}'
```

## Aufzeichnungsformat für ein Systemprotokoll zur Zuordnung von Kafka-Ereignisquellen
<a name="esm-logging-record-format"></a>

Wenn der Lambda-Ereignisabfrage das Protokoll sendet, enthält jeder Protokolleintrag allgemeine Metadaten zur Zuordnung von Ereignisquellen sowie ereignisspezifische Inhalte.

### WARN-Protokolldatensatz
<a name="esm-logging-warn-record"></a>

Der WARN-Datensatz enthält Fehler oder Warnungen vom Event-Poller und wird ausgegeben, als das Ereignis eingetreten ist. Beispiel:

```
{
    "eventType": "ESM_PROCESSING_EVENT",
    "timestamp": 1546347650000,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:12345678-1234-1234-1234-123456789012",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/tests-cluster/87654321-4321-4321-4321-876543221-s1",
    "eventProcessorId": "12345678-1234-1234-1234-123456789012/0",
    "logLevel": "WARN",
    "error": {
        "errorMessage": "Timeout expired while fetching topic metadata",
        "errorCode": "org.apache.kafka.common.errors.TimeoutException"
    }
}
```

### INFO-Protokolleintrag
<a name="esm-logging-info-record"></a>

Der INFO-Datensatz enthält Kafka-Consumer-Client-Konfigurationen in jedem Event-Poller und wird ausgegeben, wenn ein Consumer erstellt oder geändert wird. Beispiel:

```
{
    "eventType": "POLLER_STATUS_EVENT",
    "timestamp": 1546347660000,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:12345678-1234-1234-1234-123456789012",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/tests-cluster/87654321-4321-4321-4321-876543221-s1",
    "eventProcessorId": "12345678-1234-1234-1234-123456789012/0",
    "logLevel": "INFO",
    "kafkaEventSourceConnection": {
        "brokerEndpoints": "boot-abcd1234.c2.kafka-serverless.us-east-1.amazonaws.com:9098",
        "consumerId": "12345678-1234-1234-1234-123456789012-0",
        "topics": [
            "test"
        ],
        "consumerGroupId": "12345678-1234-1234-1234-123456789012",
        "securityProtocol": "SASL_SSL",
        "saslMechanism": "AWS_MSK_IAM",
        "totalPartitionCount": 2,
        "assignedPartitionCount": 2,
        "partitionsAssignmentGeneration": 5,
        "assignedPartitions": [
            "test-0",
            "test-1"
        ],
        "networkConfig": {
            "ipAddresses": [
                "10.100.141.1"
            ],
            "subnetCidrBlock": "10.100.128.0/20",
            "securityGroups": [
                "sg-abcdefabcdefabcdef"
            ]
        }
    }
}
```

### DEBUG-Protokolleintrag
<a name="esm-logging-debug-record"></a>

Das DEBUG-Protokoll enthält die Informationen zu den Kafka-Offsets bei der Verarbeitung der Ereignisquellenzuordnung, und die Offsetinformationen werden pro Minute ausgegeben. Beispiel:

```
{
    "eventType": "KAFKA_STATUS_EVENT",
    "timestamp": 1546347670000,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:12345678-1234-1234-1234-123456789012",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/tests-cluster/87654321-4321-4321-4321-876543221-s1",
    "eventProcessorId": "12345678-1234-1234-1234-123456789012/0",
    "logLevel": "DEBUG",
    "kafkaPartitionOffsets": {
        "partition": "test-1",
        "endOffset": 5004,
        "consumedOffset": 5003,
        "processedOffset": 5003,
        "committedOffset": 5004
    }
}
```

# Fehlerbehebung bei der Kafka-Zuordnung von Ereignisquellen
<a name="with-kafka-troubleshoot"></a>

Die folgenden Themen enthalten Hinweise zur Fehlerbehebung für Fehler und Probleme, die bei der Verwendung von Amazon MSK oder selbstverwaltetem Apache Kafka mit Lambda auftreten können.

Weitere Hilfe zur Fehlerbehebung finden Sie im [AWS -Wissenszentrum](https://repost.aws/knowledge-center#AWS_Lambda).

## Authentifizierungs- und Autorisierungsfehler
<a name="kafka-permissions-errors"></a>

Wenn eine der für die Nutzung von Daten aus dem Kafka-Cluster erforderlichen Berechtigungen fehlt, zeigt Lambda in der Ereignisquellenzuordnung unter eine der folgenden Fehlermeldungen an. **LastProcessingResult**

**Topics**
+ [

### Cluster konnte Lambda nicht autorisieren
](#kafka-authorize-errors)
+ [

### SASL-Authentifizierung fehlgeschlagen
](#kafka-sasl-errors)
+ [

### Server konnte Lambda nicht authentifizieren
](#kafka-mtls-errors-server)
+ [

### Lambda konnte Server nicht authentifizieren
](#kafka-mtls-errors-lambda)
+ [

### Bereitgestelltes Zertifikat oder bereitgestellter privater Schlüssel ist ungültig
](#kafka-key-errors)

### Cluster konnte Lambda nicht autorisieren
<a name="kafka-authorize-errors"></a>

Bei SASL/SCRAM oder mTLS weist dieser Fehler darauf hin, dass der angegebene Benutzer nicht über alle der folgenden erforderlichen Kafka-Zugriffssteuerungslisten (ACL) -Berechtigungen verfügt:
+ DescribeConfigs Cluster
+ Beschreiben von Gruppe
+ Gruppe lesen
+ Thema beschreiben
+ Thema lesen

Wenn Sie Kafka ACLs mit den erforderlichen `kafka-cluster` Berechtigungen erstellen, geben Sie das Thema und die Gruppe als Ressourcen an. Der Themenname muss mit dem Thema in der Ereignisquellenzuordnung übereinstimmen. Der Gruppenname muss mit der UUID der Ereignisquellenzuordnung übereinstimmen.

Nachdem Sie der Ausführungsrolle die erforderlichen Berechtigungen hinzugefügt haben, kann es einige Minuten dauern, bis die Änderungen wirksam werden.

Im Folgenden finden Sie ein Beispiel für ein ESM-Protokoll auf Systemebene, nachdem [Logging Config für dieses Problem](esm-logging.md) aktiviert wurde:

```
{
    "eventType": "ESM_PROCESSING_EVENT",
    "timestamp": 1734567890123,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-kafka-cluster/12345678-abcd-1234-efgh-EXAMPLE11111-1",
    "eventProcessorId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111/0",
    "logLevel": "WARN",
    "error": {
        "errorMessage": "Not authorized to access topics: [my-topic]",
        "errorCode": "org.apache.kafka.common.errors.TopicAuthorizationException"
    }
}
```

### SASL-Authentifizierung fehlgeschlagen
<a name="kafka-sasl-errors"></a>

Für SASL/SCRAM oder SASL/PLAIN weist dieser Fehler darauf hin, dass die angegebenen Anmeldeinformationen nicht gültig sind.

Zur IAM-Zugriffskontrolle fehlt der Ausführungsrolle die Berechtigung `kafka-cluster:Connect` für den Cluster. Fügen Sie der Rolle diese Berechtigung hinzu und geben Sie den Amazon-Ressourcenname (ARN) des Clusters als Ressource an.

Dieser Fehler wird Ihnen möglicherweise in zeitlichen Abständen angezeigt. Der Cluster lehnt Verbindungen ab, wenn die Anzahl der TCP-Verbindungen das Servicekontingent überschreitet. Lambda zieht sich zurück und versucht es erneut, bis eine Verbindung erfolgreich ist. Nachdem Lambda eine Verbindung zum Cluster hergestellt hat und nach Datensätzen abfragt, ändert sich das letzte Verarbeitungsergebnis zu `OK`.

Im Folgenden finden Sie ein Beispiel für ein ESM-Protokoll auf Systemebene nach der Aktivierung von [Logging Config](esm-logging.md) für dieses Problem bei Verwendung der IAM-Authentifizierung:

```
{
    "eventType": "ESM_PROCESSING_EVENT",
    "timestamp": 1734567890456,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-kafka-cluster/12345678-abcd-1234-efgh-EXAMPLE22222-1",
    "eventProcessorId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222/0",
    "logLevel": "WARN",
    "error": {
        "errorMessage": "[a1b2c3d4-5678-90ab-cdef-EXAMPLE22222]: Access denied",
        "errorCode": "org.apache.kafka.common.errors.SaslAuthenticationException"
    }
}
```

### Server konnte Lambda nicht authentifizieren
<a name="kafka-mtls-errors-server"></a>

Dieser Fehler weist darauf hin, dass der Kafka-Broker Lambda nicht authentifizieren konnte. Dieser Fehler kann aus folgenden Gründen auftreten:
+ Sie haben kein Client-Zertifikat für die mTLS-Authentifizierung bereitgestellt.
+ Sie haben ein Client-Zertifikat bereitgestellt, aber die Kafka-Broker sind nicht für die Verwendung der mTLS-Authentifizierung konfiguriert.
+ Die Kafka-Broker vertrauen einem Client-Zertifikat nicht.

### Lambda konnte Server nicht authentifizieren
<a name="kafka-mtls-errors-lambda"></a>

Dieser Fehler weist darauf hin, dass Lambda den Kafka-Broker nicht authentifizieren konnte. Dieser Fehler kann aus folgenden Gründen auftreten:
+ Für selbstverwaltetes Apache Kafka: Die Kafka-Broker verwenden selbstsignierte Zertifikate oder eine private Zertifizierungsstelle (CA), haben jedoch das Root-CA-Zertifikat des Servers nicht bereitgestellt.
+ Für selbstverwaltetes Apache Kafka: Das Root-CA-Zertifikat des Servers stimmt nicht mit der Root-CA überein, die das Zertifikat des Brokers signiert hat.
+ Die Überprüfung des Hostnamens ist fehlgeschlagen, weil das Zertifikat des Brokers nicht den DNS-Namen oder die IP-Adresse des Brokers als alternativen Betreffnamen enthält.

### Bereitgestelltes Zertifikat oder bereitgestellter privater Schlüssel ist ungültig
<a name="kafka-key-errors"></a>

Dieser Fehler weist darauf hin, dass der Kafka-Konsument das bereitgestellte Zertifikat oder den bereitgestellten privaten Schlüssel nicht verwenden konnte. Stellen Sie sicher, dass das Zertifikat und der Schlüssel das PEM-Format verwenden und dass für die Verschlüsselung des privaten Schlüssels ein Algorithmus verwendet wird. PBES1 

Im Folgenden finden Sie ein Beispiel für ein ESM-Protokoll auf Systemebene, nachdem [Logging Config für dieses Problem](esm-logging.md) aktiviert wurde:

```
{
    "eventType": "ESM_PROCESSING_EVENT",
    "timestamp": 1734567891234,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLE44444",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-kafka-cluster/12345678-abcd-1234-efgh-EXAMPLE44444-1",
    "eventProcessorId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE44444/0",
    "logLevel": "WARN",
    "error": {
        "errorMessage": "Invalid PEM keystore configs",
        "errorCode": "org.apache.kafka.common.errors.InvalidConfigurationException"
    }
}
```

## Netzwerk- und Verbindungsfehler
<a name="kafka-network-errors"></a>

Probleme mit der Netzwerkkonfiguration können verhindern, dass Lambda eine Verbindung zu Ihrem Kafka-Cluster herstellt. In den folgenden Themen werden häufig auftretende Netzwerkfehler beschrieben.

**Topics**
+ [

### Verbindungstimeout aufgrund der Konfiguration der Sicherheitsgruppe
](#kafka-security-group-errors)
+ [

### Kafka-Broker-Endpunkte können nicht aufgelöst werden
](#kafka-cluster-deleted-errors)

### Verbindungstimeout aufgrund der Konfiguration der Sicherheitsgruppe
<a name="kafka-security-group-errors"></a>

Wenn die mit Ihrem Kafka-Cluster verknüpfte Sicherheitsgruppe keinen eingehenden Datenverkehr von sich selbst zulässt, kann Lambda keine Verbindung zum Cluster herstellen. Stellen Sie sicher, dass die Regeln der Sicherheitsgruppe für eingehenden Datenverkehr von der Sicherheitsgruppe selbst auf den Kafka-Broker-Ports zulassen.

Im Folgenden finden Sie ein Beispiel für ein ESM-Protokoll auf Systemebene, nachdem [Logging Config für dieses Problem](esm-logging.md) aktiviert wurde:

```
{
    "eventType": "ESM_PROCESSING_EVENT",
    "timestamp": 1734567892345,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLE55555",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-kafka-cluster/12345678-abcd-1234-efgh-EXAMPLE55555-1",
    "eventProcessorId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE55555/0",
    "logLevel": "WARN",
    "error": {
        "errorMessage": "Timeout expired while fetching topic metadata",
        "errorCode": "org.apache.kafka.common.errors.TimeoutException"
    }
}
```

Sie können auch das Kafka-Consumer-INFO-Protokoll überprüfen, um die Verbindung und die Netzwerkkonfiguration zu überprüfen. Das `brokerEndpoints` Feld zeigt die Adressen des Kafka-Brokers `securityProtocol` und `saslMechanism` (falls zutreffend) die Authentifizierungsmethode an, und das `networkConfig` Feld zeigt die IP-Adressen, den Subnetz-CIDR-Block und die Sicherheitsgruppen, die für die Zuordnung der Ereignisquellen verwendet wurden. Stellen Sie sicher, dass die aufgelisteten Sicherheitsgruppen den erforderlichen eingehenden Datenverkehr zulassen:

```
{
    "eventType": "POLLER_STATUS_EVENT",
    "timestamp": 1734567892456,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-11111EXAMPLE",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-kafka-cluster/a1b2c3d4-5678-90ab-cdef-11111EXAMPLE-1",
    "eventProcessorId": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE/0",
    "logLevel": "INFO",
    "kafkaEventSourceConnection": {
        "brokerEndpoints": "boot-abcd1234.c2.kafka-serverless.us-east-1.amazonaws.com:9098",
        "consumerId": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE-0",
        "topics": [
            "my-topic"
        ],
        "consumerGroupId": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE",
        "securityProtocol": "SASL_SSL",
        "saslMechanism": "AWS_MSK_IAM",
        "totalPartitionCount": 2,
        "assignedPartitionCount": 2,
        "partitionsAssignmentGeneration": 1,
        "assignedPartitions": [
            "my-topic-0",
            "my-topic-1"
        ],
        "networkConfig": {
            "ipAddresses": [
                "10.0.0.37"
            ],
            "subnetCidrBlock": "10.0.0.32/28",
            "securityGroups": [
                "sg-0123456789abcdef0"
            ]
        }
    }
}
```

### Kafka-Broker-Endpunkte können nicht aufgelöst werden
<a name="kafka-cluster-deleted-errors"></a>

Dieser Fehler weist darauf hin, dass der Kafka-Cluster nicht existiert oder gelöscht wurde. Stellen Sie sicher, dass der in der Ereignisquellenzuordnung angegebene Cluster vorhanden ist und sich in einem aktiven Zustand befindet.

Im Folgenden finden Sie ein Beispiel für ein ESM-Protokoll auf Systemebene, nachdem [Logging Config für dieses Problem](esm-logging.md) aktiviert wurde:

```
{
    "eventType": "ESM_PROCESSING_EVENT",
    "timestamp": 1734567893456,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLE66666",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-kafka-cluster/12345678-abcd-1234-efgh-EXAMPLE66666-1",
    "eventProcessorId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE66666/0",
    "logLevel": "WARN",
    "error": {
        "errorMessage": "No resolvable bootstrap urls given in bootstrap.servers",
        "errorCode": "org.apache.kafka.common.config.ConfigException"
    }
}
```

## Fehler bei der Ereignisquellen-Zuweisung
<a name="services-event-errors"></a>

Wenn Sie Ihren Apache-Kafka-Cluster als [Ereignisquelle](invocation-eventsourcemapping.md) für Ihre Lambda-Funktion hinzufügen und Ihre Funktion auf einen Fehler stößt, beendet Ihr Kafka-Verbraucher die Verarbeitung von Datensätzen. Verbraucher einer Themenpartition sind diejenigen, die Ihre Datensätze abonnieren, lesen und verarbeiten. Ihre anderen Kafka-Verbraucher können weiterhin Datensätze verarbeiten, sofern sie nicht auf denselben Fehler stoßen.

Um die Ursache eines gestoppten Verbrauchers zu ermitteln, überprüfen Sie das `StateTransitionReason`-Feld in der Antwort von `EventSourceMapping`. In der folgenden Liste werden die Ereignisquellfehler beschrieben, die Sie erhalten können:

**`ESM_CONFIG_NOT_VALID`**  
Die Konfiguration der Ereignisquellenzuordnung ist ungültig.

**`EVENT_SOURCE_AUTHN_ERROR`**  
Lambda konnte die Ereignisquelle nicht authentifizieren.

**`EVENT_SOURCE_AUTHZ_ERROR`**  
Lambda verfügt nicht über die erforderlichen Berechtigungen für den Zugriff auf die Ereignisquelle.

**`FUNCTION_CONFIG_NOT_VALID`**  
Die Konfiguration der Funktion ist ungültig.

**Anmerkung**  
Wenn Ihre Lambda-Ereignisdatensätze die zulässige Größenbeschränkung von 6 MB überschreiten, können sie unbearbeitet bleiben.

# Aufrufen einer Lambda-Funktion über einen Amazon API Gateway-Endpunkt
<a name="services-apigateway"></a>

Sie können eine Web-API mit einem HTTP-Endpunkt für Ihre Lambda Funktion erstellen, indem Sie Amazon API Gateway verwenden. API Gateway bietet Tools zum Erstellen und Dokumentieren von Websites APIs , die HTTP-Anfragen an Lambda-Funktionen weiterleiten. Sie können den Zugriff auf Ihre API mit Authentifizierungs- und Autorisierungskontrollen sichern. Sie APIs können Traffic über das Internet bereitstellen oder nur innerhalb Ihrer VPC darauf zugreifen.

**Tipp**  
Lambda bietet zwei Möglichkeiten, Ihre Funktion über einen HTTP-Endpunkt aufzurufen: API Gateway und Lambda-Funktion. URLs Wenn Sie sich nicht sicher sind, welche Methode für Ihren Anwendungsfall am besten geeignet ist, siehe [Wählen Sie eine Methode, um Ihre Lambda-Funktion über eine HTTP-Anfrage aufzurufen](apig-http-invoke-decision.md).

Ressourcen in Ihrer API definieren mindestens eine Methode, z. B. GET oder POST. Methoden haben eine Integration, die Anfragen an eine Lambda-Funktion oder einen anderen Integrationstyp weiterleitet. Sie können jede Ressource und jede Methode einzeln definieren oder spezielle Ressourcen- und Methodenarten verwenden, um alle Anforderungen abzugleichen, die einem Muster entsprechen. Eine [Proxy-Ressource](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html) fängt alle Pfade unter einer Ressource ab. Die `ANY`-Methode fängt alle HTTP-Methoden ab.

**Topics**
+ [

## Auswählen eines API-Typs
](#services-apigateway-apitypes)
+ [

## Hinzufügen eines Endpunkts zur Lambda-Funktion
](#apigateway-add)
+ [

## Proxy-Integration
](#apigateway-proxy)
+ [

## Ereignisformat
](#apigateway-example-event)
+ [

## Reaktionsformat
](#apigateway-types-transforms)
+ [

## Berechtigungen
](#apigateway-permissions)
+ [

## Beispielanwendung
](#services-apigateway-samples)
+ [

## Der Event-Handler von Powertools für Lambda AWS
](#services-apigateway-powertools)
+ [

# Tutorial: Verwenden von Lambda mit API Gateway
](services-apigateway-tutorial.md)
+ [

# Behandlung von Lambda-Fehlern mit einer API-Gateway-API
](services-apigateway-errors.md)
+ [

# Wählen Sie eine Methode, um Ihre Lambda-Funktion über eine HTTP-Anfrage aufzurufen
](apig-http-invoke-decision.md)

## Auswählen eines API-Typs
<a name="services-apigateway-apitypes"></a>

API Gateway unterstützt drei Typen von APIs Lambda-Funktionen:
+ [HTTP-API](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html): Eine schlanke API mit niedriger RESTful Latenz.
+ [REST-API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html): Eine anpassbare, funktionsreiche RESTful API.
+ [WebSocket API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html): Eine Web-API, die persistente Verbindungen zu Clients für die Vollduplex-Kommunikation unterhält.

 APIs Sowohl HTTP als APIs RESTful APIs auch REST verarbeiten HTTP-Anfragen und geben Antworten zurück. HTTP APIs sind neuer und wurden mit der API Gateway Version 2 API erstellt. Die folgenden Funktionen sind neu für HTTP APIs:

**HTTP-API-Features**
+ **Automatische Bereitstellungen** – wenn Sie Routen oder Integrationen ändern, werden Änderungen automatisch in Phasen bereitgestellt, bei denen die automatische Bereitstellung aktiviert ist.
+ **Standardphase** – Sie können eine Standardphase (`$default`) erstellen, um Anforderungen am Stammpfad der URL Ihrer API zu bedienen. Bei benannten Phasen müssen Sie den Schrittnamen am Anfang des Pfades angeben.
+ **CORS-Konfiguration** – Sie können Ihre API so konfigurieren, dass ausgehenden Antworten CORS-Header hinzugefügt werden, anstatt sie manuell in Ihrem Funktionscode hinzufügen zu müssen.

REST APIs sind der Klassiker RESTful APIs , den API Gateway seit dem Start unterstützt. REST bietet APIs derzeit mehr Anpassungs-, Integrations- und Verwaltungsfunktionen.

**REST-API-Funktionen**
+ **Integrationstypen** — REST APIs unterstützt benutzerdefinierte Lambda-Integrationen. Mit einer benutzerdefinierten Integration können Sie nur den Text der Anforderung an die Funktion senden oder eine Transformationsvorlage auf den Anforderungstext anwenden, bevor Sie sie an die Funktion senden.
+ **Zugriffskontrolle** — REST APIs unterstützt mehr Optionen für Authentifizierung und Autorisierung.
+ **Überwachung und Ablaufverfolgung** — REST APIs unterstützt AWS X-Ray Tracing und zusätzliche Protokollierungsoptionen.

Einen ausführlichen Vergleich finden [Sie unter Wählen Sie zwischen HTTP APIs und REST APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-vs-rest.html) im *API Gateway Developer Guide*.

WebSocket APIs Verwenden Sie auch die API Gateway Version 2 API und unterstützen Sie einen ähnlichen Funktionsumfang. Verwenden Sie eine WebSocket API für Anwendungen, die von einer dauerhaften Verbindung zwischen dem Client und der API profitieren. WebSocket APIs bieten Vollduplex-Kommunikation, was bedeutet, dass sowohl der Client als auch die API kontinuierlich Nachrichten senden können, ohne auf eine Antwort warten zu müssen.

HTTP APIs unterstützt ein vereinfachtes Ereignisformat (Version 2.0). Ein Beispiel für ein Ereignis aus einer HTTP-API finden Sie unter [Erstellen von AWS Lambda Proxyintegrationen für HTTP APIs in API Gateway](https://docs.aws.amazon.com//apigateway/latest/developerguide/http-api-develop-integrations-lambda.html).

Weitere Informationen finden Sie unter [AWS Lambda Proxyintegrationen für HTTP APIs in API Gateway erstellen](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html).

## Hinzufügen eines Endpunkts zur Lambda-Funktion
<a name="apigateway-add"></a>

**So fügen Sie Ihrer Lambda-Funktion einen öffentlichen Endpunkt hinzu**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie eine Funktion aus.

1. Wählen Sie unter **Function overview (Funktionsübersicht)** die Option **Add trigger (Trigger hinzufügen)**.

1. Wählen Sie **API Gateway** aus.

1. Wählen Sie **Create an API** (API erstellen) oder **Use an existing API** (Vorhandene API verwenden).

   1. **Neue API:** Wählen Sie als **API type** (API-Typ) **HTTP API** aus. Weitere Informationen finden Sie unter [Auswählen eines API-Typs](#services-apigateway-apitypes).

   1. **Vorhandene API:** Wählen Sie die API aus der Dropdown-Liste aus oder geben Sie die API-ID ein (z. B. r3pmxmplak).

1. Wählen Sie unter **Security (Sicherheit)** die Option **Open (Öffnen)** aus.

1. Wählen Sie **Add** aus.

## Proxy-Integration
<a name="apigateway-proxy"></a>

API Gateway APIs besteht aus Stufen, Ressourcen, Methoden und Integrationen. Die Phase und die Ressource bestimmen den Pfad des Endpunkts:

**API-Pfadformat**
+ `/prod/` – Die `prod`-Phase und die Root-Ressource.
+ `/prod/user` – Die `prod`-Phase und die `user`-Ressource.
+ `/dev/{proxy+}` – Jede Route in der `dev`-Phase.
+ `/`— (HTTP APIs) Die Standard-Stage- und Root-Ressource.

Eine Lambda-Integration ordnet einer Lambda-Funktion eine Pfad- und HTTP-Methodenkombination zu. Sie können API Gateway so konfigurieren, dass der Hauptteil der HTTP-Anforderung unverändert (benutzerdefinierte Integration) übergeben oder der Anforderungstext in einem Dokument mit allen Anforderungsinformationen, einschließlich Header, Ressource, Pfad und Methode, gekapselt wird.

Weitere Informationen finden Sie unter [Lambda-Proxy-Integrationen in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html).

## Ereignisformat
<a name="apigateway-example-event"></a>

Amazon API Gateway ruft Ihre Funktion [synchron](invocation-sync.md) mit einem Ereignis auf, das eine JSON-Darstellung der HTTP-Anforderung enthält. Bei einer benutzerdefinierten Integration ist das Ereignis der Text der Anforderung. Bei einer Proxy-Integration hat das Ereignis eine definierte Struktur. Ein Beispiel für ein Proxy-Ereignis von einer API Gateway REST API finden Sie unter [Eingabeformat einer Lambda-Funktion für die Proxy-Integration](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format) im *API Gateway Developer Guide*.

## Reaktionsformat
<a name="apigateway-types-transforms"></a>

API Gateway wartet auf eine Antwort von Ihrer Funktion und leitet das Ergebnis an den Aufrufer weiter. Für eine benutzerdefinierte Integration definieren Sie eine Integrationsantwort und eine Methodenantwort, um die Ausgabe von der Funktion in eine HTTP-Antwort zu konvertieren. Für eine Proxy-Integration muss die Funktion mit einer Darstellung der Antwort in einem bestimmten Format antworten.

Das folgende Beispiel zeigt ein Antwortobjekt aus einer Node.js-Funktion. Das Antwortobjekt stellt eine erfolgreiche HTTP-Antwort dar, die ein JSON-Dokument enthält.

**Example index.mjs – Antwortobjekt der Proxy-Integration (Node.js)**  

```
var response = {
      "statusCode": 200,
      "headers": {
        "Content-Type": "application/json"
      },
      "isBase64Encoded": false,
      "multiValueHeaders": { 
        "X-Custom-Header": ["My value", "My other value"],
      },
      "body": "{\n  \"TotalCodeSize\": 104330022,\n  \"FunctionCount\": 26\n}"
    }
```

Die Lambda-Laufzeit serialisiert das Antwortobjekt in JSON und sendet es an die API. Die API analysiert die Antwort und verwendet sie zur Erstellung einer HTTP-Antwort verwendet, die sie dann an den Client sendet, der die ursprüngliche Anforderung gestellt hat.

**Example HTTP-Antwort**  

```
< HTTP/1.1 200 OK
  < Content-Type: application/json
  < Content-Length: 55
  < Connection: keep-alive
  < x-amzn-RequestId: 32998fea-xmpl-4268-8c72-16138d629356
  < X-Custom-Header: My value
  < X-Custom-Header: My other value
  < X-Amzn-Trace-Id: Root=1-5e6aa925-ccecxmplbae116148e52f036
  <
  {
    "TotalCodeSize": 104330022,
    "FunctionCount": 26
  }
```

## Berechtigungen
<a name="apigateway-permissions"></a>

Amazon API Gateway erhält die Berechtigung zum Aufrufen Ihrer Funktion über die [ressourcenbasierte Richtlinie](access-control-resource-based.md) der Funktion. Sie können eine Aufrufberechtigung für eine gesamte API erteilen oder einen eingeschränkten Zugriff auf eine Phase, eine Ressource oder eine Methode gewähren.

Wenn Sie Ihrer Funktion mithilfe der Lambda-Konsole, mithilfe der API-Gateway-Konsole oder in einer AWS SAM -Vorlage eine API hinzufügen, wird die ressourcenbasierte Richtlinie der Funktion automatisch aktualisiert. Es folgt eine Beispiel-Funktionsrichtlinie.

**Example Funktionsrichtlinie**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "default",
  "Statement": [
    {
      "Sid": "nodejs-apig-functiongetEndpointPermissionProd-BWDBXMPLXE2F",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:111122223333:function:nodejs-apig-function-1G3MXMPLXVXYI",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "111122223333"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:execute-api:us-east-2:111122223333:ktyvxmpls1/*/GET/"
        }
      }
    }
  ]
}
```

Sie können Funktionsrichtlinienberechtigungen manuell mit den folgenden API-Operationen verwalten:
+ [AddPermission](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html)
+ [RemovePermission](https://docs.aws.amazon.com/lambda/latest/api/API_RemovePermission.html)
+ [GetPolicy](https://docs.aws.amazon.com/lambda/latest/api/API_GetPolicy.html)

Mit dem `add-permission`-Befehl können Sie einer vorhandenen API Aufrufberechtigung erteilen. Beispiel:

```
aws lambda add-permission \
  --function-name my-function \
  --statement-id apigateway-get --action lambda:InvokeFunction \
  --principal apigateway.amazonaws.com \
  --source-arn "arn:aws:execute-api:us-east-2:123456789012:mnh1xmpli7/default/GET/"
```

Die Ausgabe sollte folgendermaßen aussehen:

```
{
    "Statement": "{\"Sid\":\"apigateway-test-2\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-2:123456789012:function:my-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:us-east-2:123456789012:mnh1xmpli7/default/GET\"}}}"
}
```

**Anmerkung**  
Wenn sich Ihre Funktion und API unterscheiden AWS-Regionen, muss die Regionskennung im Quell-ARN mit der Region der Funktion übereinstimmen, nicht mit der Region der API. Bei Aufruf einer API-Gateway-Funktion verwendet diese einen Ressourcen-ARN, der auf dem ARN der API basiert, aber so geändert wird, dass er dem Bereich der Funktion entspricht.

Der Quell-ARN in diesem Beispiel erteilt eine Berechtigung für eine Integration in die GET-Methode der Root-Ressource in der Standardphase einer API mit ID `mnh1xmpli7`. Sie können ein Sternchen im Quell-ARN verwenden, um Berechtigungen für mehrere Phasen, Methoden oder Ressourcen zu erteilen.

**Ressourcenmuster**
+ `mnh1xmpli7/*/GET/*` – GET-Methode bei allen Ressourcen in allen Phasen.
+ `mnh1xmpli7/prod/ANY/user` – JEDE Methode bei der `user`-Ressource in der `prod`-Phase.
+ `mnh1xmpli7/*/*/*` – Jede Methode bei allen Ressourcen in allen Phasen.

Weitere Informationen zum Anzeigen der Richtlinie und zum Entfernen von Anweisungen finden Sie unter [Anzeigen von ressourcenbasierten IAM-Richtlinien in Lambda](access-control-resource-based.md).

## Beispielanwendung
<a name="services-apigateway-samples"></a>

Die Beispiel-App [API Gateway with Node.js](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/nodejs-apig) enthält eine Funktion mit einer AWS SAM Vorlage, die eine REST-API erstellt, für die die AWS X-Ray Ablaufverfolgung aktiviert ist. Es enthält auch Skripte zum Bereitstellen und Aufrufen der Funktion sowie zum Testen der API und zum Bereinigen.

## Der Event-Handler von Powertools für Lambda AWS
<a name="services-apigateway-powertools"></a>

Der Event-Handler aus dem Powertools for AWS Lambda-Toolkit bietet Routing, Middleware, CORS-Konfiguration, Generierung von OpenAPI-Spezifikationen, Anforderungsvalidierung, Fehlerbehandlung und andere nützliche Funktionen beim Schreiben von Lambda-Funktionen, die von einem API-Gateway-Endpunkt (HTTP oder REST) aufgerufen werden. Das Event-Handler-Hilfsprogramm ist für Python TypeScript und/ verfügbarJavaScript. Weitere Informationen finden Sie unter [Event Handler REST API](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/) in der *Powertools for AWS Lambda (Python) -Dokumentation* und [Event Handler HTTP API](https://docs.aws.amazon.com/powertools/typescript/latest/features/event-handler/http/) in der *Powertools for AWS Lambda* () -Dokumentation. TypeScript

### Python
<a name="services-apigateway-powertools-python"></a>

```
from aws_lambda_powertools import Logger
from aws_lambda_powertools.event_handler import APIGatewayRestResolver
from aws_lambda_powertools.logging import correlation_paths
from aws_lambda_powertools.utilities.typing.lambda_context import LambdaContext

app = APIGatewayRestResolver()
logger = Logger()

@app.get("/healthz")
def ping():
    return {"message": "health status ok"}

@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST)  
def lambda_handler(event: dict, context: LambdaContext) -> dict:
    return app.resolve(event, context)
```

### TypeScript
<a name="services-apigateway-powertools-typescript"></a>

```
import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest';
import { Logger } from '@aws-lambda-powertools/logger';
import {
  correlationPaths,
  search,
} from '@aws-lambda-powertools/logger/correlationId';
import type { Context } from 'aws-lambda/handler';

const logger = new Logger({
  correlationIdSearchFn: search,
});

const app = new Router({ logger });

app.get("/healthz", async () => {
  return { message: "health status ok" };
});

export const handler = async (event: unknown, context: Context) => {
  // You can continue using other utilities just as before
  logger.addContext(context);
  logger.setCorrelationId(event, correlationPaths.API_GATEWAY_REST);
  return app.resolve(event, context);
};
```

# Tutorial: Verwenden von Lambda mit API Gateway
<a name="services-apigateway-tutorial"></a>

In diesem Tutorial erstellen Sie eine REST-API, über die Sie eine Lambda-Funktion mithilfe einer HTTP-Anfrage aufrufen. Ihre Lambda-Funktion führt CRUD-Operationen (Erstellen, Lesen, Aktualisieren und Löschen) für eine DynamoDB-Tabelle durch. Diese Funktion wird hier zu Demonstrationszwecken bereitgestellt, aber Sie werden lernen, eine API-Gateway-REST-API zu konfigurieren, die jede Lambda-Funktion aufrufen kann.

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/APIG_tut_resources.png)


Die Verwendung von API-Gateway bietet Benutzern einen sicheren HTTP-Endpunkt zum Aufrufen Ihrer Lambda-Funktion und kann dabei helfen, große Mengen an Aufrufen an Ihre Funktion zu verwalten, indem der Datenverkehr gedrosselt und API-Aufrufe automatisch validiert und autorisiert werden. API Gateway bietet auch flexible Sicherheitskontrollen mithilfe von AWS Identity and Access Management (IAM) und Amazon Cognito. Dies ist nützlich für Anwendungsfälle, in denen eine vorherige Autorisierung für Aufrufe zu Ihrer Anwendung erforderlich ist.

**Tipp**  
Lambda bietet zwei Möglichkeiten, Ihre Funktion über einen HTTP-Endpunkt aufzurufen: API Gateway und Lambda-Funktion. URLs Wenn Sie sich nicht sicher sind, welche Methode für Ihren Anwendungsfall am besten geeignet ist, siehe [Wählen Sie eine Methode, um Ihre Lambda-Funktion über eine HTTP-Anfrage aufzurufen](apig-http-invoke-decision.md).

Um dieses Tutorial abzuschließen, werden Sie die folgenden Phasen durchlaufen:

1. Erstellen und Konfigurieren einer Lambda-Funktion in Python oder Node.js, um Operationen in einer DynamoDB-Tabelle auszuführen.

1. Erstellen einer REST-API in API Gateway, um eine Verbindung zu Ihrer Lambda-Funktion herzustellen.

1. Erstellen einer DynamoDB-Tabelle und Testen dieser Tabelle mit Ihrer Lambda-Funktion in der Konsole.

1. Bereitstellen Ihrer API und Testen der vollständigen Einrichtung mithilfe von curl in einem Terminal.

Durch Abschluss dieser Phasen lernen Sie, wie Sie mit API Gateway einen HTTP-Endpunkt erstellen, der eine Lambda-Funktion in jeder Größenordnung sicher aufrufen kann. Sie erfahren auch, wie Sie Ihre API bereitstellen und wie Sie sie in der Konsole und durch Senden einer HTTP-Anfrage über ein Terminal testen.

## Erstellen einer Berechtigungsrichtlinie
<a name="services-apigateway-tutorial-policy"></a>

Bevor Sie eine [Ausführungsrolle](lambda-intro-execution-role.md) für Ihre Lambda-Funktion erstellen können, müssen Sie zunächst eine Berechtigungsrichtlinie erstellen, um Ihrer Funktion die Erlaubnis zu erteilen, auf die erforderlichen AWS Ressourcen zuzugreifen. In diesem Tutorial ermöglicht die Richtlinie Lambda, CRUD-Operationen in einer DynamoDB-Tabelle durchzuführen und in Amazon Logs zu schreiben. CloudWatch 

**So erstellen Sie die Richtlinie**

1. Öffnen Sie die Seite [Richtlinien](https://console.aws.amazon.com/iam/home#/policies) in der IAM-Konsole.

1. Wählen Sie **Richtlinie erstellen** aus.

1. Wählen Sie die Registerkarte **JSON** aus und kopieren Sie dann die folgende benutzerdefinierte JSON-Richtlinie in den JSON-Editor.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "Stmt1428341300017",
         "Action": [
           "dynamodb:DeleteItem",
           "dynamodb:GetItem",
           "dynamodb:PutItem",
           "dynamodb:Query",
           "dynamodb:Scan",
           "dynamodb:UpdateItem"
         ],
         "Effect": "Allow",
         "Resource": "*"
       },
       {
         "Sid": "",
         "Resource": "*",
         "Action": [
           "logs:CreateLogGroup",
           "logs:CreateLogStream",
           "logs:PutLogEvents"
         ],
         "Effect": "Allow"
       }
     ]
   }
   ```

------

1. Wählen Sie **Next: Tags** (Weiter: Tags) aus.

1. Klicken Sie auf **Weiter: Prüfen**.

1. Geben Sie unter **Review policy (Richtlinie prüfen) ** für den Richtlinien-**Namen** **lambda-apigateway-policy** ein.

1. Wählen Sie **Richtlinie erstellen** aus.

## Erstellen einer Ausführungsrolle
<a name="services-apigateway-tutorial-role"></a>

Eine [Ausführungsrolle](lambda-intro-execution-role.md) ist eine AWS Identity and Access Management (IAM-) Rolle, die einer Lambda-Funktion Zugriffsberechtigungen AWS-Services und Ressourcen gewährt. Damit Ihre Funktion Vorgänge an einer DynamoDB-Tabelle ausführen kann, fügen Sie die Berechtigungsrichtlinie an, die Sie im vorherigen Schritt erstellt haben.

**So erstellen Sie eine Ausführungsrolle und fügen Ihre benutzerdefinierte Berechtigungsrichtlinie hinzu**

1. Öffnen Sie die Seite [Roles (Rollen)](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie **Rolle erstellen** aus.

1. Wählen Sie als Typ der vertrauenswürdigen Entität **AWS -Service** und dann als Anwendungsfall **Lambda** aus.

1. Wählen Sie **Weiter** aus.

1. Geben Sie im Feld für die Richtliniensuche **lambda-apigateway-policy** ein.

1. Wählen Sie in den Suchergebnissen die von Ihnen erstellte Richtlinie (`lambda-apigateway-policy`) und dann die Option **Next** (Weiter) aus.

1. Geben Sie unter **Role details** (Rollendetails) für den **Role name** (Rollennamen) **lambda-apigateway-role** ein und wählen Sie dann **Create role** (Rolle erstellen) aus.

## So erstellen Sie die Lambda-Funktion:
<a name="services-apigateway-tutorial-function"></a>

1. Öffnen Sie die [Funktionsseite](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole und wählen Sie **Funktion erstellen** aus.

1. Wählen Sie **Von Grund auf neu schreiben** aus.

1. Geben Sie für **Function name** (Funktionsname) `LambdaFunctionOverHttps` ein.

1. Wählen Sie für **Laufzeit** die neueste Node.js- oder Python-Laufzeit aus.

1. Erweitern Sie unter **Berechtigungen** die Option **Standardausführungsrolle ändern**.

1. Wählen Sie **Vorhandene Rolle verwenden** und anschließend die zuvor erstellte Rolle „**lambda-apigateway-role**“ aus.

1. Wählen Sie **Funktion erstellen**.

1. Ersetzen Sie im Bereich **Codequelle** den Standardcode durch den folgenden Node.js- oder Python-Code.

------
#### [ Node.js ]

   Die `region` Einstellung muss mit dem AWS-Region Ort übereinstimmen, an dem Sie die Funktion bereitstellen und [die DynamoDB-Tabelle erstellen](#services-apigateway-tutorial-table).

**Example index.mjs**  

   ```
   import { DynamoDBDocumentClient, PutCommand, GetCommand, 
            UpdateCommand, DeleteCommand} from "@aws-sdk/lib-dynamodb";
   import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
   
   const ddbClient = new DynamoDBClient({ region: "us-east-2" });
   const ddbDocClient = DynamoDBDocumentClient.from(ddbClient);
   
   // Define the name of the DDB table to perform the CRUD operations on
   const tablename = "lambda-apigateway";
   
   /**
    * Provide an event that contains the following keys:
    *
    *   - operation: one of 'create,' 'read,' 'update,' 'delete,' or 'echo'
    *   - payload: a JSON object containing the parameters for the table item
    *     to perform the operation on
    */
   export const handler = async (event, context) => {
      
        const operation = event.operation;
      
        if (operation == 'echo'){
             return(event.payload);
        }
        
       else { 
           event.payload.TableName = tablename;
           let response;
           
           switch (operation) {
             case 'create':
                  response = await ddbDocClient.send(new PutCommand(event.payload));
                  break;
             case 'read':
                  response = await ddbDocClient.send(new GetCommand(event.payload));
                  break;
             case 'update':
                  response = ddbDocClient.send(new UpdateCommand(event.payload));
                  break;
             case 'delete':
                  response = ddbDocClient.send(new DeleteCommand(event.payload));
                  break;
             default:
               response = 'Unknown operation: ${operation}';
             }
           console.log(response);
           return response;
       }
   };
   ```

------
#### [ Python ]

**Example lambda\$1function.py**  

   ```
   import boto3
   
   # Define the DynamoDB table that Lambda will connect to
   table_name = "lambda-apigateway"
   
   # Create the DynamoDB resource
   dynamo = boto3.resource('dynamodb').Table(table_name)
   
   # Define some functions to perform the CRUD operations
   def create(payload):
       return dynamo.put_item(Item=payload['Item'])
   
   def read(payload):
       return dynamo.get_item(Key=payload['Key'])
   
   def update(payload):
       return dynamo.update_item(**{k: payload[k] for k in ['Key', 'UpdateExpression', 
       'ExpressionAttributeNames', 'ExpressionAttributeValues'] if k in payload})
   
   def delete(payload):
       return dynamo.delete_item(Key=payload['Key'])
   
   def echo(payload):
       return payload
   
   operations = {
       'create': create,
       'read': read,
       'update': update,
       'delete': delete,
       'echo': echo,
   }
   
   def lambda_handler(event, context):
       '''Provide an event that contains the following keys:
         - operation: one of the operations in the operations dict below
         - payload: a JSON object containing parameters to pass to the 
           operation being performed
       '''
       
       operation = event['operation']
       payload = event['payload']
       
       if operation in operations:
           return operations[operation](payload)
           
       else:
           raise ValueError(f'Unrecognized operation "{operation}"')
   ```

------
**Anmerkung**  
In diesem Beispiel ist der Name der DynamoDB-Tabelle als Variable in Ihrem Funktionscode definiert. In einer realen Anwendung besteht die bewährte Methode darin, diesen Parameter als Umgebungsvariable zu übergeben und den Tabellennamen nicht fest zu codieren. Weitere Informationen finden Sie unter [AWS Lambda Umgebungsvariablen verwenden.](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html)

1. Wählen Sie im Abschnitt **BEREITSTELLEN** die Option **Bereitstellen** aus, um den Code Ihrer Funktion zu aktualisieren:  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

## Testen der Funktion
<a name="services-apigateway-tutorial-test-function"></a>

Bestätigen Sie vor der Integration Ihrer Funktion mit API-Gateway, dass Sie die Funktion erfolgreich bereitgestellt haben. Senden Sie mithilfe der Lambda-Konsole ein Testereignis an Ihre Funktion.

1. Wählen Sie auf der Lambda-Konsolenseite für Ihre Funktion die Registerkarte **Test** aus.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/test-tab.png)

1. Scrollen Sie nach unten zum Abschnitt **Ereignis-JSON** und ersetzen Sie das Standardereignis durch Folgendes. Dieses Ereignis entspricht der von der Lambda-Funktion erwarteten Struktur.

   ```
   {
       "operation": "echo",
       "payload": {
           "somekey1": "somevalue1",
           "somekey2": "somevalue2"
       }
   }
   ```

1. Wählen Sie **Test** aus.

1. Erweitern Sie unter **Funktionsausführung: erfolgreich** die Option **Details**. Sie sollten die folgende Antwort sehen:

   ```
   {
     "somekey1": "somevalue1",
     "somekey2": "somevalue2"
   }
   ```

## Erstellen Sie eine REST-API mit API Gateway
<a name="services-apigateway-tutorial-api"></a>

In diesem Schritt erstellen Sie die API-Gateway-REST-API, die Sie zum Aufrufen Ihrer Lambda-Funktion verwenden.

**So erstellen Sie die API**

1. Öffnen Sie die [API Gateway-Konsole](https://console.aws.amazon.com/apigateway).

1. Wählen Sie **Create API (API erstellen)** aus.

1. Wählen Sie im Feld **REST-API** die Option **Entwickeln** aus.

1. Lassen Sie unter **API details** (API-Details) die Option **New API** (Neue API) ausgewählt und geben Sie für **API Name** (API-Name) **DynamoDBOperations** ein.

1. Wählen Sie **Create API** (API erstellen) aus.

## Erstellen einer Ressource für Ihre REST-API
<a name="services-apigateway-tutorial-resource"></a>

Um Ihrer API eine HTTP-Methode hinzuzufügen, müssen Sie zunächst eine Ressource erstellen, mit der diese Methode ausgeführt werden kann. Hier erstellen Sie die Ressource zur Verwaltung Ihrer DynamoDB-Tabelle.

**So erstellen Sie die Ressource**

1. Wählen Sie in der [API-Gateway-Konsole](https://console.aws.amazon.com/apigateway) auf der Seite **Ressourcen** für Ihre API die Option **Ressource erstellen** aus.

1. Geben Sie im Feld **Resource details** (Ressourcendetails) für **Resource name** (Ressourcenname) **DynamoDBManager** ein.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

## Erstellen einer HTTP-POST-Methode
<a name="services-apigateway-tutorial-method"></a>

In diesem Schritt erstellen Sie eine Methode (`POST`) für Ihre `DynamoDBManager`-Ressource. Sie verknüpfen diese `POST`-Methode mit Ihrer Lambda-Funktion, sodass API-Gateway Ihre Lambda-Funktion aufruft, wenn die Methode eine HTTP-Anfrage empfängt.

**Anmerkung**  
 Für die Zwecke dieses Tutorials wird eine HTTP-Methode (`POST`) verwendet, um eine einzelne Lambda-Funktion aufzurufen, die alle Operationen in Ihrer DynamoDB-Tabelle ausführt. In einer realen Anwendung besteht die bewährte Methode darin, für jede Operation eine andere Lambda-Funktion und HTTP-Methode zu verwenden. Weitere Informationen finden Sie bei Serverless Land unter [The Lambda monolith](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/monolith). 

**So erstellen Sie die POST-Methode**

1. Vergewissern Sie sich, dass die `/DynamoDBManager`-Ressource auf der Seite **Resources** (Ressourcen) für Ihre API markiert ist. Wählen Sie dann im Bereich **Methods** (Methoden) die Option **Create Method** (Methode erstellen) aus.

1. Wählen Sie in **Method type** (Methodentyp) **POST**.

1. Lassen Sie für den **Integration type** (Integrationstyp) die Option **Lambda function** (Lambda-Funktion) ausgewählt.

1. Wählen Sie für die **Lambda function** (Lambda-Funktion) den Amazon Ressourcennamen (ARN) für Ihre Funktion (`LambdaFunctionOverHttps`).

1. Wählen Sie **Methode erstellen** aus.

## Erstellen einer DynamoDB-Tabelle
<a name="services-apigateway-tutorial-table"></a>

Erstellen Sie eine leere DynamoDB-Tabelle, an der Ihre Lambda-Funktion CRUD-Operationen ausführt.

**Erstellen einer DynamoDB-Tabelle**

1. Öffnen Sie die Seite [Tables (Tabellen)](https://console.aws.amazon.com/dynamodbv2#tables) in der DynamoDB-Konsole.

1. Wählen Sie **Create table** (Tabelle erstellen) aus.

1. Führen Sie unter **Tabellendetails** die folgenden Schritte aus:

   1. Geben Sie unter **Tabellenname** **lambda-apigateway** ein.

   1. Geben Sie für **Partitionsschlüssel** **id** ein und behalten Sie den Datentyp als **Zeichenfolge** bei.

1. Behalten Sie unter **Table settings** (Tabelleneinstellungen) die **Default settings** (Standardeinstellungen) bei.

1. Wählen Sie **Create table** (Tabelle erstellen) aus.

## Testen der Integration von API-Gateway, Lambda und DynamoDB
<a name="services-apigateway-tutorial-test-setup"></a>

Sie können nun die Integration Ihrer APIä-Gateway-API-Methode mit Ihrer Lambda-Funktion und Ihrer DynamoDB-Tabelle testen. Mit der API Gateway-Konsole senden Sie Anfragen mithilfe der Testfunktion der Konsole direkt an Ihre `POST`-Methode. In diesem Schritt verwenden Sie zuerst eine `create`-Operation, um Ihrer DynamoDB-Tabelle ein neues Element hinzuzufügen, und verwenden dann eine `update`-Operation, um das Element zu ändern.

**Test 1: So erstellen Sie ein neues Element in Ihrer DynamoDB-Tabelle**

1. Wählen Sie in der [API-Gateway-Konsole](https://console.aws.amazon.com/apigateway) Ihre API aus (`DynamoDBOperations`).

1. Wählen Sie unter der Ressource `DynamoDBManager` die Methode **POST**.

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Lassen Sie unter **Test method** (Testmethode) die Felder **Query strings** (Query-Strings) und **Headers** (Header) leer. Fügen Sie für **Request body** (Anforderungstext) den folgenden JSON-Code ein:

   ```
   {
     "operation": "create",
     "payload": {
       "Item": {
         "id": "1234ABCD",
         "number": 5
       }
     }
   }
   ```

1. Wählen Sie **Test** aus.

   Die Ergebnisse, die nach Abschluss des Tests angezeigt werden, sollten den Status `200` anzeigen. Dieser Statuscode zeigt an, dass die `create`-Operation erfolgreich war.

    Überprüfen Sie zur Bestätigung, ob Ihre DynamoDB-Tabelle jetzt das neue Element enthält.

1. Öffnen Sie die [Seite Tabellen](https://console.aws.amazon.com/dynamodbv2#tables) der DynamoDB-Konsole und wählen Sie die `lambda-apigateway`-Tabelle aus.

1. Wählen Sie **Explore table items** (Tabellenelemente erkunden) aus. Im Bereich **Items returned** (Zurückgegebene Elemente) sollten ein Element mit der **id** (ID) `1234ABCD` und der **number** (Nummer) `5` angezeigt werden. Beispiel:  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/items-returned.png)

**Test 2: So aktualisieren Sie das Element in Ihrer DynamoDB-Tabelle**

1. Kehren Sie in der [API-Gateway-Konsole](https://console.aws.amazon.com/apigateway) zum Bereich **Test** Ihrer POST-Methode zurück.

1. Lassen Sie unter **Test method** (Testmethode) die Felder **Query strings** (Query-Strings) und **Headers** (Header) leer. Fügen Sie für **Request body** (Anforderungstext) den folgenden JSON-Code ein:

   ```
   {
       "operation": "update",
       "payload": {
           "Key": {
               "id": "1234ABCD"
           },
           "UpdateExpression": "SET #num = :newNum",
           "ExpressionAttributeNames": {
               "#num": "number"
           },
           "ExpressionAttributeValues": {
               ":newNum": 10
           }
       }
   }
   ```

1. Wählen Sie **Test** aus.

   Die Ergebnisse, die nach Abschluss des Tests angezeigt werden, sollten den Status `200` anzeigen. Dieser Statuscode zeigt an, dass die `update`-Operation erfolgreich war.

    Überprüfen Sie zur Bestätigung, ob das Element in Ihrer DynamoDB-Tabelle geändert wurde.

1. Öffnen Sie die [Seite Tabellen](https://console.aws.amazon.com/dynamodbv2#tables) der DynamoDB-Konsole und wählen Sie die `lambda-apigateway`-Tabelle aus.

1. Wählen Sie **Explore table items** (Tabellenelemente erkunden) aus. Im Bereich **Items returned** (Zurückgegebene Elemente) sollten ein Element mit der **id** (ID) `1234ABCD` und der **number** (Nummer) `10` angezeigt werden.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/items-returned-2.png)

## Bereitstellen der API
<a name="services-apigateway-tutorial-deploy-api"></a>

Damit ein Client die API aufrufen kann, müssen Sie eine Bereitstellung und eine zugehörige Stufe erstellen. Eine Phase stellt eine Momentaufnahme Ihrer API dar, einschließlich ihrer Methoden und Integrationen.

**So stellen Sie die API bereit**

1. Öffnen Sie die **APIs**Seite der [API Gateway Gateway-Konsole](https://console.aws.amazon.com/apigateway) und wählen Sie die `DynamoDBOperations` API aus.

1. Wählen Sie auf der Seite **Resources** (Ressourcen) für Ihre API die Option **Deploy API** (API bereitstellen) aus.

1. Wählen Sie für **Stage** (Stufe) **\$1New stage\$1** (\$1Neue Stufe\$1) und geben Sie dann als **Stage name** (Phasenname) **test** ein.

1. Wählen Sie **Bereitstellen**.

1. Kopieren Sie im Bereich **Stage details** (Stufendetails) die **Invoke URL** (Aufruf-URL). Sie werden diese im nächsten Schritt verwenden, um Ihre Funktion mithilfe einer HTTP-Anfrage aufzurufen.

## Verwenden von curl zum Aufrufen Ihrer Funktion mithilfe von HTTP-Anfragen
<a name="services-apigateway-tutorial-invoke-function"></a>

Sie können Ihre Lambda-Funktion jetzt aufrufen, indem Sie eine HTTP-Anfrage an Ihre API senden. In diesem Schritt erstellen Sie ein neues Element in Ihrer DynamoDB-Tabelle und führen dann Lese-, Aktualisierungs- und Löschvorgänge für dieses Element durch.

**So erstellen Sie mit curl ein Element in Ihrer DynamoDB-Tabelle**

1. Öffnen Sie ein Terminal oder eine Eingabeaufforderung auf Ihrem lokalen Computer und führen Sie den folgenden `curl`-Befehl mit der im vorherigen Schritt kopierten Aufruf-URL aus. Dieser Befehl verwendet die folgenden Optionen:
   + `-H`: Fügt der Anforderung einen benutzerdefinierten Header hinzu. Hier wird der Inhaltstyp als JSON angegeben.
   + `-d`: Sendet Daten im Anforderungstext. Diese Option verwendet standardmäßig eine HTTP-POST-Methode.

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "create", "payload": {"Item": {"id": "5678EFGH", "number": 15}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"create\", \"payload\": {\"Item\": {\"id\": \"5678EFGH\", \"number\": 15}}}'
   ```

------

   Wenn der Vorgang erfolgreich war, sollten Sie eine Antwort mit einem HTTP-Statuscode von 200 erhalten.

1. Sie können auch die DynamoDB-Konsole verwenden, um zu überprüfen, ob sich das neue Element in Ihrer Tabelle befindet, indem Sie Folgendes tun:

   1. Öffnen Sie die [Seite Tabellen](https://console.aws.amazon.com/dynamodbv2#tables) in der DynamoDB-Konsole und wählen Sie die `lambda-apigateway`-Tabelle aus.

   1. Wählen Sie **Explore Table Items** (Tabellenelemente erkudnen) aus. Im Bereich **Items returned** (Zurückgegebene Elemente) sollte ein Element mit der **id** (ID) `5678EFGH` und der **number** (Nummer) `15` angezeigt werden.

**So lesen Sie das Element in Ihrer DynamoDB-Tabelle mit curl**
+ Führen Sie in Ihrem Terminal oder Ihrer Eingabeaufforderung den folgenden `curl`-Befehl aus, um den Wert des soeben erstellten Elements zu lesen. Verwenden Sie Ihre eigene Aufruf-URL.

------
#### [ Linux/macOS ]

  ```
  curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
  -H "Content-Type: application/json" \
  -d '{"operation": "read", "payload": {"Key": {"id": "5678EFGH"}}}'
  ```

------
#### [ PowerShell ]

  ```
  curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"read\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}}}'
  ```

------

  Je nachdem, ob Sie den Node.js-Funktionscode oder den Python-Funktionscode gewählt haben, sollten Sie eine der folgenden Ausgaben sehen:

------
#### [ Node.js ]

  ```
  {"$metadata":{"httpStatusCode":200,"requestId":"7BP3G5Q0C0O1E50FBQI9NS099JVV4KQNSO5AEMVJF66Q9ASUAAJG",
  "attempts":1,"totalRetryDelay":0},"Item":{"id":"5678EFGH","number":15}}
  ```

------
#### [ Python ]

  ```
  {"Item":{"id":"5678EFGH","number":15},"ResponseMetadata":{"RequestId":"QNDJICE52E86B82VETR6RKBE5BVV4KQNSO5AEMVJF66Q9ASUAAJG",
  "HTTPStatusCode":200,"HTTPHeaders":{"server":"Server","date":"Wed, 31 Jul 2024 00:37:01 GMT","content-type":"application/x-amz-json-1.0",
  "content-length":"52","connection":"keep-alive","x-amzn-requestid":"QNDJICE52E86B82VETR6RKBE5BVV4KQNSO5AEMVJF66Q9ASUAAJG","x-amz-crc32":"2589610852"},
  "RetryAttempts":0}}
  ```

------

**So aktualisieren Sie das Element in Ihrer DynamoDB-Tabelle mit curl**

1. Führen Sie in Ihrem Terminal oder Ihrer Eingabeaufforderung den folgenden `curl`-Befehl aus, um das soeben erstellte Element durch Ändern des `number`-Werts zu aktualisieren. Verwenden Sie Ihre eigene Aufruf-URL.

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "update", "payload": {"Key": {"id": "5678EFGH"}, "UpdateExpression": "SET #num = :new_value", "ExpressionAttributeNames": {"#num": "number"}, "ExpressionAttributeValues": {":new_value": 42}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"update\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}, \"UpdateExpression\": \"SET #num = :new_value\", \"ExpressionAttributeNames\": {\"#num\": \"number\"}, \"ExpressionAttributeValues\": {\":new_value\": 42}}}'
   ```

------

1. Um zu bestätigen, dass der Wert von `number` für das Element aktualisiert wurde, führen Sie einen weiteren Lesebefehl aus:

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "read", "payload": {"Key": {"id": "5678EFGH"}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"read\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}}}'
   ```

------

**So löschen Sie das Element in Ihrer DynamoDB-Tabelle mit curl**

1. Führen Sie in Ihrem Terminal oder Ihrer Eingabeaufforderung den folgenden `curl`-Befehl aus, um das soeben erstellte Element zu löschen. Verwenden Sie Ihre eigene Aufruf-URL.

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "delete", "payload": {"Key": {"id": "5678EFGH"}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"delete\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}}}'
   ```

------

1. Bestätigen Sie, dass der Löschvorgang erfolgreich war. Stellen Sie im Bereich **Zurückgegebene Elemente** der Seite **Elemente entdecken** der DynamoDB-Konsole sicher, dass das Element mit der **ID** `5678EFGH` nicht mehr in der Tabelle enthalten ist.

## Bereinigen Ihrer Ressourcen (optional)
<a name="cleanup"></a>

Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Durch das Löschen von AWS Ressourcen, die Sie nicht mehr verwenden, vermeiden Sie unnötige Kosten für Ihre AWS-Konto.

**So löschen Sie die Lambda-Funktion:**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion aus, die Sie erstellt haben.

1. Wählen Sie **Aktionen**, **Löschen** aus.

1. Geben Sie **confirm** in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie die Ausführungsrolle**

1. Öffnen Sie die Seite [Roles](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie die von Ihnen erstellte Ausführungsrolle aus.

1. Wählen Sie **Löschen** aus.

1. Geben Sie den Namen der Rolle in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie die API**

1. Öffnen Sie die [APIs Seite](https://console.aws.amazon.com/apigateway/main/apis) der API Gateway Gateway-Konsole.

1. Wählen Sie die von Ihnen erstellte API aus.

1. Wählen Sie **Aktionen**, **Löschen** aus.

1. Wählen Sie **Löschen** aus.

**So löschen Sie die DynamoDB-Tabelle**

1. Öffnen Sie die Seite [Tables (Tabellen)](https://console.aws.amazon.com//dynamodb/home#tables:) in der DynamoDB-Konsole.

1. Wählen Sie die von Ihnen erstellte Tabelle aus.

1. Wählen Sie **Löschen** aus.

1. Geben Sie **delete** in das Textfeld ein.

1. Wählen Sie **Delete Table** (Tabelle löschen).

# Behandlung von Lambda-Fehlern mit einer API-Gateway-API
<a name="services-apigateway-errors"></a>

API Gateway behandelt alle Aufruf- und Funktionsfehler als interne Fehler. Wenn die Lambda-API die Aufruf-Anforderung ablehnt, gibt API Gateway einen 500-Fehlercode zurück. Wenn die Funktion ausgeführt wird, aber einen Fehler oder eine Antwort im falschen Format zurückgibt, gibt API Gateway den Fehlercode 502 zurück. In beiden Fällen lautet der Text der Antwort von API Gateway „`{"message": "Internal server error"}`“.

**Anmerkung**  
API Gateway wiederholt keine Lambda-Aufrufe. Wenn Lambda einen Fehler zurückgibt, gibt API Gateway eine Fehlerantwort an den Client zurück.

Das folgende Beispiel zeigt eine X-Ray-Ablaufverfolgungszuordnung für eine Anforderung, die zu einem Funktionsfehler und einen 502-Fehler von API Gateway führte. Der Client erhält die generische Fehlermeldung.

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/tracemap-apig-502.png)


Um die Fehlerantwort anzupassen, müssen Sie Fehler im Code abfangen und eine Antwort im erforderlichen Format formatieren.

**Example [index.mjs](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/nodejs-apig/function/index.mjs) – Formatierfehler**  

```
var formatError = function(error){
  var response = {
    "statusCode": error.statusCode,
    "headers": {
      "Content-Type": "text/plain",
      "x-amzn-ErrorType": error.code
    },
    "isBase64Encoded": false,
    "body": error.code + ": " + error.message
  }
  return response
}
```

API Gateway konvertiert diese Antwort in einen HTTP-Fehler mit einem benutzerdefinierten Statuscode und Text. In der Ablaufverfolgungszuweisung ist der Funktionsknoten grün, da er den Fehler behandelt hat.

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/tracemap-apig-404.png)


# Wählen Sie eine Methode, um Ihre Lambda-Funktion über eine HTTP-Anfrage aufzurufen
<a name="apig-http-invoke-decision"></a>

Viele häufige Anwendungsfälle für Lambda beinhalten den Aufruf Ihrer Funktion über eine HTTP-Anfrage. Beispielsweise möchten Sie möglicherweise, dass eine Webanwendung Ihre Funktion über eine Browseranforderung aufruft. Lambda-Funktionen können auch verwendet werden, um vollständige REST zu erstellen APIs, Benutzerinteraktionen von mobilen Apps aus abzuwickeln, Daten von externen Diensten über HTTP-Aufrufe zu verarbeiten oder benutzerdefinierte Webhooks zu erstellen.

In den folgenden Abschnitten wird erläutert, welche Möglichkeiten Sie haben, Lambda über HTTP aufzurufen und es werden Informationen bereitgestellt, die Ihnen helfen, die richtige Entscheidung für Ihren speziellen Anwendungsfall zu treffen.

## Welche Optionen stehen Ihnen bei der Auswahl einer HTTP-Aufrufmethode zur Verfügung?
<a name="w2aad101c29c46b9"></a>

Lambda bietet zwei Hauptmethoden zum Aufrufen einer Funktion mithilfe einer HTTP-Anfrage: [Funktion URLs](urls-configuration.md) und [API](services-apigateway.md) Gateway. Die wichtigsten Unterschiede zwischen diesen beiden Optionen sind die folgenden:
+ Die **Lambda-Funktion URLs** bietet einen einfachen, direkten HTTP-Endpunkt für eine Lambda-Funktion. Sie sind auf Einfachheit und Kosteneffizienz optimiert und bieten den schnellsten Weg, um eine Lambda-Funktion über HTTP bereitzustellen.
+ **API Gateway** ist ein fortschrittlicherer Dienst zum Erstellen von Funktionen mit vollem Funktionsumfang APIs. API Gateway ist für den Aufbau und die Verwaltung von Produktionen APIs in großem Maßstab optimiert und bietet umfassende Tools für Sicherheit, Überwachung und Verkehrsmanagement.

## Empfehlungen, falls Sie Ihre Anforderungen bereits kennen
<a name="w2aad101c29c46c11"></a>

Wenn Sie sich über Ihre Anforderungen bereits im Klaren sind, finden Sie hier unsere grundlegenden Empfehlungen:

Wir empfehlen **[Funktionen URLs](urls-configuration.md)** für einfache Anwendungen oder für die Prototypenentwicklung, bei denen Sie nur grundlegende Authentifizierungsmethoden und request/response deren Handhabung benötigen und bei denen Sie Kosten und Komplexität auf ein Minimum reduzieren möchten.

**[API Gateway](services-apigateway.md)** ist eine bessere Wahl für Produktionsanwendungen in großem Maßstab oder für Fälle, in denen Sie erweiterte Funktionen wie [OpenAPI-Description](https://www.openapis.org/), eine Auswahl an Authentifizierungsoptionen, benutzerdefinierte Domainnamen oder umfangreiche request/response Funktionen wie Drosselung, Caching und Transformation benötigen. request/response 

## Was ist bei der Auswahl einer Methode zum Aufrufen Ihrer Lambda-Funktion zu beachten?
<a name="w2aad101c29c46c13"></a>

Bei der Auswahl zwischen Funktion URLs und API Gateway müssen Sie die folgenden Faktoren berücksichtigen:
+ Ihre Authentifizierungsanforderungen, z. B. ob Sie Amazon Cognito für die Benutzerauthentifizierung benötigen OAuth 
+ Ihre Skalierungsanforderungen und die Komplexität der API, die Sie implementieren möchten
+ Ob Sie erweiterte Funktionen wie die Validierung und Formatierung von Anfragen benötigen request/response 
+ Ihre Überwachungsanforderungen
+ Was sind Ihre Ziele?

Wenn Sie diese Faktoren verstehen, können Sie die Option auswählen, die Ihren Anforderungen an Sicherheit, Komplexität und Kosten am besten gerecht wird.

Die folgenden Informationen fassen die wichtigsten Unterschiede zwischen den beiden Optionen zusammen.

### Authentifizierung
<a name="w2aad101c29c46c13c11b1"></a>
+ **Die Funktion URLs** bietet grundlegende Authentifizierungsoptionen über AWS Identity and Access Management (IAM). Sie können Ihre Endpunkte so konfigurieren, dass sie entweder öffentlich sind (keine Authentifizierung) oder dass sie eine IAM-Authentifizierung erfordern. Mit der IAM-Authentifizierung können Sie AWS Standardanmeldedaten oder IAM-Rollen verwenden, um den Zugriff zu steuern. Dieser Ansatz ist zwar einfach einzurichten, bietet aber im Vergleich zu anderen Authentifizierungsmethoden nur begrenzte Optionen.
+ **API Gateway** bietet Zugriff auf eine umfassendere Palette von Authentifizierungsoptionen. Neben der IAM-Authentifizierung können Sie [Lambda-Autorisierer](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html) (benutzerdefinierte Authentifizierungslogik), [Amazon Cognito Cognito-Benutzerpools](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) und .0-Flows verwenden. OAuth2 Diese Flexibilität ermöglicht es Ihnen, komplexe Authentifizierungsschemata zu implementieren, darunter Authentifizierungsanbieter von Drittanbietern, tokenbasierte Authentifizierung und Multi-Faktor-Authentifizierung.

### Anfrage-/Antwort-Anforderungen
<a name="w2aad101c29c46c13c11b3"></a>
+ **Die Funktion URLs bietet eine** grundlegende Behandlung von HTTP-Anfragen und -Antworten. Sie unterstützen Standard-HTTP-Methoden und bieten integrierte CORS-Unterstützung (Cross-Origin Resource Sharing). Sie können zwar JSON-Nutzdaten und Abfrageparameter auf natürliche Weise verarbeiten, bieten jedoch keine Funktionen zur Transformation oder Validierung von Anfragen. Die Bearbeitung von Antworten ist ähnlich einfach – der Client erhält die Antwort von Ihrer Lambda-Funktion genau so, wie Lambda sie zurückgibt.
+ **API Gateway** bietet ausgefeilte Funktionen zur Bearbeitung von Anfragen und Antworten. Sie können Anforderungsvalidatoren definieren, Anfragen und Antworten mithilfe von Zuordnungsvorlagen transformieren, request/response Header einrichten und das Zwischenspeichern von Antworten implementieren. API Gateway unterstützt auch binäre Nutzdaten und benutzerdefinierte Domainnamen und kann Antworten ändern, bevor sie den Client erreichen. Sie können Modelle für die request/response Validierung und Transformation mithilfe des JSON-Schemas einrichten.

### Skalierung
<a name="w2aad101c29c46c13c11b5"></a>
+ Die **Funktion URLs** skaliert direkt mit den Parallelitätsgrenzen Ihrer Lambda-Funktion und bewältigt Verkehrsspitzen, indem Sie Ihre Funktion bis zum konfigurierten Maximallimit skalieren. Sobald dieses Limit erreicht ist, reagiert Lambda auf weitere Anfragen mit HTTP 429-Antworten. Es gibt keinen integrierten Warteschlangenmechanismus, sodass der Umgang mit der Skalierung vollständig von der Konfiguration Ihrer Lambda-Funktion abhängt. Standardmäßig haben Lambda-Funktionen ein Limit von 1.000 gleichzeitigen Ausführungen pro. AWS-Region
+ **API Gateway** bietet zusätzlich zur Lambda-eigenen Skalierung zusätzliche Skalierungsfunktionen. Es umfasst integrierte Funktionen zur Warteschleife und Drosselung von Anfragen, sodass Sie Datenverkehrsspitzen besser bewältigen können. API Gateway kann standardmäßig bis zu 10.000 Anfragen pro Sekunde pro Region verarbeiten, mit einer Burst-Kapazität von 5.000 Anfragen pro Sekunde. Es bietet auch Tools zum Drosseln von Anfragen auf verschiedenen Ebenen (API, Phase oder Methode), um Ihr Backend zu schützen.

### Überwachen
<a name="w2aad101c29c46c13c11b7"></a>
+ **Function URLs** bietet eine grundlegende Überwachung anhand von CloudWatch Amazon-Metriken, einschließlich Anzahl der Anfragen, Latenz und Fehlerraten. Sie erhalten Zugriff auf standardmäßige Lambda-Metriken und -Protokolle, die die Rohanfragen anzeigen, die in Ihre Funktion eingehen. Dies bietet zwar wichtige betriebliche Transparenz, die Metriken konzentrieren sich jedoch hauptsächlich auf die Funktionsausführung.
+ **API Gateway** bietet umfassende Überwachungsfunktionen, einschließlich detaillierter Metriken, Protokollierungs- und Verfolgungsoptionen. Sie können API-Aufrufe, Latenz, Fehlerraten und hit/miss Cache-Raten über überwachen CloudWatch. API Gateway lässt sich auch AWS X-Ray für verteiltes Tracing integrieren und bietet anpassbare Protokollierungsformate.

### Cost (Kosten)
<a name="w2aad101c29c46c13c11b9"></a>
+ Die **Funktionen URLs** folgen dem Standard-Lambda-Preismodell — Sie zahlen nur für Funktionsaufrufe und Rechenzeit. Für den URL-Endpunkt selbst fallen keine zusätzlichen Gebühren an. Dies macht es zu einer kostengünstigen Wahl für einfache Anwendungen APIs oder Anwendungen mit geringem Datenverkehr, wenn Sie die zusätzlichen Funktionen von API Gateway nicht benötigen.
+ **API Gateway** bietet ein [kostenloses Kontingent](https://aws.amazon.com/api-gateway/pricing/#Free_Tier), das eine Million API-Aufrufe für REST APIs und eine Million API-Aufrufe für HTTP umfasst APIs. Danach berechnet API Gateway Gebühren für API-Aufrufe, Datenübertragung und Caching (falls aktiviert). Weitere Informationen zu den Kosten für Ihren eigenen Anwendungsfall finden Sie auf der [Seite mit den Preisen](https://aws.amazon.com/api-gateway/pricing/) für API Gateway.

### Weitere Funktionen
<a name="w2aad101c29c46c13c11c11"></a>
+  URLsDie **Funktionen** sind auf Einfachheit und direkte Lambda-Integration ausgelegt. Sie unterstützen sowohl HTTP- als auch HTTPS-Endpunkte, bieten integrierte CORS-Unterstützung und bieten Dual-Stack- (IPv4 und) Endpunkte. IPv6 Ihnen fehlen zwar erweiterte Features, sie zeichnen sich jedoch in Szenarien aus, in denen Sie Lambda-Funktionen schnell und unkompliziert über HTTP verfügbar machen müssen.
+ **API Gateway** umfasst zahlreiche zusätzliche Funktionen wie API-Versionierung, Stagemanagement, API-Schlüssel für Nutzungspläne, API-Dokumentation über Swagger/OpenAPI WebSocket APIs, private Funktionen APIs innerhalb einer VPC und WAF-Integration für zusätzliche Sicherheit. Es unterstützt auch kanarische Implementierungen, Scheinintegrationen zum Testen und die Integration mit anderen Systemen AWS-Services als Lambda.

## Wählen Sie eine Methode, um Ihre Lambda-Funktion aufzurufen
<a name="w2aad101c29c46c15"></a>

Nachdem Sie sich mit den Kriterien für die Auswahl zwischen Lambda-Funktion URLs und API Gateway und den wichtigsten Unterschieden zwischen ihnen vertraut gemacht haben, können Sie die Option auswählen, die Ihren Anforderungen am besten entspricht, und die folgenden Ressourcen verwenden, um Ihnen den Einstieg in die Verwendung zu erleichtern.

------
#### [ Function URLs ]

**Nutzen Sie die folgenden Ressourcen, um URLs mit Function zu beginnen**
+ Folgen Sie dem Tutorial [Erstellen einer Lambda-Funktion mit einer Funktions-URL](urls-webhook-tutorial.md)
+ Weitere Informationen zur Funktion finden Sie URLs im [Lambda-Funktion erstellen und verwalten URLs](urls-configuration.md) Kapitel dieses Handbuchs
+ Probieren Sie das in der Konsole enthaltene Tutorial **Erstellen Sie eine einfache Web-App** aus, indem Sie wie folgt vorgehen:

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Öffnen Sie das Hilfe-Panel, indem Sie das Symbol in der oberen rechten Ecke des Bildschirms wählen.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/console_help_screenshot.png)

1. Wählen Sie **Tutorials** aus.

1. Wählen Sie unter **Einfache Web-App erstellen** die Option **Tutorial starten** aus.

------
#### [ API Gateway ]

**Beginnen Sie mit Lambda und API Gateway mit den folgenden Ressourcen**
+ Folgen Sie dem Tutorial [Verwenden von Lambda mit API Gateway](services-apigateway-tutorial.md), um eine REST-API zu erstellen, die in eine Backend-Lambda-Funktion integriert ist.
+ In den folgenden Abschnitten des *Amazon API Gateway Developer Guide* erfahren Sie mehr über die verschiedenen Arten von APIs, die von API Gateway angeboten werden:
  + [API-Gateway-REST APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html)
  + [API Gateway HTTP APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html)
  + [API Gateway WebSocket APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html)
+ Probieren Sie eines oder mehrere der Beispiele im Abschnitt [Tutorials und Workshops](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-tutorials.html) im *Amazon API Gateway Developer Guide* aus.

------

# Verwenden AWS Lambda mit AWS Infrastructure Composer
<a name="services-appcomposer"></a>

AWS Infrastructure Composer ist ein Visual Builder zum Entwerfen moderner Anwendungen auf AWS. Sie entwerfen Ihre Anwendungsarchitektur, indem Sie sie auf einer visuellen Leinwand ziehen, gruppieren und verbinden AWS-Services . Infrastructure Composer erstellt anhand Ihres Entwurfs IaC-Vorlagen (Infrastructure as Code), die Sie mithilfe von [AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html) oder [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) bereitstellen können.

## Exportieren einer Lambda-Funktion in Infrastructure Composer
<a name="services-appcomposer-export"></a>

Sie können mit der Verwendung von Infrastructure Composer beginnen, indem Sie mithilfe der Lambda-Konsole ein neues Projekt erstellen, das auf der Konfiguration einer vorhandenen Lambda-Funktion basiert. Gehen Sie wie folgt vor, um die Konfiguration und den Code Ihrer Funktion nach Infrastructure Composer zu exportieren und ein neues Projekt zu erstellen:

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion aus, die Sie als Grundlage für Ihr Infrastructure-Composer-Projekt verwenden möchten.

1. Wählen Sie im Bereich **Funktionsübersicht** die Option **Nach Infrastructure Composer exportieren** aus.

   Um die Konfiguration und den Code Ihrer Funktion nach Infrastructure Composer zu exportieren, erstellt Lambda einen Amazon-S3-Bucket in Ihrem Konto, um diese Daten vorübergehend zu speichern.

1. Wählen Sie im Dialogfeld **Projekt bestätigen und erstellen** aus, um den Standardnamen für diesen Bucket zu akzeptieren und die Konfiguration und den Code Ihrer Funktion nach Infrastructure Composer zu exportieren.

1. (Optional) Um einen anderen Namen für den von Lambda erstellten Amazon-S3-Bucket auszuwählen, geben Sie einen neuen Namen ein und wählen Sie **Projekt bestätigen und erstellen** aus. Die Amazon-S3-Bucket-Namen müssen global eindeutig sein und den [Regeln für die Benennung von Buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html) entsprechen.

1. Um Ihre Projekt- und Funktionsdateien in Infrastructure Composer zu speichern, aktivieren Sie den [lokalen Synchronisierungsmodus](https://docs.aws.amazon.com/application-composer/latest/dg/reference-features-local-sync.html).

**Anmerkung**  
Wenn Sie das Feature **Nach Application Composer exportieren** bereits verwendet und einen Amazon-S3-Bucket mit dem Standardnamen erstellt haben, kann Lambda diesen Bucket wiederverwenden, falls er noch existiert. Akzeptieren Sie den Standard-Bucket-Namen im Dialogfeld, um den vorhandenen Bucket wiederzuverwenden.

### Konfiguration des Amazon-S3-Transfer-Buckets
<a name="services-appcomposer-bucket-info"></a>

Der Amazon-S3-Bucket, den Lambda für die Übertragung der Konfiguration Ihrer Funktion erstellt, verschlüsselt Objekte automatisch mit dem Verschlüsselungsstandard AES 256. Lambda konfiguriert den Bucket auch so, dass er die [Bucket-Besitzer-Bedingung](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-owner-condition.html) verwendet, um sicherzustellen, dass nur Sie AWS-Konto Objekte zum Bucket hinzufügen können.

Lambda konfiguriert den Bucket so, dass Objekte 10 Tage nach dem Hochladen automatisch gelöscht werden. Lambda löscht den Bucket selbst jedoch nicht automatisch. Um den Bucket aus Ihrem zu löschen AWS-Konto, folgen Sie den Anweisungen unter Bucket [löschen](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html). Der Standard-Bucket-Name verwendet das Präfix`lambdasam`, eine 10-stellige alphanumerische Zeichenfolge und das, in dem AWS-Region Sie Ihre Funktion erstellt haben:

```
lambdasam-06f22da95b-us-east-1
```

Um zusätzliche Gebühren zu vermeiden, empfehlen wir Ihnen AWS-Konto, den Amazon S3 S3-Bucket zu löschen, sobald Sie den Export Ihrer Funktion in Infrastructure Composer abgeschlossen haben.

Es gelten die [Standardpreise von Amazon S3](https://aws.amazon.com/s3/pricing/).

### Erforderliche Berechtigungen
<a name="services-appcomposer-permissions"></a>

Um die Funktion Lambda-Integration mit Infrastructure Composer verwenden zu können, benötigen Sie bestimmte Berechtigungen, um eine AWS SAM Vorlage herunterzuladen und die Konfiguration Ihrer Funktion in Amazon S3 zu schreiben.

Um eine AWS SAM Vorlage herunterzuladen, benötigen Sie die Erlaubnis, die folgenden API-Aktionen zu verwenden:
+ [GetPolicy](https://docs.aws.amazon.com/lambda/latest/api/API_GetPolicy.html)
+ [Ich bin: GetPolicyVersion](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicyVersion.html)
+ [ich bin: GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html)
+ [ich bin: GetRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRolePolicy.html)
+ [ich bin: ListAttachedRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html)
+ [ich bin: ListRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRolePolicies.html)
+ [ich bin: ListRoles](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRoles.html)

Sie können die Erlaubnis zur Verwendung all dieser Aktionen erteilen, indem Sie die [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_ReadOnlyAccess.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_ReadOnlyAccess.html) AWS verwaltete Richtlinie zu Ihrer IAM-Benutzerrolle hinzufügen.

Damit Lambda die Konfiguration Ihrer Funktion in Amazon S3 schreiben kann, benötigen Sie die Erlaubnis, die folgenden API-Aktionen zu verwenden:
+ [S3: PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)
+ [S 3: CreateBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html)
+ [S 3: PutBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html)
+ [S 3: PutBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html)

Wenn Sie die Konfiguration Ihrer Funktion nicht nach Infrastructure Composer exportieren können, überprüfen Sie, ob Ihr Konto über die erforderlichen Berechtigungen für diese Operationen verfügt. Wenn Sie über die erforderlichen Berechtigungen verfügen, die Konfiguration Ihrer Funktion aber immer noch nicht exportieren können, suchen Sie nach [ressourcenbasierten Richtlinien](access-control-resource-based.md), die möglicherweise den Zugriff auf Amazon S3 einschränken.

## Sonstige Ressourcen
<a name="w2aad101c33b7"></a>

Ein ausführlicheres Tutorial zum Entwerfen einer Serverless-Anwendung in Infrastructure Composer auf der Grundlage einer vorhandenen Lambda-Funktion finden Sie unter [Verwenden von Lambda mit Infrastructure as Code (IaC)](foundation-iac.md).

Um Infrastructure Composer AWS SAM zu verwenden und eine vollständige serverlose Anwendung mit Lambda zu entwerfen und bereitzustellen, können Sie auch dem [AWS Infrastructure Composer Tutorial](https://catalog.workshops.aws/serverless-patterns/en-US/dive-deeper/module1a) im [AWS Serverless](https://catalog.workshops.aws/serverless-patterns/en-US) Patterns Workshop folgen.

# Verwenden AWS Lambda mit CloudFormation
<a name="services-cloudformation"></a>

In einer AWS CloudFormation Vorlage können Sie eine Lambda-Funktion als Ziel einer benutzerdefinierten Ressource angeben. Verwenden Sie benutzerdefinierte Ressourcen, um Parameter zu verarbeiten, Konfigurationswerte abzurufen oder andere AWS-Services während Stack-Lifecycle-Ereignissen aufzurufen.

Das folgende Beispiel ruft eine Funktion auf, die an anderer Stelle in der Vorlage definiert ist.

**Example – benutzerdefinierte Ressourcendefinition**  

```
Resources:
  primerinvoke:
    Type: [AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn-customresource.html)
    Version: "1.0"
    Properties:
      ServiceToken: !GetAtt primer.Arn
      FunctionName: !Ref randomerror
```

Das Service-Token ist der Amazon-Ressourcenname (ARN) der Funktion, die CloudFormation aufgerufen wird, wenn Sie den Stack erstellen, aktualisieren oder löschen. Sie können auch zusätzliche Eigenschaften hinzufügen`FunctionName`, wie z. B., was CloudFormation unverändert an Ihre Funktion übergeben wird.

CloudFormation ruft Ihre Lambda-Funktion [asynchron](invocation-async.md) mit einem Ereignis auf, das eine Callback-URL enthält.

**Example CloudFormation — Nachrichtenereignis**  

```
{
    "RequestType": "Create",
    "ServiceToken": "arn:aws:lambda:us-east-1:123456789012:function:lambda-error-processor-primer-14ROR2T3JKU66",
    "ResponseURL": "https://cloudformation-custom-resource-response-useast1.s3-us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A123456789012%3Astack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456%7Cprimerinvoke%7C5d478078-13e9-baf0-464a-7ef285ecc786?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Expires=1555451971&Signature=28UijZePE5I4dvukKQqM%2F9Rf1o4%3D",
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456",
    "RequestId": "5d478078-13e9-baf0-464a-7ef285ecc786",
    "LogicalResourceId": "primerinvoke",
    "ResourceType": "AWS::CloudFormation::CustomResource",
    "ResourceProperties": {
        "ServiceToken": "arn:aws:lambda:us-east-1:123456789012:function:lambda-error-processor-primer-14ROR2T3JKU66",
        "FunctionName": "lambda-error-processor-randomerror-ZWUC391MQAJK"
    }
}
```

Die Funktion ist für die Rückgabe einer Antwort an die Rückruf-URL zuständig, die Erfolg oder Misserfolg bedeutet. Die vollständige Antwortsyntax finden Sie unter [Benutzerdefinierte Ressourcenantwortobjekte](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-ref-responses.html).

**Example — CloudFormation benutzerdefinierte Ressourcenantwort**  

```
{
    "Status": "SUCCESS",
    "PhysicalResourceId": "2019/04/18/[$LATEST]b3d1bfc65f19ec610654e4d9b9de47a0",
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456",
    "RequestId": "5d478078-13e9-baf0-464a-7ef285ecc786",
    "LogicalResourceId": "primerinvoke"
}
```

CloudFormation stellt eine aufgerufene Bibliothek bereit`cfn-response`, die das Senden der Antwort übernimmt. Wenn Sie Ihre Funktion innerhalb einer Vorlage definieren, können Sie die Bibliothek anhand des Namens angeben. CloudFormation fügt dann die Bibliothek dem Bereitstellungspaket hinzu, das sie für die Funktion erstellt.

Wenn Ihre Funktion, die eine benutzerdefinierte Ressource verwendet, mit einer [Elastic Network Interface](configuration-vpc.md#configuration-vpc-enis) verbunden ist, fügen Sie die folgenden Ressourcen zur VPC-Richtlinie hinzu, wobei **region** die Region ist, in der sich die Funktion befindet, ohne Bindestriche angegeben ist. Zum Beispie, `us-east-1` ist `useast1`. Dadurch kann die benutzerdefinierte Ressource auf die Callback-URL antworten, die ein Signal zurück an den CloudFormation Stack sendet.

```
arn:aws:s3:::cloudformation-custom-resource-response-region",
"arn:aws:s3:::cloudformation-custom-resource-response-region/*",
```

Die folgende Beispielfunktion ruft eine zweite Funktion auf. Wenn der Aufruf erfolgreich ist, sendet die Funktion eine Erfolgsantwort an CloudFormation, und das Stack-Update wird fortgesetzt. Die Vorlage verwendet den [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)Ressourcentyp, der von bereitgestellt wird AWS Serverless Application Model.

**Example – Benutzerdefinierte Ressourcenfunktion**  

```
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  primer:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      Handler: index.handler
      Runtime: nodejs16.x
      InlineCode: |
        var aws = require('aws-sdk');
        var response = require('cfn-response');
        exports.handler = function(event, context) {
            // For Delete requests, immediately send a SUCCESS response.
            if (event.RequestType == "Delete") {
                response.send(event, context, "SUCCESS");
                return;
            }
            var responseStatus = "FAILED";
            var responseData = {};
            var functionName = event.ResourceProperties.FunctionName
            var lambda = new aws.Lambda();
            lambda.invoke({ FunctionName: functionName }, function(err, invokeResult) {
                if (err) {
                    responseData = {Error: "Invoke call failed"};
                    console.log(responseData.Error + ":\n", err);
                }
                else responseStatus = "SUCCESS";
                response.send(event, context, responseStatus, responseData);
            });
        };
      Description: Invoke a function to create a log stream.
      MemorySize: 128
      Timeout: 8
      Role: !GetAtt role.Arn
      Tracing: Active
```

Wenn die Funktion, die die benutzerdefinierte Ressource aufruft, nicht in einer Vorlage definiert ist, können Sie den Quellcode für `cfn-response` das [Modul cfn-response im AWS CloudFormation Benutzerhandbuch](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-lambda-function-code-cfnresponsemodule.html) abrufen.

Weitere Informationen zu benutzerdefinierten Ressourcen finden Sie unter [Benutzerdefinierte Ressourcen](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html) im *AWS CloudFormation -Benutzerhandbuch*.

# Amazon DocumentDB-Ereignisse mit Lambda verarbeiten
<a name="with-documentdb"></a>

Sie können eine Lambda-Funktion verwenden, um Ereignisse in einem [Änderungsstream von Amazon DocumentDB (mit MongoDB-Kompatibilität)](https://docs.aws.amazon.com/documentdb/latest/developerguide/change_streams.html) zu verarbeiten, indem Sie einen Amazon-DocumentDB-Cluster als Ereignisquelle konfigurieren. Anschließend können Sie ereignisgesteuerte Workloads automatisieren, indem Sie Ihre Lambda-Funktion jedes Mal aufrufen, wenn sich Daten in Ihrem Amazon-DocumentDB-Cluster ändern.

**Anmerkung**  
Lambda unterstützt nur die Versionen 4.0 und 5.0 von Amazon DocumentDB. Lambda unterstützt Version 3.6 nicht.  
Für die Zuordnung von Ereignisquellen unterstützt Lambda außerdem nur Instance-basierte Cluster und regionale Cluster. Lambda unterstützt keine [elastischen Cluster](https://docs.aws.amazon.com/documentdb/latest/developerguide/docdb-using-elastic-clusters.html) oder [globalen Cluster](https://docs.aws.amazon.com/documentdb/latest/developerguide/global-clusters.html). Diese Einschränkung gilt nicht, wenn Lambda als Client verwendet wird, um eine Verbindung mit Amazon DocumentDB herzustellen. Lambda kann eine Verbindung mit allen Clustertypen herstellen, um CRUD-Vorgänge auszuführen.

Lambda verarbeitet Ereignisse aus Amazon-DocumentDB-Änderungsstreams sequentiell in der Reihenfolge, in der sie ankommen. Aus diesem Grund kann Ihre Funktion jeweils nur einen Aufruf von Amazon DocumentDB gleichzeitig verarbeiten. Sie können Ihre Funktion anhand ihrer [Gleichzeitigkeitsmetriken](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-concurrency.html) überwachen.

**Warnung**  
Zuordnung von Lambda-Ereignisquellen verarbeiten jedes Ereignis mindestens einmal und es kann zu einer doppelten Verarbeitung von Datensätzen kommen. Um mögliche Probleme im Zusammenhang mit doppelten Ereignissen zu vermeiden, empfehlen wir Ihnen dringend, Ihren Funktionscode idempotent zu machen. Weitere Informationen finden Sie im Knowledge Center unter [Wie mache ich meine Lambda-Funktion idempotent](https://repost.aws/knowledge-center/lambda-function-idempotent)?. AWS 

**Topics**
+ [

## Beispiel für Amazon-DocumentDB-Ereignis
](#docdb-sample-event)
+ [

## Voraussetzungen und Berechtigungen
](#docdb-prereqs)
+ [

## Konfigurieren Sie die Netzwerksicherheit
](#docdb-network)
+ [

## Erstellen einer Zuordnung von Ereignisquellen von Amazon DocumentDB (Konsole)
](#docdb-configuration)
+ [

## Erstellen einer Zuordnung von Ereignisquellen von Amazon DocumentDB (SDK oder CLI)
](#docdb-api)
+ [

## Startpositionen für Abfragen und Streams
](#docdb-stream-polling)
+ [

## Überwachen Ihrer Amazon-DocumentDB-Ereignisquelle
](#docdb-monitoring)
+ [

# Tutorial: Verwendung AWS Lambda mit Amazon DocumentDB DocumentDB-Streams
](with-documentdb-tutorial.md)

## Beispiel für Amazon-DocumentDB-Ereignis
<a name="docdb-sample-event"></a>

```
{
    "eventSourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:canaryclusterb2a659a2-qo5tcmqkcl03",
    "events": [
        {
            "event": {
                "_id": {
                    "_data": "0163eeb6e7000000090100000009000041e1"
                },
                "clusterTime": {
                    "$timestamp": {
                        "t": 1676588775,
                        "i": 9
                    }
                },
                "documentKey": {
                    "_id": {
                        "$oid": "63eeb6e7d418cd98afb1c1d7"
                    }
                },
                "fullDocument": {
                    "_id": {
                        "$oid": "63eeb6e7d418cd98afb1c1d7"
                    },
                    "anyField": "sampleValue"
                },
                "ns": {
                    "db": "test_database",
                    "coll": "test_collection"
                },
                "operationType": "insert"
            }
        }
    ],
    "eventSource": "aws:docdb"
}
```

Weitere Informationen zu den Ereignissen in diesem Beispiel und den zugehörigen Formen finden Sie unter [Änderungsereignisse](https://www.mongodb.com/docs/manual/reference/change-events/) auf der MongoDB-Dokumentationswebsite.

## Voraussetzungen und Berechtigungen
<a name="docdb-prereqs"></a>

Bevor Sie Amazon DocumentDB als Ereignisquelle für Ihre Lambda-Funktion verwenden können, beachten Sie die folgenden Voraussetzungen. Folgendes muss zutreffen:
+ **Haben Sie einen vorhandenen Amazon DocumentDB-Cluster in derselben AWS-Konto und AWS-Region wie Ihre Funktion.** Wenn Sie über keinen bestehenden Cluster verfügen, können Sie anhand der Anleitung in [Erste Schritte mit Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/get-started-guide.html) im *Amazon-DocumentDB-Entwicklerhandbuch* einen erstellen. Alternativ dazu führen Sie die ersten Schritte in [Tutorial: Verwendung AWS Lambda mit Amazon DocumentDB DocumentDB-Streams](with-documentdb-tutorial.md) durch die Erstellung eines Amazon DocumentDB-Clusters mit allen erforderlichen Voraussetzungen.
+ **Sie müssen Lambda den Zugriff auf die Ressourcen von Amazon Virtual Private Cloud (Amazon VPC) erlauben, die Ihrem Amazon-DocumentDB-Cluster zugeordnet sind.** Weitere Informationen finden Sie unter [Konfigurieren Sie die Netzwerksicherheit](#docdb-network).
+ **Aktivieren Sie TLS in Ihrem Amazon-DocumentDB-Cluster.** Dies ist die Standardeinstellung. Wenn Sie TLS deaktivieren, kann Lambda nicht mit Ihrem Cluster kommunizieren.
+ **Aktivieren Sie Änderungsstreams in Ihrem Amazon-DocumentDB-Cluster.** Weitere Informationen finden Sie unter [Verwenden von Änderungsstreams mit Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/change_streams.html) im *Amazon-DocumentDB-Entwicklerhandbuch*.
+ **Stellen Sie Lambda Anmeldeinformationen für den Zugriff auf Ihren Amazon-DocumentDB-Cluster zur Verfügung.** Geben Sie bei der Einrichtung der Ereignisquelle den [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)-Schlüssel mit den Authentifizierungsdetails (Benutzername und Passwort) an, die für den Zugriff auf Ihren Cluster erforderlich sind. Um diesen Schlüssel während der Einrichtung bereitzustellen, haben Sie die folgenden Möglichkeiten:
  + Wenn Sie die Lambda-Konsole für die Einrichtung verwenden, geben Sie diesen Schlüssel in das Feld **Secrets-Manager-Schlüssel** ein.
  + Wenn Sie das AWS Command Line Interface (AWS CLI) für die Einrichtung verwenden, geben Sie diesen Schlüssel in der `source-access-configurations` Option an. Sie können diese Option entweder in den [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)-Befehl oder in den [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html)-Befehl einschließen. Beispiel:

    ```
    aws lambda create-event-source-mapping \
        ...
        --source-access-configurations  '[{"Type":"BASIC_AUTH","URI":"arn:aws:secretsmanager:us-west-2:123456789012:secret:DocDBSecret-AbC4E6"}]' \
        ...
    ```
+ **Sie müssen Lambda Berechtigungen zur Verwaltung von Ressourcen gewähren, die zu Ihrem Amazon-DocumentDB-Stream gehören.** Fügen Sie der zu der [Ausführungsrolle](lambda-intro-execution-role.md) Ihrer Funktion manuell die folgenden Berechtigungen hinzu:
  + [RDS: Beschreiben DBClusters](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html)
  + [RDS:Parameter beschreiben DBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusterParameters.html)
  + [RDS:Gruppen DBSubnet beschreiben](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBSubnetGroups.html)
  + [ec2: CreateNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html)
  + [ec2: DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)
  + [ec2: DescribeVpcs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html)
  + [ec2: DeleteNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterface.html)
  + [ec2: DescribeSubnets](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html)
  + [ec2: DescribeSecurityGroups](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)
  + [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)
  + [Verwalter von Geheimnissen: GetSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html)
+ **Halten Sie die Größe der Amazon-DocumentDB-Änderungsstream-Ereignisse, die Sie an Lambda senden, bei unter 6 MB.** Lambda unterstützt Nutzlasten mit einer Größe von bis zu 6 MB. Wenn Ihr Änderungsstream versucht, Lambda ein Ereignis zu senden, das größer als 6 MB ist, löscht Lambda die Nachricht und gibt die `OversizedRecordCount`-Metrik aus. Lambda gibt alle Metriken auf die bestmögliche Weise aus.

**Anmerkung**  
Während Lambda-Funktionen in der Regel ein maximales Timeout-Limit von 15 Minuten haben, unterstützen Ereignisquellenzuordnungen für Amazon MSK, selbstverwaltetes Apache Kafka, Amazon DocumentDB, Amazon MQ für ActiveMQ und RabbitMQ nur Funktionen mit einem maximalen Timeout-Limit von 14 Minuten. Diese Einschränkung stellt sicher, dass die Ereignisquellenzuordnung Funktionsfehler und Wiederholungsversuche ordnungsgemäß verarbeiten kann.

## Konfigurieren Sie die Netzwerksicherheit
<a name="docdb-network"></a>

Um Lambda vollen Zugriff auf Amazon DocumentDB über Ihre Zuordnung von Ereignisquellen zu ermöglichen, muss Ihr Cluster entweder einen öffentlichen Endpunkt (öffentliche IP-Adresse) verwenden oder Sie müssen Zugriff auf die Amazon VPC gewähren, in der Sie den Cluster erstellt haben.

Wenn Sie Amazon DocumentDB mit Lambda verwenden, erstellen Sie [AWS PrivateLink VPC-Endpunkte](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html), die Ihrer Funktion Zugriff auf die Ressourcen in Ihrer Amazon VPC bieten.

**Anmerkung**  
AWS PrivateLink VPC-Endpunkte sind für Funktionen mit Ereignisquellenzuordnungen erforderlich, die den Standardmodus (auf Abruf) für Ereignisabfragen verwenden. Wenn Ihre Ereignisquellenzuordnung den [Bereitstellungsmodus](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode) verwendet, müssen Sie keine AWS PrivateLink VPC-Endpunkte konfigurieren.

Erstellen Sie einen Endpunkt, der den Zugriff auf die folgenden Ressourcen ermöglicht:
+  Lambda – Erstellen Sie einen Endpunkt für den Lambda-Serviceprinzipal. 
+  AWS STS — Erstellen Sie einen Endpunkt für den, damit ein Service Principal eine Rolle AWS STS in Ihrem Namen übernehmen kann. 
+  Secrets Manager – Wenn Ihr Cluster Secrets Manager zum Speichern von Anmeldeinformationen verwendet, erstellen Sie einen Endpunkt für Secrets Manager. 

Alternativ konfigurieren Sie ein NAT-Gateway auf jedem öffentlichen Subnetz in der Amazon-VPC. Weitere Informationen finden Sie unter [Aktivieren Sie den Internetzugang für VPC-verbundene Lambda-Funktionen](configuration-vpc-internet.md).

Wenn Sie eine Ereignisquellenzuordnung für Amazon DocumentDB erstellen, prüft Lambda, ob Elastic Network Interfaces (ENIs) bereits für die für Ihre Amazon VPC konfigurierten Subnetze und Sicherheitsgruppen vorhanden sind. Wenn Lambda feststellt, dass sie vorhanden ENIs sind, versucht es, sie wiederzuverwenden. Andernfalls erstellt Lambda neue, ENIs um eine Verbindung zur Ereignisquelle herzustellen und Ihre Funktion aufzurufen.

**Anmerkung**  
Lambda-Funktionen werden immer intern ausgeführt, die dem Lambda-Dienst VPCs gehören. Die VPC-Konfiguration Ihrer Funktion hat keinen Einfluss auf die Zuordnung von Ereignisquellen. Nur die Netzwerkkonfiguration der Ereignisquelle bestimmt, wie Lambda sich mit Ihrer Ereignisquelle verbindet.

Konfigurieren Sie die Sicherheitsgruppen für die Amazon VPC, die Ihren Cluster enthält. Standardmäßig verwendet Amazon DocumentDB die folgenden Ports: `27017`.
+ Eingehende Regeln – Erlauben Sie den gesamten Datenverkehr auf dem Standard-Broker-Port für die Sicherheitsgruppe, die mit Ihrer Ereignisquelle verbunden ist. Alternativ können Sie eine selbstreferenzierende Regel für Sicherheitsgruppen verwenden, um den Zugriff von Instances innerhalb derselben Sicherheitsgruppe zuzulassen.
+ Regeln für ausgehenden Datenverkehr — Erlauben Sie den gesamten Datenverkehr auf dem Port `443` für externe Ziele, wenn Ihre Funktion mit Diensten kommunizieren muss. AWS Alternativ können Sie auch eine selbstreferenzierende Sicherheitsgruppenregel verwenden, um den Zugriff auf den Broker einzuschränken, wenn Sie nicht mit anderen Diensten kommunizieren müssen. AWS 
+ Regeln für eingehenden Datenverkehr auf Amazon-VPC-Endpunkten – Wenn Sie einen Amazon-VPC-Endpunkt verwenden, muss die Sicherheitsgruppe, die mit Ihrem Amazon-VPC-Endpunkt verbunden ist, eingehenden Verkehr auf Port `443` von der Cluster-Sicherheitsgruppe zulassen.

Wenn Ihr Cluster eine Authentifizierung verwendet, können Sie auch die Endpunktrichtlinie für den Secrets-Manager-Endpunkt einschränken. Für den Aufruf der Secrets-Manager-API verwendet Lambda Ihre Funktionsrolle und nicht den Lambda-Serviceprinzipal.

**Example VPC-Endpunktrichtlinie – Secrets Manager-Endpunkt**  

```
{
      "Statement": [
          {
              "Action": "secretsmanager:GetSecretValue",
              "Effect": "Allow",
              "Principal": {
                  "AWS": [
                      "arn:aws::iam::123456789012:role/my-role"
                  ]
              },
              "Resource": "arn:aws::secretsmanager:us-west-2:123456789012:secret:my-secret"
          }
      ]
  }
```

Wenn Sie Amazon VPC-Endpunkte verwenden, AWS leitet Ihre API-Aufrufe zum Aufrufen Ihrer Funktion über das Elastic Network Interface (ENI) des Endpunkts weiter. Der Lambda-Serviceprinzipal muss alle Rollen und Funktionen aufrufen`lambda:InvokeFunction`, die diese ENIs verwenden.

Standardmäßig verfügen Amazon VPC-Endpunkte über offene IAM-Richtlinien, die einen umfassenden Zugriff auf Ressourcen ermöglichen. Es empfiehlt sich, diese Richtlinien auf die Durchführung der erforderlichen Aktionen über diesen Endpunkt zu beschränken. Um sicherzustellen, dass Ihre Zuordnung von Ereignisquellen Ihre Lambda-Funktion aufrufen kann, muss die VPC-Endpunktrichtlinie dem Lambda-Serviceprinzipal erlauben, `sts:AssumeRole` und `lambda:InvokeFunction` aufzurufen. Wenn Sie Ihre VPC-Endpunktrichtlinien so einschränken, dass nur API-Aufrufe zugelassen werden, die aus Ihrem Unternehmen stammen, kann die Zuordnung von Ereignisquellen nicht richtig funktionieren, weshalb in diesen Richtlinien `"Resource": "*"` erforderlich ist.

Die folgenden Beispiel-VPC-Endpunktrichtlinien zeigen, wie der erforderliche Zugriff auf den Lambda-Serviceprinzipal für die AWS STS - und Lambda-Endpunkte gewährt wird.

**Example VPC-Endpunktrichtlinie — AWS STS Endpunkt**  

```
{
      "Statement": [
          {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
    }
```

**Example VPC-Endpunktrichtlinie – Lambda-Endpunkt**  

```
{
      "Statement": [
          {
              "Action": "lambda:InvokeFunction",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
  }
```

## Erstellen einer Zuordnung von Ereignisquellen von Amazon DocumentDB (Konsole)
<a name="docdb-configuration"></a>

Erstellen Sie für eine Funktion zum Lesen aus dem Änderungsstream eines Amazon-DocumentDB-Clusters eine [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md). In diesem Abschnitt wird die entsprechende Vorgehensweise über die Lambda-Konsole beschrieben. AWS SDK und AWS CLI Anweisungen finden Sie unter[Erstellen einer Zuordnung von Ereignisquellen von Amazon DocumentDB (SDK oder CLI)](#docdb-api).

**So erstellen Sie eine Zuordnung von Ereignisquellen von Amazon DocumentDB (Konsole)**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie den Namen einer Funktion aus.

1. Wählen Sie unter **Function overview (Funktionsübersicht)** die Option **Add trigger (Trigger hinzufügen)**.

1. Wählen Sie unter **Auslöserkonfiguration** in der Dropdown-Liste die Option **DocumentDB** aus.

1. Konfigurieren Sie die erforderlichen Optionen und wählen Sie dann **Add** (Hinzufügen) aus.

Lambda unterstützt die folgenden Optionen für Amazon-DocumentDB-Ereignisquellen:
+ **DocumentDB-Cluster** – Wählen Sie einen Amazon-DocumentDB-Cluster aus.
+ **Auslöser aktivieren** – Wählen Sie aus, ob Sie den Auslöser sofort aktivieren möchten. Wenn Sie dieses Kontrollkästchen aktivieren, beginnt Ihre Funktion sofort, Datenverkehr aus dem angegebenen Amazon-DocumentDB-Änderungsstream zu empfangen, sobald die Zuordnung von Ereignisquellen erstellt wurde. Wir empfehlen, das Kontrollkästchen zu deaktivieren, um die Zuordnung von Ereignisquellen zu Testzwecken in einem deaktivierten Zustand zu erstellen. Nach der Erstellung können Sie die Zuordnung von Ereignisquellen jederzeit aktivieren.
+ **Datenbankname –** Geben Sie den Namen einer Datenbank innerhalb des Clusters ein, die verwendet werden soll.
+ (Optional) **Sammlungsname** – Geben Sie den Namen einer Sammlung in der Datenbank ein, die verwendet werden soll. Wenn Sie keine Sammlung angeben, hört Lambda auf alle Ereignisse aus jeder Sammlung in der Datenbank.
+ **Batchgröße –** Legen Sie die maximale Anzahl von Nachrichten fest, die in einem einzelnen Batch abgerufen werden sollen bis zu 10 000. Die Standardgröße beträgt 100.
+ **Startposition –** Wählen Sie die Position im Stream aus, von der aus das Lesen von Datensätzen beginnen.
  + **Neueste –** Verarbeiten Sie Datensätze, die neu zum Stream hinzugefügt wurden. Ihre Funktion beginnt erst mit der Verarbeitung von Datensätzen, nachdem Lambda die Erstellung Ihrer Ereignisquelle abgeschlossen hat. Das bedeutet, dass einige Datensätze gelöscht werden können, bis Ihre Ereignisquelle erfolgreich erstellt wurde.
  + **Horizont trimmen** – Verarbeiten Sie alle Datensätze im Stream. Lambda verwendet die Protokollspeicherdauer Ihres Clusters, um zu bestimmen, ab wo mit dem Lesen von Ereignissen begonnen werden soll. Insbesondere beginnt Lambda mit dem Lesen von `current_time - log_retention_duration`. Ihr Änderungsstream muss bereits vor diesem Zeitstempel aktiv sein, damit Lambda alle Ereignisse korrekt lesen kann.
  + **Am Zeitstempel** – Verarbeiten Sie Datensätze ab einem bestimmten Zeitpunkt. Ihr Änderungsstream muss bereits vor dem angegebenen Zeitstempel aktiv sein, damit Lambda alle Ereignisse korrekt lesen kann.
+ **Authentifizierung –** Wählen Sie unter Authentifizierungsmethode den Zugriff auf den Broker in Ihrem Cluster aus.
  + **BASIC\$1AUTH –** Bei der Standardauthentifizierung müssen Sie den Secrets-Manager-Schlüssel angeben, der die Anmeldeinformationen für den Zugriff auf Ihren Cluster enthält.
+ **Secrets-Manager-Schlüssel** – Wählen Sie den Secrets-Manager-Schlüssel aus, der die Authentifizierungsdetails (Benutzername und Passwort) enthält, die für den Zugriff auf Ihren Amazon-DocumentDB-Cluster erforderlich sind.
+ (Optional) **Batch-Fenster** – Legen Sie die maximale Zeitspanne zur Erfassung von Datensätzen vor dem Aufruf der Funktion in Sekunden fest (bis zu 300).
+ (Optional) **Vollständige Dokumentkonfiguration** – Wählen Sie für Dokumentaktualisierungsvorgänge aus, was Sie an den Stream senden möchten. Der Standardwert ist `Default`, was bedeutet, dass Amazon DocumentDB für jedes Änderungsstream-Ereignis nur ein Delta sendet, das die vorgenommenen Änderungen beschreibt. Weitere Informationen zu diesem Feld finden Sie [FullDocument](https://mongodb.github.io/mongo-java-driver/3.9/javadoc/com/mongodb/client/model/changestream/FullDocument.html#DEFAULT)in der MongoDB Javadoc-API-Dokumentation.
  + **Standard –** Lambda sendet nur ein Teildokument, das die vorgenommenen Änderungen beschreibt.
  + **UpdateLookup**— Lambda sendet ein Delta, das die Änderungen beschreibt, zusammen mit einer Kopie des gesamten Dokuments.

## Erstellen einer Zuordnung von Ereignisquellen von Amazon DocumentDB (SDK oder CLI)
<a name="docdb-api"></a>

Um eine Zuordnung von Ereignisquellen von Amazon DocumentDB mit einem [AWS SDK](https://aws.amazon.com/developer/tools/) zu verwalten, können Sie die folgenden API-Operationen verwenden:
+ [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)
+ [ListEventSourceMappings](https://docs.aws.amazon.com/lambda/latest/api/API_ListEventSourceMappings.html)
+ [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html)
+ [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)
+ [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html)

Verwenden Sie den [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)Befehl, um die Zuordnung der AWS CLI Ereignisquelle mit dem zu erstellen. Im folgenden Beispiel wird dieser Befehl verwendet, um eine Funktion namens `my-function` einem Amazon-DocumentDB-Änderungsstream zuzuordnen. Der Ereignisquelle wird mit dem Amazon-Ressourcennamen (ARN) angegeben, mit einer Batchgröße von 500, beginnend ab dem Zeitstempel in Unix-Zeit. Der Befehl gibt auch den Secrets-Manager-Schlüssel an, den Lambda verwendet, um eine Verbindung zu Amazon DocumentDB herzustellen. Darüber hinaus enthält er `document-db-event-source-config`-Parameter, die die Datenbank und die Sammlung angeben, aus der gelesen werden soll.

```
aws lambda create-event-source-mapping --function-name my-function \
    --event-source-arn arn:aws:rds:us-west-2:123456789012:cluster:privatecluster7de2-epzcyvu4pjoy
    --batch-size 500 \
    --starting-position AT_TIMESTAMP \
    --starting-position-timestamp 1541139109 \
    --source-access-configurations '[{"Type":"BASIC_AUTH","URI":"arn:aws:secretsmanager:us-east-1:123456789012:secret:DocDBSecret-BAtjxi"}]' \
    --document-db-event-source-config '{"DatabaseName":"test_database", "CollectionName": "test_collection"}' \
```

Die Ausgabe sollte in etwa wie folgt aussehen:

```
{
    "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284",
    "BatchSize": 500,
    "DocumentDBEventSourceConfig": {
        "CollectionName": "test_collection",
        "DatabaseName": "test_database",
        "FullDocument": "Default"
    },
    "MaximumBatchingWindowInSeconds": 0,
    "EventSourceArn": "arn:aws:rds:us-west-2:123456789012:cluster:privatecluster7de2-epzcyvu4pjoy",
    "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
    "LastModified": 1541348195.412,
    "LastProcessingResult": "No records processed",
    "State": "Creating",
    "StateTransitionReason": "User action"
}
```

Nach der Erstellung können Sie den [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html)-Befehl verwenden, um die Einstellungen für Ihre Amazon-DocumentDB-Ereignisquelle zu aktualisieren. Im folgenden Beispiel werden die Batchgröße auf 1 000 und das Batchfenster auf 10 Sekunden aktualisiert. Für diesen Befehl benötigen Sie die UUID Ihrer Zuordnung von Ereignisquellen, die Sie über den `list-event-source-mapping`-Befehl oder die Lambda-Konsole abrufen können.

```
aws lambda update-event-source-mapping --function-name my-function \
    --uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
    --batch-size 1000 \
    --batch-window 10
```

Die Ausgabe sollte in etwa wie folgt aussehen:

```
{
    "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284",
    "BatchSize": 500,
    "DocumentDBEventSourceConfig": {
        "CollectionName": "test_collection",
        "DatabaseName": "test_database",
        "FullDocument": "Default"
    },
    "MaximumBatchingWindowInSeconds": 0,
    "EventSourceArn": "arn:aws:rds:us-west-2:123456789012:cluster:privatecluster7de2-epzcyvu4pjoy",
    "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
    "LastModified": 1541359182.919,
    "LastProcessingResult": "OK",
    "State": "Updating",
    "StateTransitionReason": "User action"
}
```

Da Lambda die Einstellungen asynchron aktualisiert, werden Sie diese Änderungen möglicherweise erst nach Abschluss des Vorgangs in der Ausgabe sehen. Verwenden Sie den [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-event-source-mapping.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-event-source-mapping.html)-Befehl, um die aktuellen Einstellungen Ihrer Zuordnung von Ereignisquellen anzuzeigen.

```
aws lambda get-event-source-mapping --uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b
```

Die Ausgabe sollte in etwa wie folgt aussehen:

```
{
    "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284",
    "DocumentDBEventSourceConfig": {
        "CollectionName": "test_collection",
        "DatabaseName": "test_database",
        "FullDocument": "Default"
    },
    "BatchSize": 1000,
    "MaximumBatchingWindowInSeconds": 10,
    "EventSourceArn": "arn:aws:rds:us-west-2:123456789012:cluster:privatecluster7de2-epzcyvu4pjoy",
    "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
    "LastModified": 1541359182.919,
    "LastProcessingResult": "OK",
    "State": "Enabled",
    "StateTransitionReason": "User action"
}
```

Um Ihre Zuordnung von Ereignisquellen von Amazon DocumentDB zu löschen, verwenden Sie den [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/delete-event-source-mapping.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/delete-event-source-mapping.html)-Befehl.

```
aws lambda delete-event-source-mapping \
    --uuid 2b733gdc-8ac3-cdf5-af3a-1827b3b11284
```

## Startpositionen für Abfragen und Streams
<a name="docdb-stream-polling"></a>

Beachten Sie, dass die Stream-Abfrage bei der Erstellung und Aktualisierung der Zuordnung von Ereignisquellen letztendlich konsistent ist.
+ Bei der Erstellung der Zuordnung von Ereignisquellen kann es mehrere Minuten dauern, bis mit der Abfrage von Ereignissen aus dem Stream begonnen wird.
+ Bei Aktualisierungen der Zuordnung von Ereignisquellen kann es mehrere Minuten dauern, bis die Abfrage von Ereignissen aus dem Stream gestoppt und neu gestartet wird.

Dieses Verhalten bedeutet, dass, wenn Sie `LATEST` als Startposition für den Stream angeben, die Zuordnung von Ereignisquellen bei der Erstellung oder Aktualisierung möglicherweise Ereignisse übersieht. Um sicherzustellen, dass keine Ereignisse übersehen werden, geben Sie die Startposition des Streams als `TRIM_HORIZON` oder `AT_TIMESTAMP` an.

## Überwachen Ihrer Amazon-DocumentDB-Ereignisquelle
<a name="docdb-monitoring"></a>

Um Sie bei der Überwachung Ihrer Amazon-DocumentDB-Ereignisquelle zu unterstützen, gibt Lambda die Metrik `IteratorAge` aus, wenn die Funktion das Verarbeiten von Datensätzen abgeschlossen hat. Das *Iterator-Alter* ist der Unterschied zwischen dem Zeitstempel des letzten Ereignisses und dem aktuellen Zeitstempel. Im Wesentlichen gibt die Metrik `IteratorAge` an, wie alt der letzte Datensatz im Batch bei Fertigstellung der Verarbeitung war. Wenn Ihre Funktion derzeit neue Ereignisse verarbeitet, können Sie mit dem Iterator-Alter die Latenz zwischen dem Zeitpunkt, zu dem ein Datensatz hinzugefügt wird, und dem Zeitpunkt, zu dem die Funktion verarbeitet wird, schätzen. Eine ansteigende Tendenz bei `IteratorAge` kann auf Probleme mit Ihrer Funktion hindeuten. Weitere Informationen finden Sie unter [Verwendung von CloudWatch-Metriken mit Lambda](monitoring-metrics.md).

Amazon DocumentDB-Change-Streams sind nicht für die Bewältigung großer Zeitlücken zwischen Ereignissen optimiert. Wenn Ihre Amazon DocumentDB-Ereignisquelle über einen längeren Zeitraum keine Ereignisse empfängt, kann Lambda die Zuordnung von Ereignisquellen deaktivieren. Die Dauer dieses Zeitraums kann je nach Größe des Clusters und anderen Workloads zwischen einigen Wochen und einigen Monaten variieren.

Lambda unterstützt Nutzlasten von bis zu 6 MB. Änderungsstream-Ereignisse von Amazon DocumentDB können jedoch bis zu 16 MB groß sein. Wenn Ihr Änderungsstream versucht, Lambda ein Änderungsstream-Ereignis zu senden, das größer als 6 MB ist, löscht Lambda die Nachricht und gibt die Metrik `OversizedRecordCount` aus. Lambda gibt alle Metriken auf die bestmögliche Weise aus.

# Tutorial: Verwendung AWS Lambda mit Amazon DocumentDB DocumentDB-Streams
<a name="with-documentdb-tutorial"></a>

 In diesem Tutorial erstellen Sie eine einfache Lambda-Funktion, die Ereignisse aus einem Amazon DocumentDB (mit MongoDB-Kompatibilität) Change-Stream konsumiert. Um dieses Tutorial abzuschließen, werden Sie die folgenden Phasen durchlaufen: 
+ Richten Sie Ihren Amazon-DocumentDB-Cluster ein, stellen Sie eine Verbindung zu ihm her und aktivieren Sie Change-Streams darauf.
+ Erstellen Sie Ihre Lambda-Funktion und konfigurieren Sie Ihren Amazon-DocumentDB-Cluster als Ereignisquelle für Ihre Funktion.
+ Testen Sie die Einrichtung, indem Sie Elemente in Ihre Amazon-DocumentDB-Datenbank einfügen.

## Erstellen Sie den Amazon DocumentDB-Cluster
<a name="docdb-documentdb-cluster"></a>

1. Öffnen Sie die [Amazon DocumentDB-Konsole](https://console.aws.amazon.com/docdb/home#). Wählen Sie unter **Cluster** die Option **Erstellen** aus.

1. Erstellen Sie einen Cluster mit der folgenden Konfiguration:
   + Wählen Sie als **Cluster-Typ** die Option **Instance-basierter Cluster** aus. Dies ist die Standardoption.
   + Stellen Sie sicher, dass unter **Clusterkonfiguration** die **Engine-Version** 5.0.0 ausgewählt ist. Dies ist die Standardoption.
   + Unter **Instance-Konfiguration**:
     + Wählen Sie für **DB-Instance-Klasse** die Option **Speicheroptimierte Klassen** aus. Dies ist die Standardoption.
     + Wählen Sie für **Anzahl der regulären Replikat-Instances** den Wert 1 aus.
     + Verwenden Sie für **Instance-Klasse** die Standardauswahl.
   + Geben Sie unter **Authentifizierung** einen Benutzernamen für den Hauptbenutzer ein und wählen Sie dann **Selbstverwaltet** aus. Geben Sie ein Passwort ein und bestätigen Sie es.
   + Behalten Sie die alle Standardeinstellung bei.

1. Wählen Sie **Cluster erstellen**.

## Erstellen des Secrets in Secrets Manager
<a name="docdb-secret-in-secrets-manager"></a>

Während Amazon DocumentDB Ihren Cluster erstellt, erstellen Sie ein AWS Secrets Manager Geheimnis, um Ihre Datenbankanmeldedaten zu speichern. Sie geben diesen geheimen Schlüssel an, wenn Sie in einem späteren Schritt die Zuordnung von Ereignisquellen in Lambda erstellen.

**Um das Secret in Secrets Manager zu erstellen**

1. Öffnen Sie die [Secrets-Manager-Konsole](https://console.aws.amazon.com/secretsmanager/home#) und wählen Sie **Neues Secret speichern**.

1. Wählen Sie für **Secret-Typ auswählen** eine der folgenden Optionen aus:
   + Unter **Grundlegende Details**:
     + **Secret-Typ**: Anmeldeinformationen für die Amazon-DocumentDB-Datenbank
     + Geben Sie unter **Anmeldeinformationen** den Benutzernamen und das Passwort ein, den bzw. das Sie zum Erstellen Ihres Amazon-DocumentDB-Clusters verwendet haben.
     + **Datenbank**: Wählen Sie Ihren Amazon DocumentDB-Cluster aus.
     + Wählen Sie **Weiter** aus.

1. Wählen Sie unter **Secret konfigurieen** eine der folgenden Optionen aus:
   + **Geheimer Name:** `DocumentDBSecret`
   + Wählen Sie **Weiter** aus.

1. Wählen Sie **Weiter** aus.

1. Wählen Sie **Store** (Speichern) aus.

1. Aktualisieren Sie die Konsole, um zu überprüfen, ob Sie das `DocumentDBSecret`-Secret erfolgreich gespeichert haben.

Notieren Sie sich den **geheimen ARN**. Sie werden es in einem späteren Schritt noch benötigen.

## Verbinden mit dem Cluster
<a name="docdb-connect-to-cluster"></a>

**Connect zu Ihrem Amazon DocumentDB-Cluster her mit AWS CloudShell**

1. Suchen Sie in der Amazon-DocumentDB-Verwaltungskonsole unter **Cluster** den von Ihnen erstellten Cluster. Wählen Sie Ihren Cluster aus, indem Sie das Kontrollkästchen daneben aktivieren.

1. Wählen Sie **Mit Cluster verbinden** aus. Der **Befehlsbildschirm CloudShell Ausführen** wird angezeigt.

1. Geben Sie im Feld **Neuer Umgebungsname** einen eindeutigen Namen ein, z. B. „Test“, und wählen Sie **Erstellen und ausführen** aus.

1. Geben Sie bei der Aufforderung Ihr Passwort ein. Wenn der Prompt zu `rs0 [direct: primary] <env-name>>` wechselt, sind Sie erfolgreich mit Ihrem Amazon-DocumentDB-Cluster verbunden.

## Change-Streams aktivieren
<a name="docdb-activate-change-streams"></a>

In diesem Tutorial verfolgen Sie Änderungen an der `products`-Sammlung der `docdbdemo`-Datenbank in Ihrem Amazon DocumentDB-Cluster. Sie tun dies, indem Sie [Change-Streams](https://docs.aws.amazon.com/documentdb/latest/developerguide/change_streams.html) aktivieren.

**Um eine neue Datenbank in Ihrem Cluster zu erstellen**

1. Führen Sie den folgenden Befehl aus, um eine neue Datenbank mit dem Namen `docdbdemo` zu erstellen:

   ```
   use docdbdemo
   ```

1. Geben Sie im Terminalfenster den folgenden Befehl ein, um einen Datensatz in `docdbdemo` einzufügen:

   ```
   db.products.insertOne({"hello":"world"})
   ```

   Sie sollten eine Ausgabe wie die Folgende sehen:

   ```
   {
     acknowledged: true,
     insertedId: ObjectId('67f85066ca526410fd531d59')
   }
   ```

1. Dann aktivieren Sie mit dem folgenden Befehl Change-Streams für die `products`-Sammlung der `docdbdemo`-Datenbank:

   ```
   db.adminCommand({modifyChangeStreams: 1,
       database: "docdbdemo",
       collection: "products", 
       enable: true});
   ```

    Die Ausgabe sollte in etwa wie folgt aussehen: 

   ```
   { "ok" : 1, "operationTime" : Timestamp(1680126165, 1) }
   ```

## Schnittstellen-VPC-Endpunkte erstellen
<a name="docdb-create-interface-vpc-endpoints"></a>

Erstellen Sie als Nächstes [Schnittstellen-VPC-Endpunkte](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws), um sicherzustellen, dass Lambda und Secrets Manager (der später zum Speichern unserer Cluster-Anmeldeinformationen verwendet wird) eine Verbindung zu Ihrer Standard-VPC herstellen können.

**Um Schnittstellen-VPC-Endpunkte zu erstellen**

1. Öffnen Sie die [VPC;-Konsole](https://console.aws.amazon.com/vpc/home#). Wählen Sie im linken Menü unter **Virtual Private Cloud** die Option **Endpunkte** aus.

1. Wählen Sie **Endpunkt erstellen** aus. Erstellen Sie einen Endpunkt mit der folgenden Konfiguration:
   + Geben Sie für **Name Tag** `lambda-default-vpc` ein.
   + Wählen Sie als **Dienstkategorie** die Option AWS Dienste aus.
   + Geben Sie unter **Services** `lambda` in das Suchfeld ein. Wählen Sie den Service im Format `com.amazonaws.<region>.lambda`.
   + Wählen Sie für **VPC** die VPC aus, in der sich Ihr Amazon-DocumentDB-Cluster befindet. Dies ist in der Regel die [Standard-VPC](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html).
   + Aktivieren Sie für **Subnetze** die Kästchen neben jeder Availability Zone. Wählen Sie die richtige Subnetz-ID für jede Availability Zone.
   + Wählen Sie als **IP-Adresstyp** die Option aus IPv4.
   + Wählen Sie für **Sicherheitsgruppen** die Sicherheitsgruppe aus, die Ihr Amazon-DocumentDB-Cluster verwendet. Dies ist in der Regel die `default`-Sicherheitsgruppe.
   + Behalten Sie die alle Standardeinstellung bei.
   + Wählen Sie **Endpunkt erstellen** aus.

1. Wählen Sie erneut **Endpunkt erstellen**. Erstellen Sie einen Endpunkt mit der folgenden Konfiguration:
   + Geben Sie für **Name Tag** `secretsmanager-default-vpc` ein.
   + Wählen Sie als **Dienstkategorie** die Option AWS Dienste aus.
   + Geben Sie unter **Services** `secretsmanager` in das Suchfeld ein. Wählen Sie den Service im Format `com.amazonaws.<region>.secretsmanager`.
   + Wählen Sie für **VPC** die VPC aus, in der sich Ihr Amazon-DocumentDB-Cluster befindet. Dies ist in der Regel die [Standard-VPC](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html).
   + Aktivieren Sie für **Subnetze** die Kästchen neben jeder Availability Zone. Wählen Sie die richtige Subnetz-ID für jede Availability Zone.
   + Wählen Sie als **IP-Adresstyp** die Option aus IPv4.
   + Wählen Sie für **Sicherheitsgruppen** die Sicherheitsgruppe aus, die Ihr Amazon-DocumentDB-Cluster verwendet. Dies ist in der Regel die `default`-Sicherheitsgruppe.
   + Behalten Sie die alle Standardeinstellung bei.
   + Wählen Sie **Endpunkt erstellen** aus.

 Damit ist der Abschnitt zur Einrichtung eines Clusters in diesem Tutorial abgeschlossen. 

## Erstellen der Ausführungsrolle
<a name="docdb-create-the-execution-role"></a>

 In den nächsten Schritten erstellen Sie Ihre Lambda-Funktion. Zunächst müssen Sie die Ausführungsrolle erstellen, die Ihrer Funktion die Berechtigung zum Zugriff auf Ihren Cluster gibt. Dazu erstellen Sie zunächst eine IAM-Richtlinie und verknüpfen diese dann mit einer IAM-Rolle. 

**So erstellen Sie eine IAM-Richtlinie**

1. Öffnen Sie in der IAM-Konsole die Seite [Richtlinien](https://console.aws.amazon.com/iam/home#/policies) und wählen Sie dann **Richtlinie erstellen** aus.

1. Wählen Sie den Tab **JSON**. Ersetzen Sie in der folgenden Richtlinie den ARN der Secrets-Manager-Ressource in der letzten Zeile der Anweisung durch Ihren geheimen ARN von zuvor, und kopieren Sie die Richtlinie in den Editor.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "LambdaESMNetworkingAccess",
               "Effect": "Allow",
               "Action": [
                   "ec2:CreateNetworkInterface",
                   "ec2:DescribeNetworkInterfaces",
                   "ec2:DescribeVpcs",
                   "ec2:DeleteNetworkInterface",
                   "ec2:DescribeSubnets",
                   "ec2:DescribeSecurityGroups",
                   "kms:Decrypt"
               ],
               "Resource": "*"
           },
           {
               "Sid": "LambdaDocDBESMAccess",
               "Effect": "Allow",
               "Action": [
                   "rds:DescribeDBClusters",
                   "rds:DescribeDBClusterParameters",
                   "rds:DescribeDBSubnetGroups"
               ],
               "Resource": "*"
           },
           {
               "Sid": "LambdaDocDBESMGetSecretValueAccess",
               "Effect": "Allow",
               "Action": [
                   "secretsmanager:GetSecretValue"
               ],
               "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:DocumentDBSecret"
           }
       ]
   }
   ```

------

1. Wählen Sie **Weiter: Tags** und dann **Weiter: Prüfen** aus.

1. Geben Sie unter **Name** `AWSDocumentDBLambdaPolicy` ein.

1. Wählen Sie **Richtlinie erstellen** aus.

**So erstellen Sie die IAM-Rolle**

1. Öffnen Sie die Seite [Rollen](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole und wählen Sie **Rolle erstellen**.

1. Wählen Sie für **Vertrauenswürdige Entität auswählen** die folgenden Optionen:
   + **Typ der vertrauenswürdigen Entität**: AWS Dienst
   + **Service oder Anwendungsfall**: Lambda
   + Wählen Sie **Weiter** aus.

1. Wählen **Sie für Berechtigungen hinzufügen** die `AWSDocumentDBLambdaPolicy` Richtlinie aus, die Sie gerade erstellt haben, sowie die, `AWSLambdaBasicExecutionRole` um Ihrer Funktion Berechtigungen zum Schreiben in Amazon CloudWatch Logs zu erteilen.

1. Wählen Sie **Weiter** aus.

1. Geben Sie für **Role name (Rollenname)** den Namen `AWSDocumentDBLambdaExecutionRole` ein.

1. Wählen Sie **Rolle erstellen** aus.

## So erstellen Sie die Lambda-Funktion:
<a name="docdb-create-the-lambda-function"></a>

Dieses Tutorial verwendet die Python 3.14-Laufzeit, aber wir haben auch Beispielcodedateien für andere Laufzeiten bereitgestellt. Sie können die Registerkarte im folgenden Feld auswählen, um den Code für die gewünschte Laufzeit anzusehen.

Der Code empfängt eine Amazon-DocumentDB-Ereigniseingabe und verarbeitet die darin enthaltene Nachricht.

**So erstellen Sie die Lambda-Funktion:**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie **Funktion erstellen**.

1. Wählen Sie **Ohne Vorgabe erstellen** aus.

1. Führen Sie unter **Basic information** (Grundlegende Informationen) die folgenden Schritte aus:

   1. Geben Sie unter **Funktionsname** `ProcessDocumentDBRecords` ein.

   1. Wählen Sie für **Runtime** **Python 3.14**.

   1. Wählen Sie für **Architektur** **x86\$164** aus.

1. Gehen Sie auf der Registerkarte **Standard-Ausführungsrolle ändern** wie folgt vor:

   1. Erweitern Sie die Registerkarte und wählen Sie dann **Verwenden einer vorhandenen Rolle** aus.

   1. Wählen Sie die zuvor erstellte `AWSDocumentDBLambdaExecutionRole` aus.

1. Wählen Sie **Funktion erstellen**.

**So stellen Sie den Funktionscode bereit**

1. Wählen Sie im folgenden Feld die Registerkarte **Python** und kopieren Sie den Code.

------
#### [ .NET ]

**SDK für .NET**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Nutzen eines Amazon DocumentDB-Ereignisses mit Lambda unter Verwendung von .NET.  

   ```
   using Amazon.Lambda.Core;
   using System.Text.Json;
   using System;
   using System.Collections.Generic;
   using System.Text.Json.Serialization;
   //Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
   [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
   
   namespace LambdaDocDb;
   
   public class Function
   {
       
        /// <summary>
       /// Lambda function entry point to process Amazon DocumentDB events.
       /// </summary>
       /// <param name="event">The Amazon DocumentDB event.</param>
       /// <param name="context">The Lambda context object.</param>
       /// <returns>A string to indicate successful processing.</returns>
       public string FunctionHandler(Event evnt, ILambdaContext context)
       {
           
           foreach (var record in evnt.Events)
           {
               ProcessDocumentDBEvent(record, context);
           }
   
           return "OK";
       }
   
        private void ProcessDocumentDBEvent(DocumentDBEventRecord record, ILambdaContext context)
       {
           
           var eventData = record.Event;
           var operationType = eventData.OperationType;
           var databaseName = eventData.Ns.Db;
           var collectionName = eventData.Ns.Coll;
           var fullDocument = JsonSerializer.Serialize(eventData.FullDocument, new JsonSerializerOptions { WriteIndented = true });
   
           context.Logger.LogLine($"Operation type: {operationType}");
           context.Logger.LogLine($"Database: {databaseName}");
           context.Logger.LogLine($"Collection: {collectionName}");
           context.Logger.LogLine($"Full document:\n{fullDocument}");
       }
   
   
   
       public class Event
       {
           [JsonPropertyName("eventSourceArn")]
           public string EventSourceArn { get; set; }
   
           [JsonPropertyName("events")]
           public List<DocumentDBEventRecord> Events { get; set; }
   
           [JsonPropertyName("eventSource")]
           public string EventSource { get; set; }
       }
   
       public class DocumentDBEventRecord
       {
           [JsonPropertyName("event")]
           public EventData Event { get; set; }
       }
   
       public class EventData
       {
           [JsonPropertyName("_id")]
           public IdData Id { get; set; }
   
           [JsonPropertyName("clusterTime")]
           public ClusterTime ClusterTime { get; set; }
   
           [JsonPropertyName("documentKey")]
           public DocumentKey DocumentKey { get; set; }
   
           [JsonPropertyName("fullDocument")]
           public Dictionary<string, object> FullDocument { get; set; }
   
           [JsonPropertyName("ns")]
           public Namespace Ns { get; set; }
   
           [JsonPropertyName("operationType")]
           public string OperationType { get; set; }
       }
   
       public class IdData
       {
           [JsonPropertyName("_data")]
           public string Data { get; set; }
       }
   
       public class ClusterTime
       {
           [JsonPropertyName("$timestamp")]
           public Timestamp Timestamp { get; set; }
       }
   
       public class Timestamp
       {
           [JsonPropertyName("t")]
           public long T { get; set; }
   
           [JsonPropertyName("i")]
           public int I { get; set; }
       }
   
       public class DocumentKey
       {
           [JsonPropertyName("_id")]
           public Id Id { get; set; }
       }
   
       public class Id
       {
           [JsonPropertyName("$oid")]
           public string Oid { get; set; }
       }
   
       public class Namespace
       {
           [JsonPropertyName("db")]
           public string Db { get; set; }
   
           [JsonPropertyName("coll")]
           public string Coll { get; set; }
       }
   }
   ```

------
#### [ Go ]

**SDK für Go V2**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Nutzen eines Amazon DocumentDB-Ereignisses mit Lambda unter Verwendung von Go.  

   ```
   package main
   
   import (
   	"context"
   	"encoding/json"
   	"fmt"
   
   	"github.com/aws/aws-lambda-go/lambda"
   )
   
   type Event struct {
   	Events []Record `json:"events"`
   }
   
   type Record struct {
   	Event struct {
   		OperationType string `json:"operationType"`
   		NS            struct {
   			DB   string `json:"db"`
   			Coll string `json:"coll"`
   		} `json:"ns"`
   		FullDocument interface{} `json:"fullDocument"`
   	} `json:"event"`
   }
   
   func main() {
   	lambda.Start(handler)
   }
   
   func handler(ctx context.Context, event Event) (string, error) {
   	fmt.Println("Loading function")
   	for _, record := range event.Events {
   		logDocumentDBEvent(record)
   	}
   
   	return "OK", nil
   }
   
   func logDocumentDBEvent(record Record) {
   	fmt.Printf("Operation type: %s\n", record.Event.OperationType)
   	fmt.Printf("db: %s\n", record.Event.NS.DB)
   	fmt.Printf("collection: %s\n", record.Event.NS.Coll)
   	docBytes, _ := json.MarshalIndent(record.Event.FullDocument, "", "  ")
   	fmt.Printf("Full document: %s\n", string(docBytes))
   }
   ```

------
#### [ Java ]

**SDK für Java 2.x**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Nutzen eines Amazon DocumentDB-Ereignisses mit Lambda unter Verwendung von Java.  

   ```
   import java.util.List;
   import java.util.Map;
   
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   
   public class Example implements RequestHandler<Map<String, Object>, String> {
   
       @SuppressWarnings("unchecked")
       @Override
       public String handleRequest(Map<String, Object> event, Context context) {
           List<Map<String, Object>> events = (List<Map<String, Object>>) event.get("events");
           for (Map<String, Object> record : events) {
               Map<String, Object> eventData = (Map<String, Object>) record.get("event");
               processEventData(eventData);
           }
   
           return "OK";
       }
   
       @SuppressWarnings("unchecked")
       private void processEventData(Map<String, Object> eventData) {
           String operationType = (String) eventData.get("operationType");
           System.out.println("operationType: %s".formatted(operationType));
   
           Map<String, Object> ns = (Map<String, Object>) eventData.get("ns");
   
           String db = (String) ns.get("db");
           System.out.println("db: %s".formatted(db));
           String coll = (String) ns.get("coll");
           System.out.println("coll: %s".formatted(coll));
   
           Map<String, Object> fullDocument = (Map<String, Object>) eventData.get("fullDocument");
           System.out.println("fullDocument: %s".formatted(fullDocument));
       }
   
   }
   ```

------
#### [ JavaScript ]

**SDK für JavaScript (v3)**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Verwenden eines Amazon DocumentDB DocumentDB-Ereignisses mit Lambda. JavaScript  

   ```
   console.log('Loading function');
   exports.handler = async (event, context) => {
       event.events.forEach(record => {
           logDocumentDBEvent(record);
       });
       return 'OK';
   };
   
   const logDocumentDBEvent = (record) => {
       console.log('Operation type: ' + record.event.operationType);
       console.log('db: ' + record.event.ns.db);
       console.log('collection: ' + record.event.ns.coll);
       console.log('Full document:', JSON.stringify(record.event.fullDocument, null, 2));
   };
   ```
Ein Amazon DocumentDB DocumentDB-Ereignis mit Lambda verwenden TypeScript  

   ```
   import { DocumentDBEventRecord, DocumentDBEventSubscriptionContext } from 'aws-lambda';
   
   console.log('Loading function');
   
   export const handler = async (
     event: DocumentDBEventSubscriptionContext,
     context: any
   ): Promise<string> => {
     event.events.forEach((record: DocumentDBEventRecord) => {
       logDocumentDBEvent(record);
     });
     return 'OK';
   };
   
   const logDocumentDBEvent = (record: DocumentDBEventRecord): void => {
     console.log('Operation type: ' + record.event.operationType);
     console.log('db: ' + record.event.ns.db);
     console.log('collection: ' + record.event.ns.coll);
     console.log('Full document:', JSON.stringify(record.event.fullDocument, null, 2));
   };
   ```

------
#### [ PHP ]

**SDK für PHP**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Nutzen eines Amazon DocumentDB-Ereignisses mit Lambda unter Verwendung von PHP.  

   ```
   <?php
   
   require __DIR__.'/vendor/autoload.php';
   
   use Bref\Context\Context;
   use Bref\Event\Handler;
   
   class DocumentDBEventHandler implements Handler
   {
       public function handle($event, Context $context): string
       {
   
           $events = $event['events'] ?? [];
           foreach ($events as $record) {
               $this->logDocumentDBEvent($record['event']);
           }
           return 'OK';
       }
   
       private function logDocumentDBEvent($event): void
       {
           // Extract information from the event record
   
           $operationType = $event['operationType'] ?? 'Unknown';
           $db = $event['ns']['db'] ?? 'Unknown';
           $collection = $event['ns']['coll'] ?? 'Unknown';
           $fullDocument = $event['fullDocument'] ?? [];
   
           // Log the event details
   
           echo "Operation type: $operationType\n";
           echo "Database: $db\n";
           echo "Collection: $collection\n";
           echo "Full document: " . json_encode($fullDocument, JSON_PRETTY_PRINT) . "\n";
       }
   }
   return new DocumentDBEventHandler();
   ```

------
#### [ Python ]

**SDK für Python (Boto3)**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Nutzen eines Amazon DocumentDB-Ereignisses mit Lambda unter Verwendung von Python.  

   ```
   import json
   
   def lambda_handler(event, context):
       for record in event.get('events', []):
           log_document_db_event(record)
       return 'OK'
   
   def log_document_db_event(record):
       event_data = record.get('event', {})
       operation_type = event_data.get('operationType', 'Unknown')
       db = event_data.get('ns', {}).get('db', 'Unknown')
       collection = event_data.get('ns', {}).get('coll', 'Unknown')
       full_document = event_data.get('fullDocument', {})
   
       print(f"Operation type: {operation_type}")
       print(f"db: {db}")
       print(f"collection: {collection}")
       print("Full document:", json.dumps(full_document, indent=2))
   ```

------
#### [ Ruby ]

**SDK für Ruby**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Nutzen eines Amazon DocumentDB-Ereignisses mit Lambda unter Verwendung von Ruby.  

   ```
   require 'json'
   
   def lambda_handler(event:, context:)
     event['events'].each do |record|
       log_document_db_event(record)
     end
     'OK'
   end
   
   def log_document_db_event(record)
     event_data = record['event'] || {}
     operation_type = event_data['operationType'] || 'Unknown'
     db = event_data.dig('ns', 'db') || 'Unknown'
     collection = event_data.dig('ns', 'coll') || 'Unknown'
     full_document = event_data['fullDocument'] || {}
   
     puts "Operation type: #{operation_type}"
     puts "db: #{db}"
     puts "collection: #{collection}"
     puts "Full document: #{JSON.pretty_generate(full_document)}"
   end
   ```

------
#### [ Rust ]

**SDK für Rust**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Nutzen eines Amazon DocumentDB-Ereignisses mit Lambda unter Verwendung von Rust.  

   ```
   use lambda_runtime::{service_fn, tracing, Error, LambdaEvent};
   use aws_lambda_events::{
       event::documentdb::{DocumentDbEvent, DocumentDbInnerEvent},
      };
   
   
   // Built with the following dependencies:
   //lambda_runtime = "0.11.1"
   //serde_json = "1.0"
   //tokio = { version = "1", features = ["macros"] }
   //tracing = { version = "0.1", features = ["log"] }
   //tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] }
   //aws_lambda_events = "0.15.0"
   
   async fn function_handler(event: LambdaEvent<DocumentDbEvent>) ->Result<(), Error> {
       
       tracing::info!("Event Source ARN: {:?}", event.payload.event_source_arn);
       tracing::info!("Event Source: {:?}", event.payload.event_source);
     
       let records = &event.payload.events;
      
       if records.is_empty() {
           tracing::info!("No records found. Exiting.");
           return Ok(());
       }
   
       for record in records{
           log_document_db_event(record);
       }
   
       tracing::info!("Document db records processed");
   
       // Prepare the response
       Ok(())
   
   }
   
   fn log_document_db_event(record: &DocumentDbInnerEvent)-> Result<(), Error>{
       tracing::info!("Change Event: {:?}", record.event);
       
       Ok(())
   
   }
   
   #[tokio::main]
   async fn main() -> Result<(), Error> {
       tracing_subscriber::fmt()
       .with_max_level(tracing::Level::INFO)
       .with_target(false)
       .without_time()
       .init();
   
       let func = service_fn(function_handler);
       lambda_runtime::run(func).await?;
       Ok(())
       
   }
   ```

------

1. Fügen Sie den Code im **Code-Quell**bereich der Lambda-Konsole in den Code-Editor ein und ersetzen Sie dabei den von Lambda erstellten Code.

1. Wählen Sie im Abschnitt **DEPLOY** die Option **Deploy** aus, um den Code Ihrer Funktion zu aktualisieren:  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

## Erstellen Sie die Zuordnung von Ereignisquellen in Lambda
<a name="docdb-create-the-lambda-event-source-mapping"></a>

 Erstellen Sie die Zuordnung von Ereignisquellen, die Ihren Amazon DocumentDB-Change-Stream mit Ihrer Lambda-Funktion verknüpft. Nachdem Sie diese Ereignisquellenzuordnung erstellt haben, wird AWS Lambda sofort mit der Abfrage des Streams begonnen. 

**Die Zuordnung von Ereignisquellen erstellen**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) in der Lambda-Konsole.

1. Wählen Sie die `ProcessDocumentDBRecords`-Funktion aus, die Sie zuvor erstellt haben.

1. Wählen Sie die Registerkarte **Konfiguration** und dann im linken Menü die Option **Auslöser** aus.

1. Wählen Sie **Add trigger**.

1. Wählen Sie unter **Trigger-Konfiguration** als Quelle die Option **Amazon DocumentDB** aus.

1. Erstellen Sie die Zuordnung von Ereignisquellen mit der folgenden Konfiguration:
   + **Amazon-DocumentDB-Cluster**: Wählen Sie den Cluster aus, den Sie zuvor erstellt haben.
   + **Datenbankname**: docdbdemo
   + **Name der Kollektion**:Produkte
   + **Chargengröße**: 1
   + **Startposition**: Neueste
   + **Authentifizierung**: BASIC\$1AUTH
   + **Secrets-Manager-Schlüssel**: Wählen Sie das Secret für Ihren Amazon-DocumentDB-Cluster aus. Der Name ist ähnlich wie `rds!cluster-12345678-a6f0-52c0-b290-db4aga89274f`.
   + **Batchfenster**: 1
   + **Vollständige Konfiguration des Dokuments**: UpdateLookup

1. Wählen Sie **Hinzufügen** aus. Die Erstellung Ihrer Zuordnung von Ereignisquellen kann einige Minuten dauern.

## Testen der -Funktion
<a name="docdb-test-insert"></a>

Warten Sie, bis die Zuordnung von Ereignisquellen den Status **Aktiviert** erreicht hat. Dies kann mehrere Minuten dauern. Testen Sie dann das end-to-end Setup, indem Sie Datenbankeinträge einfügen, aktualisieren und löschen. Bevor Sie beginnen:

1. [Stellen Sie erneut eine Verbindung zu Ihrem Amazon DocumentDB-Cluster](#docdb-connect-to-cluster) in Ihrer CloudShell Umgebung her.

1. Führen Sie den folgenden Befehl aus, um sicherzustellen, dass Sie die `docdbdemo`-Datenbank verwenden:

   ```
   use docdbdemo
   ```

### Einfügen eines Datensatzes
<a name="docdb-test-insert"></a>

Fügen Sie einen Datensatz in die `products`-Sammlung der `docdbdemo`-Datenbank ein:

```
db.products.insertOne({"name":"Pencil", "price": 1.00})
```

[Überprüfen Sie anhand von Logs, ob Ihre Funktion dieses Ereignis erfolgreich verarbeitet hat. CloudWatch ](monitoring-cloudwatchlogs-view.md#monitoring-cloudwatchlogs-console) Sie sollten einen Protokolleintrag wie diesen sehen:

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/documentdb-insert-log.png)


### Aktualisieren von Datensätzen
<a name="docdb-test-update"></a>

Aktualisieren Sie den gerade eingefügten Datensatz mit dem folgenden Befehl:

```
db.products.updateOne(
    { "name": "Pencil" },
    { $set: { "price": 0.50 }}
)
```

Überprüfen Sie, ob Ihre Funktion dieses Ereignis erfolgreich verarbeitet hat, indem [Sie die Option CloudWatch Logs überprüfen](monitoring-cloudwatchlogs-view.md#monitoring-cloudwatchlogs-console). Sie sollten einen Protokolleintrag wie diesen sehen:

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/documentdb-update-log.png)


### Einen Datensatz löschen
<a name="docdb-test-delete"></a>

Löschen Sie den Datensatz, den Sie gerade aktualisiert haben, mit dem folgenden Befehl:

```
db.products.deleteOne( { "name": "Pencil" } )
```

Überprüfen Sie anhand von [ CloudWatch Logs](monitoring-cloudwatchlogs-view.md#monitoring-cloudwatchlogs-console), ob Ihre Funktion dieses Ereignis erfolgreich verarbeitet hat. Sie sollten einen Protokolleintrag wie diesen sehen:

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/documentdb-delete-log.png)


## Fehlerbehebung
<a name="docdb-lambda-troubleshooting"></a>

Wenn Sie in den CloudWatch Protokollen Ihrer Funktion keine Datenbankereignisse sehen, überprüfen Sie Folgendes:
+ Stellen Sie sicher, dass sich die Zuordnung von Ereignisquellen in Lambda (auch als Auslöser bezeichnet) im Status **Aktiviert** befindet. Die Zuordnung von Ereignisquellen kann mehrere Minuten in Anspruch nehmen.
+ Wenn die Zuordnung der Ereignisquellen **aktiviert** ist, Sie aber immer noch keine Datenbankereignisse sehen in CloudWatch:
  + Stellen Sie sicher, dass der **Datenbankname** in der Zuordnung von Ereignisquellen auf `docdbdemo` eingestellt ist.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/documentdb-trigger.png)
  + Überprüfen Sie das Feld **Letztes Verarbeitungsergebnis** der Zuordnung von Ereignisquellen auf die folgende Meldung: „PROBLEM: Verbindungsfehler. Ihre VPC muss eine Verbindung zu Lambda und STS sowie zu Secrets Manager herstellen können, wenn eine Authentifizierung erforderlich ist.“ Wenn diese Fehlermeldung angezeigt wird, stellen Sie sicher, dass Sie die [Lambda- und Secrets-Manager-VPC-Schnittstellenendpunkte](#docdb-create-interface-vpc-endpoints) erstellt haben und dass die Endpunkte dieselbe VPC und dieselben Subnetze verwenden wie Ihr Amazon-DocumentDB-Cluster.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/documentdb-lastprocessingresult.png)

## Bereinigen Ihrer Ressourcen
<a name="docdb-cleanup"></a>

 Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Durch das Löschen von AWS -Ressourcen, die Sie nicht mehr verwenden, können Sie verhindern, dass unnötige Gebühren in Ihrem AWS-Konto-Konto anfallen. 

**So löschen Sie die Lambda-Funktion:**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion aus, die Sie erstellt haben.

1. Wählen Sie **Aktionen**, **Löschen** aus.

1. Geben Sie **confirm** in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie die Ausführungsrolle**

1. Öffnen Sie die Seite [Roles](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie die von Ihnen erstellte Ausführungsrolle aus.

1. Wählen Sie **Löschen** aus.

1. Geben Sie den Namen der Rolle in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**Löschen von VPC-Endpunkten**

1. Öffnen Sie die [VPC;-Konsole](https://console.aws.amazon.com/vpc/home#). Wählen Sie im linken Menü unter **Virtual Private Cloud** die Option **Endpunkte** aus.

1. Wählen Sie die Endpunkte aus, die Sie erstellt haben.

1. Wählen Sie **Actions** (Aktionen), **Delete VPC Endpoint** (VPC-Endpunkte löschen).

1. Geben Sie **delete** in das Texteingabefeld ein.

1. Wählen Sie **Löschen** aus.

**So löschen Sie den Amazon DocumentDB-Cluster**

1. Öffnen Sie die [Amazon DocumentDB-Konsole](https://console.aws.amazon.com/docdb/home#).

1. Wählen Sie den Amazon DocumentDB-Cluster aus, den Sie für dieses Tutorial erstellt haben, und deaktivieren Sie den Löschschutz.

1. Wählen Sie auf der **Cluster-Hauptseite** erneut Ihren Amazon DocumentDB-Cluster aus.

1. Wählen Sie **Aktionen**, **Löschen** aus.

1. Wählen Sie für **Finalen Cluster-Snapshot erstellen** die Option **Nein** aus.

1. Geben Sie **delete** in das Texteingabefeld ein.

1. Wählen Sie **Löschen** aus.

**So löschen Sie das Secret im Secrets Manager**

1. Öffnen Sie die [Secrets Manager-Konsole](https://console.aws.amazon.com/secretsmanager/home#).

1. Wählen Sie das Secret aus, das Sie für dieses Tutorial erstellt haben.

1. Wählen Sie **Aktionen**, **Secret löschen**.

1. Wählen Sie **Schedule deletion**.

# Verwendung AWS Lambda mit Amazon DynamoDB
<a name="with-ddb"></a>

**Anmerkung**  
Wenn Sie Daten an ein anderes Ziel als eine Lambda-Funktion senden oder die Daten vor dem Senden anreichern möchten, finden Sie weitere Informationen unter [Amazon EventBridge Pipes](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html).

Sie können eine AWS Lambda Funktion verwenden, um Datensätze in einem [Amazon DynamoDB DynamoDB-Stream](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) zu verarbeiten. Mit DynamoDB Streams können Sie eine Lambda-Funktion auslösen, damit jedes Mal, wenn eine DynamoDB-Tabelle aktualisiert wird, weitere Aufgaben ausgeführt werden.

Bei der Verarbeitung von DynamoDB-Streams müssen Sie eine Logik für teilweise Batch-Antworten implementieren, um zu verhindern, dass versucht wird, erfolgreich verarbeitete Datensätze erneut zu verarbeiten, wenn einige Datensätze in einem Batch fehlschlagen. Das [Batch Processor Utility](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) von Powertools for AWS Lambda ist in Python TypeScript, .NET und Java verfügbar und vereinfacht diese Implementierung, indem es automatisch die partielle Batch-Antwortlogik verarbeitet, wodurch die Entwicklungszeit reduziert und die Zuverlässigkeit verbessert wird.

**Topics**
+ [

## Abrufen und Stapeln von Streams
](#dynamodb-polling-and-batching)
+ [

## Startpositionen für Abfragen und Streams
](#dyanmo-db-stream-poll)
+ [

## Gleichzeitige Leser eines Shard in DynamoDB Streams
](#events-dynamodb-simultaneous-readers)
+ [

## Beispielereignis
](#events-sample-dynamodb)
+ [

# DynamoDB-Datensätze mit Lambda verarbeiten
](services-dynamodb-eventsourcemapping.md)
+ [

# Konfigurieren einer teilweisen Batch-Antwort mit DynamoDB und Lambda
](services-ddb-batchfailurereporting.md)
+ [

# Verworfene Datensätze für eine DynamoDB-Ereignisquelle in Lambda aufbewahren
](services-dynamodb-errors.md)
+ [

# Implementierung der statusbehafteten DynamoDB-Stream-Verarbeitung in Lambda
](services-ddb-windows.md)
+ [

# Lambdaparameter für Amazon DynamoDB-SQS-Zuordnungen von Ereignisquellen
](services-ddb-params.md)
+ [

# Verwendung der Ereignisfilterung mit einer DynamoDB-Ereignisquelle
](with-ddb-filtering.md)
+ [

# Tutorial: Verwendung AWS Lambda mit Amazon DynamoDB DynamoDB-Streams
](with-ddb-example.md)

## Abrufen und Stapeln von Streams
<a name="dynamodb-polling-and-batching"></a>

Lambda fragt Shards in Ihrem DynamoDB-Stream nach Datensätzen bei einer Basisrate von viermal pro Sekunde ab. Sind Datensätze verfügbar, ruft Lambda Ihre Funktion auf und wartet auf das Ergebnis. Ist die Verarbeitung erfolgreich, setzt Lambda die Abrufe fort, bis es weitere Datensätze erhält.

Standardmäßig ruft Lambda Ihre Funktion auf, sobald Datensätze verfügbar sind. Wenn der Batch, den Lambda aus der Ereignisquelle liest, nur einen Datensatz enthält, sendet Lambda nur einen Datensatz an die Funktion. Damit die Funktion nicht mit einer kleinen Anzahl von Datensätzen aufgerufen wird, können Sie die Ereignisquelle anweisen, Datensätze bis zu 5 Minuten lang zu puffern, indem Sie ein *Batch-Fenster* konfigurieren. Bevor die Funktion aufgerufen wird, liest Lambda so lange Datensätze aus der Ereignisquelle, bis es einen vollständigen Batch erfasst hat, das Batch-Verarbeitungsfenster abläuft oder der Batch die Nutzlastgrenze von 6 MB erreicht. Weitere Informationen finden Sie unter [Batching-Verhalten](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

**Warnung**  
Zuordnung von Lambda-Ereignisquellen verarbeiten jedes Ereignis mindestens einmal und es kann zu einer doppelten Verarbeitung von Datensätzen kommen. Um mögliche Probleme im Zusammenhang mit doppelten Ereignissen zu vermeiden, empfehlen wir Ihnen dringend, Ihren Funktionscode idempotent zu machen. Weitere Informationen finden Sie im Knowledge Center unter [Wie mache ich meine Lambda-Funktion idempotent](https://repost.aws/knowledge-center/lambda-function-idempotent)?. AWS 

Lambda wartet mit dem Senden des nächsten zu verarbeitenden Stapels nicht, bis ggf. konfigurierte [Erweiterungen](lambda-extensions.md) abgeschlossen sind. Anders ausgedrückt: Ihre Erweiterungen werden möglicherweise weiter ausgeführt, während Lambda den nächsten Stapel von Datensätzen verarbeitet. Dies kann zu Drosselungsproblemen führen, wenn Sie gegen eine Einstellung oder gegen einen Grenzwert im Zusammenhang mit der [Parallelität](lambda-concurrency.md) Ihres Kontos verstoßen. Um zu erkennen, ob möglicherweise ein Problem vorliegt, müssen Sie Ihre Funktionen überwachen sowie überprüfen, ob für Ihre Zuordnung von Ereignisquellen unerwartet hohe [Parallelitätsmetriken](monitoring-concurrency.md#general-concurrency-metrics) vorliegen. Aufgrund der kurzen Zeit zwischen den Aufrufen kann Lambda kurzzeitig eine höhere Gleichzeitigkeitsnutzung als die Anzahl der Shards melden. Dies kann sogar für Lambda-Funktionen ohne Erweiterungen gelten.

Konfigurieren Sie die [ ParallelizationFactor](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-ParallelizationFactor)Einstellung so, dass ein Shard eines DynamoDB-Streams mit mehr als einem Lambda-Aufruf gleichzeitig verarbeitet wird. Sie können die Anzahl der gleichzeitigen Batches angeben, die Lambda von einem Shard über einen Parallelisierungsfaktor von 1 (Standard) bis 10 abfragt. Wenn `ParallelizationFactor` beispielsweise auf 2 gesetzt ist, können Sie maximal 200 gleichzeitige Lambda-Aufrufe haben, um 100 DynamoDB-Stream-Shards zu verarbeiten (in der Praxis werden womöglich andere Werte für die Metrik `ConcurrentExecutions` angezeigt). Dies hilft, den Verarbeitungsdurchsatz hochzuskalieren, wenn das Datenvolumen flüchtig ist und [IteratorAge](monitoring-metrics-types.md#performance-metrics) hoch ist. Wenn Sie die Anzahl der gleichzeitigen Stapel pro Shard erhöhen, sorgt Lambda weiterhin für eine ordnungsgemäße Verarbeitung auf der Ebene der Elemente (Partition und Sortierschlüssel).

## Startpositionen für Abfragen und Streams
<a name="dyanmo-db-stream-poll"></a>

Beachten Sie, dass die Stream-Abfrage bei der Erstellung und Aktualisierung der Zuordnung von Ereignisquellen letztendlich konsistent ist.
+ Bei der Erstellung der Zuordnung von Ereignisquellen kann es mehrere Minuten dauern, bis mit der Abfrage von Ereignissen aus dem Stream begonnen wird.
+ Bei Aktualisierungen der Zuordnung von Ereignisquellen kann es mehrere Minuten dauern, bis die Abfrage von Ereignissen aus dem Stream gestoppt und neu gestartet wird.

Dieses Verhalten bedeutet, dass, wenn Sie `LATEST` als Startposition für den Stream angeben, die Zuordnung von Ereignisquellen bei der Erstellung oder Aktualisierung möglicherweise Ereignisse übersieht. Um sicherzustellen, dass keine Ereignisse übersehen werden, geben Sie die Stream-Startposition als `TRIM_HORIZON` an.

## Gleichzeitige Leser eines Shard in DynamoDB Streams
<a name="events-dynamodb-simultaneous-readers"></a>

Für Einzelregionstabellen, bei denen es sich nicht um globale Tabellen handelt, können Sie bis zu zwei Lambda-Funktionen entwerfen, die gleichzeitig aus demselben DynamoDB-Streams-Shard lesen. Eine Überschreitung dieses Grenzwerts kann zu einer Anforderungsdrosselung führen. Für globale Tabellen empfehlen wir, die Anzahl der gleichzeitigen Funktionen auf eine zu beschränken, um eine Anforderungsdrosselung zu vermeiden.

## Beispielereignis
<a name="events-sample-dynamodb"></a>

**Example**  

```
{
  "Records": [
    {
      "eventID": "1",
      "eventVersion": "1.0",
      "dynamodb": {
        "Keys": {
          "Id": {
            "N": "101"
          }
        },
        "NewImage": {
          "Message": {
            "S": "New item!"
          },
          "Id": {
            "N": "101"
          }
        },
        "StreamViewType": "NEW_AND_OLD_IMAGES",
        "SequenceNumber": "111",
        "SizeBytes": 26
      },
      "awsRegion": "us-west-2",
      "eventName": "INSERT",
      "eventSourceARN": "arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525",
      "eventSource": "aws:dynamodb"
    },
    {
      "eventID": "2",
      "eventVersion": "1.0",
      "dynamodb": {
        "OldImage": {
          "Message": {
            "S": "New item!"
          },
          "Id": {
            "N": "101"
          }
        },
        "SequenceNumber": "222",
        "Keys": {
          "Id": {
            "N": "101"
          }
        },
        "SizeBytes": 59,
        "NewImage": {
          "Message": {
            "S": "This item has changed"
          },
          "Id": {
            "N": "101"
          }
        },
        "StreamViewType": "NEW_AND_OLD_IMAGES"
      },
      "awsRegion": "us-west-2",
      "eventName": "MODIFY",
      "eventSourceARN": "arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525",
      "eventSource": "aws:dynamodb"
    }
  ]}
```

# DynamoDB-Datensätze mit Lambda verarbeiten
<a name="services-dynamodb-eventsourcemapping"></a>

Erstellen Sie eine Ereignisquellenzuordnung, um Lambda anzuweisen, Datensätze aus Ihrem Stream an eine Lambda-Funktion zu senden. Sie können mehrere Ereignisquellen-Zuweisung erstellen, um gleiche Daten mit mehreren Lambda-Funktionen oder Elemente aus mehreren Streams mit nur einer Funktion zu verarbeiten.

Sie können Zuordnungen von Ereignisquellen konfigurieren, um Datensätze aus einem Stream in einem anderen AWS-Konto zu verarbeiten. Weitere Informationen hierzu finden Sie unter [Erstellen einer kontoübergreifenden Zuordnung von Ereignisquellen](#services-dynamodb-eventsourcemapping-cross-account).

**Um Ihre Funktion so zu konfigurieren, dass sie aus DynamoDB Streams liest, fügen Sie die AWS verwaltete [AWSLambdaDBExecutionDynamo-Rollenrichtlinie an Ihre Ausführungsrolle](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaDynamoDBExecutionRole.html) an und erstellen Sie dann einen DynamoDB-Trigger.**

**So fügen Sie Berechtigungen hinzu und erstellen einen Auslöser**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie den Namen einer Funktion aus.

1. Wählen Sie die Registerkarte **Konfiguration** und dann **Berechtigungen** aus.

1. Wählen Sie unter **Rollenname** den Link zu Ihrer Ausführungsrolle. Dieser Link öffnet die Rolle in der IAM-Konsole.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/execution-role.png)

1. Wählen Sie **Berechtigungen hinzufügen** aus und wählen Sie dann **Richtlinien direkt anhängen** aus.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/attach-policies.png)

1. Geben Sie im Suchfeld `AWSLambdaDynamoDBExecutionRole` ein. Fügen Sie diese Richtlinie zu Ihrer Ausführungsrolle hinzu. Dies ist eine AWS verwaltete Richtlinie, die die Berechtigungen enthält, die Ihre Funktion zum Lesen aus dem DynamoDB-Stream benötigt. Weitere Informationen zu dieser Richtlinie finden Sie unter [AWSLambdaDBExecutionDynamo-Rolle](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaDynamoDBExecutionRole.html) in der Referenz für *AWS verwaltete* Richtlinien.

1. Gehen Sie zurück zu Ihrer Funktion in der Lambda-Konsole. Wählen Sie unter **Function overview (Funktionsübersicht)** die Option **Add trigger (Trigger hinzufügen)**.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/add-trigger.png)

1. Wählen Sie einen Auslösertyp aus.

1. Konfigurieren Sie die erforderlichen Optionen und wählen Sie dann **Add** (Hinzufügen) aus.

Lambda unterstützt die folgenden Optionen für DynamoDB-Ereignisquellen:

**Optionen für die Ereignisquelle**
+ **DynamoDB-Tabelle** – Die DynamoDB-Tabelle, aus der Datensätze gelesen werden sollen.
+ **Batchgröße** – Die Anzahl der Datensätze, die in jedem Batch bis zu 10.000 an die Funktion gesendet werden sollen. Lambda übergibt alle Datensätze im Batch in einem einzigen Aufruf an die Funktion, solange die Gesamtgröße der Ereignisse nicht das [Nutzlast-Limit](gettingstarted-limits.md) für synchrone Aufrufe überschreitet (6 MB).
+ **Batchfenster** – Geben Sie die maximale Zeitspanne zur Erfassung von Datensätzen vor dem Aufruf der Funktion in Sekunden an.
+ **Startposition** – Verarbeiten Sie nur neue Datensätze oder alle vorhandenen Datensätze.
  + **Neueste** – Verarbeiten Sie Datensätze, die neu zum Stream hinzugefügt wurden.
  + **Horizont trimmen** – Verarbeiten Sie alle Datensätze im Stream.

  Nach der Verarbeitung aller vorhandenen Datensätze hat die Funktion aufgeholt und setzt die Verarbeitung neuer Datensätze fort.
+ **On-failure destination (Ziel bei Ausfall)** – Eine SQS-Warteschlange oder ein SNS-Thema für Datensätze, die nicht verarbeitet werden können. Wenn Lambda einen Datensatz-Batch verwirft, weil er zu alt ist oder alle Wiederholungen erschöpft hat, sendet es Details zum Batch an die Warteschlange oder das Thema.
+ **Wiederholungsversuche** – Die maximale Anzahl von Wiederholungen von Lambda, wenn die Funktion einen Fehler zurückgibt. Dies gilt nicht für Servicefehler oder Drosselungen, bei denen der Batch die Funktion nicht erreicht hat.
+ **Höchstalter des Datensatzes** – Das maximale Alter eines Datensatzes, den Lambda an Ihre Funktion sendet.
+ **Batch bei Fehler aufteilen** – Wenn die Funktion einen Fehler zurückgibt, teilen Sie den Batch vor dem erneuten Versuch in zwei Teile. Ihre ursprüngliche Einstellung für die Batch-Größe bleibt unverändert.
+ **Gleichzeitige Batches pro Shard** – Verarbeitet gleichzeitig mehrere Batches aus demselben Shard.
+ **Aktiviert** – Auf „true“ festlegen, um die Ereignisquellenzuordnung zu aktivieren. Auf "false" festlegen, um die Verarbeitung von Datensätzen zu beenden. Lambda merkt sich den zuletzt verarbeiteten Datensatz und setzt die Verarbeitung nach erneuter Aktivierung der Zuordnung an dieser Stelle fort.

**Anmerkung**  
Für GetRecords API-Aufrufe, die von Lambda als Teil von DynamoDB-Triggern aufgerufen werden, fallen keine Gebühren an.

Um die Konfiguration der Ereignisquelle zu einem späteren Zeitpunkt zu verwalten, wählen Sie den Auslöser im Designer aus.

## Erstellen einer kontoübergreifenden Zuordnung von Ereignisquellen
<a name="services-dynamodb-eventsourcemapping-cross-account"></a>

Amazon DynamoDB unterstützt jetzt [ressourcenbasierte](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-resource-based.html) Richtlinien. Mit dieser Funktion können Sie Daten aus einem DynamoDB-Stream in einem AWS-Konto mit einer Lambda-Funktion in einem anderen Konto verarbeiten.

Um eine Ereignisquellenzuordnung für Ihre Lambda-Funktion mithilfe eines DynamoDB-Streams in einem anderen zu erstellen AWS-Konto, müssen Sie den Stream mithilfe einer ressourcenbasierten Richtlinie konfigurieren, um Ihrer Lambda-Funktion die Berechtigung zum Lesen von Datensätzen zu erteilen. Informationen dazu, wie Sie Ihren Stream für den kontoübergreifenden Zugriff konfigurieren, finden Sie unter [Zugriff mit kontoübergreifenden Lambda-Funktionen teilen](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-cross-account-access.html#rbac-analyze-cross-account-lambda-access) im *Amazon DynamoDB DynamoDB-Entwicklerhandbuch*.

Nachdem Sie Ihren Stream mit einer ressourcenbasierten Richtlinie konfiguriert haben, die Ihrer Lambda-Funktion die erforderlichen Berechtigungen erteilt, erstellen Sie die Ereignisquellenzuordnung mit Ihrem kontoübergreifenden Stream-ARN. Sie finden den Stream-ARN auf der Registerkarte **Exporte und Streams** der Tabelle in der kontoübergreifenden DynamoDB-Konsole. 

Wenn Sie die Lambda-Konsole verwenden, fügen Sie den Stream-ARN direkt in das Eingabefeld der DynamoDB-Tabelle auf der Seite zur Erstellung der Ereignisquellenzuordnung ein.

 **Hinweis:** Regionsübergreifende Trigger werden nicht unterstützt. 

# Konfigurieren einer teilweisen Batch-Antwort mit DynamoDB und Lambda
<a name="services-ddb-batchfailurereporting"></a>

Beim Konsumieren und Verarbeiten von Streaming-Daten aus einer Ereignisquelle werden standardmäßig Lambda-Checkpoints auf die höchste Sequenznummer eines Batches nur dann überprüft, wenn der Batch ein voller Erfolg ist. Lambda behandelt alle anderen Ergebnisse als einen vollständigen Fehler und versucht, den Batch bis zum Wiederholungslimit zu verarbeiten. Um beim Verarbeiten von Stapeln aus einem Stream Teilerfolge zu ermöglichen, aktivieren Sie `ReportBatchItemFailures`. Das Zulassen von Teilerfolgen kann dazu beitragen, die Anzahl der Wiederholungen in einer Aufzeichnung zu reduzieren, obwohl die Möglichkeit von Wiederholungen in einer erfolgreichen Aufzeichnung nicht vollständig verhindert wird.

Zum Aktivieren von `ReportBatchItemFailures` fügen Sie den Enum-Wert **ReportBatchItemFailures** der [FunctionResponseTypes](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-FunctionResponseTypes)-Liste hinzu. Diese Liste zeigt an, welche Antworttypen für Ihre Funktion aktiviert sind. Sie können diese Liste konfigurieren, wenn Sie eine Zuordnung von Ereignisquellen [erstellen](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) oder [aktualisieren](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html).

**Anmerkung**  
Selbst wenn Ihr Funktionscode teilweise Antworten bei Batch-Fehlern zurückgibt, werden diese Antworten nicht von Lambda verarbeitet, es sei denn, das `ReportBatchItemFailures`-Feature ist explizit für Ihre Zuordnung von Ereignisquellen aktiviert.

## Berichtsyntax
<a name="streams-batchfailurereporting-syntax"></a>

Beim Konfigurieren von Berichten zu Batch-Elementfehlern wird die `StreamsEventResponse`-Klasse mit einer Liste von Batch-Elementfehlern zurückgegeben. Sie können ein `StreamsEventResponse`-Objekt verwenden, um die Sequenznummer des ersten fehlgeschlagenen Datensatzes im Batch zurückzugeben. Sie können auch Ihre eigene benutzerdefinierte Klasse mit der richtigen Antwortsyntax erstellen. Die folgende JSON-Struktur zeigt die erforderliche Antwortsyntax:

```
{ 
  "batchItemFailures": [ 
        {
            "itemIdentifier": "<SequenceNumber>"
        }
    ]
}
```

**Anmerkung**  
Wenn das `batchItemFailures`-Array mehrere Elemente enthält, verwendet Lambda den Datensatz mit der niedrigsten Sequenznummer als Kontrollpunkt. Lambda wiederholt dann alle Datensätze ab diesem Kontrollpunkt.

## Erfolgs- und Misserfolgsbedingungen
<a name="streams-batchfailurereporting-conditions"></a>

Lambda behandelt einen Batch als vollständigen Erfolg, wenn Sie eines der folgenden Elemente zurückgeben:
+ Eine leere `batchItemFailure`-Liste
+ Eine ungültige `batchItemFailure`-Liste
+ Ein leeres `EventResponse`
+ Ein ungültiges `EventResponse`

Lambda behandelt einen Batch als vollständigen Misserfolg, wenn Sie eines der folgenden Elemente zurückgeben:
+ Eine leere Zeichenfolge `itemIdentifier`
+ Ein ungültiges `itemIdentifier`
+ Ein `itemIdentifier` mit einem falschen Schlüsselnamen

Lambda wiederholt Fehler basierend auf Ihrer Wiederholungsstrategie.

## Einen Batch halbieren
<a name="streams-batchfailurereporting-bisect"></a>

Wenn Ihr Aufruf fehlschlägt und `BisectBatchOnFunctionError` eingeschaltet ist, wird der Stapel unabhängig von Ihrer `ReportBatchItemFailures`-Einstellung halbiert.

Wenn eine partielle Batch-Erfolgsantwort empfangen wird und sowohl `BisectBatchOnFunctionError` als auch `ReportBatchItemFailures` aktiviert sind, wird der Batch mit der zurückgegebenen Sequenznummer halbiert und Lambda versucht nur die verbleibenden Datensätze erneut.

Um die Implementierung der partiellen Batch-Antwortlogik zu vereinfachen, sollten Sie in Erwägung ziehen, das [Batch Processor Utility](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) von Powertools for zu verwenden AWS Lambda, das diese Komplexität automatisch für Sie erledigt.

Hier sind einige Beispiele für Funktionscode, der die Liste der fehlgeschlagenen Nachrichten IDs im Batch zurückgibt:

------
#### [ .NET ]

**SDK für .NET**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melden von DynamoDB-Batchelementfehlern mit Lambda unter Verwendung von .NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using System.Text.Json;
using System.Text;
using Amazon.Lambda.Core;
using Amazon.Lambda.DynamoDBEvents;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace AWSLambda_DDB;

public class Function
{
    public StreamsEventResponse FunctionHandler(DynamoDBEvent dynamoEvent, ILambdaContext context)

    {
        context.Logger.LogInformation($"Beginning to process {dynamoEvent.Records.Count} records...");
        List<StreamsEventResponse.BatchItemFailure> batchItemFailures = new List<StreamsEventResponse.BatchItemFailure>();
        StreamsEventResponse streamsEventResponse = new StreamsEventResponse();

        foreach (var record in dynamoEvent.Records)
        {
            try
            {
                var sequenceNumber = record.Dynamodb.SequenceNumber;
                context.Logger.LogInformation(sequenceNumber);
            }
            catch (Exception ex)
            {
                context.Logger.LogError(ex.Message);
                batchItemFailures.Add(new StreamsEventResponse.BatchItemFailure() { ItemIdentifier = record.Dynamodb.SequenceNumber });
            }
        }

        if (batchItemFailures.Count > 0)
        {
            streamsEventResponse.BatchItemFailures = batchItemFailures;
        }

        context.Logger.LogInformation("Stream processing complete.");
        return streamsEventResponse;
    }
}
```

------
#### [ Go ]

**SDK für Go V2**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melden von DynamoDB-Batchelementfehlern mit Lambda unter Verwendung von Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main

import (
	"context"
	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

type BatchItemFailure struct {
	ItemIdentifier string `json:"ItemIdentifier"`
}

type BatchResult struct {
	BatchItemFailures []BatchItemFailure `json:"BatchItemFailures"`
}

func HandleRequest(ctx context.Context, event events.DynamoDBEvent) (*BatchResult, error) {
	var batchItemFailures []BatchItemFailure
	curRecordSequenceNumber := ""

	for _, record := range event.Records {
		// Process your record
		curRecordSequenceNumber = record.Change.SequenceNumber
	}

	if curRecordSequenceNumber != "" {
		batchItemFailures = append(batchItemFailures, BatchItemFailure{ItemIdentifier: curRecordSequenceNumber})
	}
	
	batchResult := BatchResult{
		BatchItemFailures: batchItemFailures,
	}

	return &batchResult, nil
}

func main() {
	lambda.Start(HandleRequest)
}
```

------
#### [ Java ]

**SDK für Java 2.x**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melden von DynamoDB-Batchelementfehlern mit Lambda unter Verwendung von Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;
import com.amazonaws.services.lambda.runtime.events.StreamsEventResponse;
import com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord;

import java.util.ArrayList;
import java.util.List;

public class ProcessDynamodbRecords implements RequestHandler<DynamodbEvent, StreamsEventResponse> {

    @Override
    public StreamsEventResponse handleRequest(DynamodbEvent input, Context context) {

        List<StreamsEventResponse.BatchItemFailure> batchItemFailures = new ArrayList<>();
        String curRecordSequenceNumber = "";

        for (DynamodbEvent.DynamodbStreamRecord dynamodbStreamRecord : input.getRecords()) {
          try {
                //Process your record
                StreamRecord dynamodbRecord = dynamodbStreamRecord.getDynamodb();
                curRecordSequenceNumber = dynamodbRecord.getSequenceNumber();
                
            } catch (Exception e) {
                /* Since we are working with streams, we can return the failed item immediately.
                   Lambda will immediately begin to retry processing from this failed item onwards. */
                batchItemFailures.add(new StreamsEventResponse.BatchItemFailure(curRecordSequenceNumber));
                return new StreamsEventResponse(batchItemFailures);
            }
        }
       
       return new StreamsEventResponse();   
    }
}
```

------
#### [ JavaScript ]

**SDK für JavaScript (v3)**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melden von DynamoDB-Batchelementfehlern mit Lambda unter Verwendung von. JavaScript  

```
export const handler = async (event) => {
  const records = event.Records;
  let curRecordSequenceNumber = "";

  for (const record of records) {
    try {
      // Process your record
      curRecordSequenceNumber = record.dynamodb.SequenceNumber;
    } catch (e) {
      // Return failed record's sequence number
      return { batchItemFailures: [{ itemIdentifier: curRecordSequenceNumber }] };
    }
  }

  return { batchItemFailures: [] };
};
```
Melden von DynamoDB-Batchelementfehlern mit Lambda unter Verwendung von. TypeScript  

```
import {
  DynamoDBBatchResponse,
  DynamoDBBatchItemFailure,
  DynamoDBStreamEvent,
} from "aws-lambda";

export const handler = async (
  event: DynamoDBStreamEvent
): Promise<DynamoDBBatchResponse> => {
  const batchItemFailures: DynamoDBBatchItemFailure[] = [];
  let curRecordSequenceNumber;

  for (const record of event.Records) {
    curRecordSequenceNumber = record.dynamodb?.SequenceNumber;

    if (curRecordSequenceNumber) {
      batchItemFailures.push({
        itemIdentifier: curRecordSequenceNumber,
      });
    }
  }

  return { batchItemFailures: batchItemFailures };
};
```

------
#### [ PHP ]

**SDK für PHP**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melden von DynamoDB-Batchelementfehlern mit Lambda unter Verwendung von PHP.  

```
<?php

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\DynamoDb\DynamoDbEvent;
use Bref\Event\Handler as StdHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler implements StdHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws JsonException
     * @throws \Bref\Event\InvalidLambdaEvent
     */
    public function handle(mixed $event, Context $context): array
    {
        $dynamoDbEvent = new DynamoDbEvent($event);
        $this->logger->info("Processing records");

        $records = $dynamoDbEvent->getRecords();
        $failedRecords = [];
        foreach ($records as $record) {
            try {
                $data = $record->getData();
                $this->logger->info(json_encode($data));
                // TODO: Do interesting work based on the new data
            } catch (Exception $e) {
                $this->logger->error($e->getMessage());
                // failed processing the record
                $failedRecords[] = $record->getSequenceNumber();
            }
        }
        $totalRecords = count($records);
        $this->logger->info("Successfully processed $totalRecords records");

        // change format for the response
        $failures = array_map(
            fn(string $sequenceNumber) => ['itemIdentifier' => $sequenceNumber],
            $failedRecords
        );

        return [
            'batchItemFailures' => $failures
        ];
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

------
#### [ Python ]

**SDK für Python (Boto3)**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melden von DynamoDB-Batchelementfehlern mit Lambda unter Verwendung von Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def handler(event, context):
    records = event.get("Records")
    curRecordSequenceNumber = ""
    
    for record in records:
        try:
            # Process your record
            curRecordSequenceNumber = record["dynamodb"]["SequenceNumber"]
        except Exception as e:
            # Return failed record's sequence number
            return {"batchItemFailures":[{"itemIdentifier": curRecordSequenceNumber}]}

    return {"batchItemFailures":[]}
```

------
#### [ Ruby ]

**SDK für Ruby**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melden von DynamoDB-Batchelementfehlern mit Lambda unter Verwendung von Ruby.  

```
def lambda_handler(event:, context:)
    records = event["Records"]
    cur_record_sequence_number = ""
  
    records.each do |record|
      begin
        # Process your record
        cur_record_sequence_number = record["dynamodb"]["SequenceNumber"]
      rescue StandardError => e
        # Return failed record's sequence number
        return {"batchItemFailures" => [{"itemIdentifier" => cur_record_sequence_number}]}
      end
    end
  
    {"batchItemFailures" => []}
  end
```

------
#### [ Rust ]

**SDK für Rust**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melden von DynamoDB-Batchelementfehlern mit Lambda unter Verwendung von Rust.  

```
use aws_lambda_events::{
    event::dynamodb::{Event, EventRecord, StreamRecord},
    streams::{DynamoDbBatchItemFailure, DynamoDbEventResponse},
};
use lambda_runtime::{run, service_fn, Error, LambdaEvent};

/// Process the stream record
fn process_record(record: &EventRecord) -> Result<(), Error> {
    let stream_record: &StreamRecord = &record.change;

    // process your stream record here...
    tracing::info!("Data: {:?}", stream_record);

    Ok(())
}

/// Main Lambda handler here...
async fn function_handler(event: LambdaEvent<Event>) -> Result<DynamoDbEventResponse, Error> {
    let mut response = DynamoDbEventResponse {
        batch_item_failures: vec![],
    };

    let records = &event.payload.records;

    if records.is_empty() {
        tracing::info!("No records found. Exiting.");
        return Ok(response);
    }

    for record in records {
        tracing::info!("EventId: {}", record.event_id);

        // Couldn't find a sequence number
        if record.change.sequence_number.is_none() {
            response.batch_item_failures.push(DynamoDbBatchItemFailure {
                item_identifier: Some("".to_string()),
            });
            return Ok(response);
        }

        // Process your record here...
        if process_record(record).is_err() {
            response.batch_item_failures.push(DynamoDbBatchItemFailure {
                item_identifier: record.change.sequence_number.clone(),
            });
            /* Since we are working with streams, we can return the failed item immediately.
            Lambda will immediately begin to retry processing from this failed item onwards. */
            return Ok(response);
        }
    }

    tracing::info!("Successfully processed {} record(s)", records.len());

    Ok(response)
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        // disable printing the name of the module in every log line.
        .with_target(false)
        // disabling time is handy because CloudWatch will add the ingestion time.
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

## Powertools für die AWS Lambda Batch-Verarbeitung verwenden
<a name="services-ddb-batchfailurereporting-powertools"></a>

Das Batchverarbeitungsprogramm von Powertools for verarbeitet AWS Lambda automatisch die Logik für partielle Batch-Antworten und reduziert so die Komplexität der Implementierung von Batch-Fehlerberichten. Hier sind Beispiele für die Verwendung des Batch-Prozessors:

**Python**  
Umfassende Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Batch-Prozessor](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/).
Verarbeitung von DynamoDB-Stream-Datensätzen mit AWS Lambda Batch-Prozessor.  

```
import json
from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType, process_partial_response
from aws_lambda_powertools.utilities.data_classes import DynamoDBStreamEvent
from aws_lambda_powertools.utilities.typing import LambdaContext

processor = BatchProcessor(event_type=EventType.DynamoDBStreams)
logger = Logger()

def record_handler(record):
    logger.info(record)
    # Your business logic here
    # Raise an exception to mark this record as failed
    
def lambda_handler(event, context: LambdaContext):
    return process_partial_response(
        event=event, 
        record_handler=record_handler, 
        processor=processor,
        context=context
    )
```

**TypeScript**  
Umfassende Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Batch-Prozessor](https://docs.aws.amazon.com/powertools/typescript/latest/features/batch/).
Verarbeitung von DynamoDB-Stream-Datensätzen mit AWS Lambda Batch-Prozessor.  

```
import { BatchProcessor, EventType, processPartialResponse } from '@aws-lambda-powertools/batch';
import { Logger } from '@aws-lambda-powertools/logger';
import type { DynamoDBStreamEvent, Context } from 'aws-lambda';

const processor = new BatchProcessor(EventType.DynamoDBStreams);
const logger = new Logger();

const recordHandler = async (record: any): Promise<void> => {
    logger.info('Processing record', { record });
    // Your business logic here
    // Throw an error to mark this record as failed
};

export const handler = async (event: DynamoDBStreamEvent, context: Context) => {
    return processPartialResponse(event, recordHandler, processor, {
        context,
    });
};
```

**Java**  
Umfassende Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Batch-Prozessor](https://docs.powertools.aws.dev/lambda/java/latest/utilities/batch/).
Verarbeitung von DynamoDB-Stream-Datensätzen mit AWS Lambda Batch-Prozessor.  

```
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;
import com.amazonaws.services.lambda.runtime.events.StreamsEventResponse;
import software.amazon.lambda.powertools.batch.BatchMessageHandlerBuilder;
import software.amazon.lambda.powertools.batch.handler.BatchMessageHandler;

public class DynamoDBStreamBatchHandler implements RequestHandler<DynamodbEvent, StreamsEventResponse> {

    private final BatchMessageHandler<DynamodbEvent, StreamsEventResponse> handler;

    public DynamoDBStreamBatchHandler() {
        handler = new BatchMessageHandlerBuilder()
                .withDynamoDbBatchHandler()
                .buildWithRawMessageHandler(this::processMessage);
    }

    @Override
    public StreamsEventResponse handleRequest(DynamodbEvent ddbEvent, Context context) {
        return handler.processBatch(ddbEvent, context);
    }

    private void processMessage(DynamodbEvent.DynamodbStreamRecord dynamodbStreamRecord, Context context) {
        // Process the change record
    }
}
```

**.NET**  
Umfassende Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Batch-Prozessor](https://docs.aws.amazon.com/powertools/dotnet/utilities/batch-processing/).
Verarbeitung von DynamoDB-Stream-Datensätzen mit AWS Lambda Batch-Prozessor.  

```
using System;
using System.Threading;
using System.Threading.Tasks;
using Amazon.Lambda.Core;
using Amazon.Lambda.DynamoDBEvents;
using Amazon.Lambda.Serialization.SystemTextJson;
using AWS.Lambda.Powertools.BatchProcessing;

[assembly: LambdaSerializer(typeof(DefaultLambdaJsonSerializer))]

namespace HelloWorld;

public class Customer
{
    public string? CustomerId { get; set; }
    public string? Name { get; set; }
    public string? Email { get; set; }
    public DateTime CreatedAt { get; set; }
}

internal class TypedDynamoDbRecordHandler : ITypedRecordHandler<Customer> 
{
    public async Task<RecordHandlerResult> HandleAsync(Customer customer, CancellationToken cancellationToken)
    {
        if (string.IsNullOrEmpty(customer.Email)) 
        {
            throw new ArgumentException("Customer email is required");
        }

        return await Task.FromResult(RecordHandlerResult.None); 
    }
}

public class Function
{
    [BatchProcessor(TypedRecordHandler = typeof(TypedDynamoDbRecordHandler))]
    public BatchItemFailuresResponse HandlerUsingTypedAttribute(DynamoDBEvent _)
    {
        return TypedDynamoDbStreamBatchProcessor.Result.BatchItemFailuresResponse; 
    }
}
```

# Verworfene Datensätze für eine DynamoDB-Ereignisquelle in Lambda aufbewahren
<a name="services-dynamodb-errors"></a>

Die Fehlerbehandlung für DynamoDB-Zuordnungen von Ereignisquellen hängt davon ab, ob der Fehler vor dem Aufruf der Funktion oder während des Funktionsaufrufs auftritt:
+ **Vor dem Aufruf:** Wenn eine Lambda-Ereignisquellenzuordnung die Funktion aufgrund von Drosselung oder anderen Problemen nicht aufrufen kann, versucht sie es erneut, bis die Datensätze ablaufen oder das in der Ereignisquellenzuordnung () konfigurierte Höchstalter überschreiten. [MaximumRecordAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRecordAgeInSeconds)
+ **Während des Aufrufs:** Wenn die Funktion aufgerufen wird, aber einen Fehler zurückgibt, versucht Lambda es erneut, bis die Datensätze ablaufen, das Höchstalter ([MaximumRecordAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRecordAgeInSeconds)) überschreiten oder die konfigurierte Wiederholungsquote () erreicht haben. [MaximumRetryAttempts](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRetryAttempts) Bei Funktionsfehlern können Sie auch konfigurieren [BisectBatchOnFunctionError](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-response-BisectBatchOnFunctionError), dass ein fehlgeschlagener Batch in zwei kleinere Batches aufgeteilt wird, wodurch fehlerhafte Datensätze isoliert und Timeouts vermieden werden. Durch das Aufteilen von Batches wird die Quote für Wiederholungen nicht verbraucht.

Wenn die Fehlerbehandlungsmaßnahmen fehlschlagen, verwirft Lambda die Datensätze und setzt die Verarbeitung von Batches aus dem Stream fort. Bei den Standardeinstellungen bedeutet dies, dass ein fehlerhafter Datensatz die Verarbeitung auf dem betroffenen Shard für bis zu einen Tag blockieren kann. Um dies zu vermeiden, konfigurieren Sie die Ereignisquellenzuordnung Ihrer Funktion mit einer angemessenen Anzahl von Wiederholungen und einem maximalen Datensatzalter, das zu Ihrem Anwendungsfall passt.

## Konfigurieren von Zielen für fehlgeschlagene Aufrufe
<a name="dynamodb-on-failure-destination-console"></a>

Um Datensätze zu fehlgeschlagenen Aufrufen zur Zuordnung von Ereignisquellen beizubehalten, fügen Sie der Zuordnung von Ereignisquellen Ihrer Funktion ein Ziel hinzu. Jeder an das Ziel gesendete Datensatz ist ein JSON-Dokument mit Metadaten über den fehlgeschlagenen Aufruf. Bei Amazon S3-Zielen sendet Lambda auch den gesamten Aufrufdatensatz zusammen mit den Metadaten. Sie können jedes Amazon SNS SNS-Thema, jede Amazon SQS SQS-Warteschlange, jeden Amazon S3 S3-Bucket oder Kafka als Ziel konfigurieren.

Bei Amazon-S3-Zielen können Sie das Feature [Amazon S3 Event Notifications](https://docs.aws.amazon.com/) verwenden, um Benachrichtigungen zu erhalten, wenn Objekte in Ihren S3-Ziel-Bucket hochgeladen werden. Sie können S3-Ereignisbenachrichtigungen auch so konfigurieren, dass sie eine andere Lambda-Funktion aufrufen, um eine automatische Verarbeitung für fehlgeschlagene Stapel durchzuführen.

Ihre Ausführungsrolle muss über Berechtigungen für das Ziel verfügen:
+ **[Für ein SQS-Ziel: sqs: SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)**
+ **[Für ein SNS-Ziel: sns:Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)**
+ **Für ein S3-Ziel: s3:** [und [s3: PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/ListObjectsV2.html)
+ **Für ein Kafka-Ziel: [kafka-cluster](https://docs.aws.amazon.com/msk/latest/developerguide/kafka-actions.html):** WriteData

Sie können ein Kafka-Thema als Ziel für den Fall eines Fehlers für Ihre Quellenzuordnungen für Kafka-Ereignisse konfigurieren. Wenn Lambda Datensätze nach anstrengenden Wiederholungsversuchen nicht verarbeiten kann oder wenn Datensätze das Höchstalter überschreiten, sendet Lambda die fehlgeschlagenen Datensätze zur späteren Verarbeitung an das angegebene Kafka-Thema. Weitere Informationen finden Sie unter [Ein Kafka-Thema als Ziel für den Fall eines Fehlers verwenden](kafka-on-failure-destination.md).

[Wenn Sie die Verschlüsselung mit Ihrem eigenen KMS-Schlüssel für ein S3-Ziel aktiviert haben, muss die Ausführungsrolle Ihrer Funktion auch die Berechtigung haben, kms: aufzurufen. GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) Wenn sich der KMS-Schlüssel und das S3-Bucket-Ziel in einem anderen Konto als Ihre Lambda-Funktion und Ausführungsrolle befinden, konfigurieren Sie den KMS-Schlüssel so, dass er der Ausführungsrolle vertraut, die zugelassen kms: GenerateDataKey wird.

Gehen Sie folgendermaßen vor, um ein Ausfallziel mit der Konsole zu konfigurieren:

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie eine Funktion aus.

1. Wählen Sie unter **Function overview (Funktionsübersicht)** die Option **Add destination (Ziel hinzufügen)**.

1. Wählen Sie als **Quelle** die Option **Aufruf der Zuordnung von Ereignisquellen** aus.

1. Wählen Sie für die **Zuordnung von Ereignisquellen** eine Ereignisquelle aus, die für diese Funktion konfiguriert ist.

1. Wählen Sie für **Bedingung** die Option **Bei Ausfall** aus. Für Aufrufe zur Zuordnung von Ereignisquellen ist dies die einzig akzeptierte Bedingung.

1. Wählen Sie unter **Zieltyp** den Zieltyp aus, an den Lambda Aufrufdatensätze sendet.

1. Wählen Sie unter **Destination (Ziel)** eine Ressource aus.

1. Wählen Sie **Speichern**.

Sie können mit AWS Command Line Interface (AWS CLI) auch ein Ziel für den Fall eines Fehlers konfigurieren. Mit dem folgenden [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)Befehl wird beispielsweise eine Zuordnung der Ereignisquelle mit einem SQS-Ziel für den Fall eines Fehlers hinzugefügt: `MyFunction`

```
aws lambda create-event-source-mapping \
--function-name "MyFunction" \
--event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525 \
--destination-config '{"OnFailure": {"Destination": "arn:aws:sqs:us-east-1:123456789012:dest-queue"}}'
```

Der folgende [update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html)Befehl aktualisiert eine Ereignisquellenzuordnung, sodass fehlgeschlagene Aufrufdatensätze nach zwei Wiederholungsversuchen oder wenn die Datensätze älter als eine Stunde sind, an ein SNS-Ziel gesendet werden.

```
aws lambda update-event-source-mapping \
--uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
--maximum-retry-attempts 2 \
--maximum-record-age-in-seconds 3600 \
--destination-config '{"OnFailure": {"Destination": "arn:aws:sns:us-east-1:123456789012:dest-topic"}}'
```

Aktualisierte Einstellungen werden asynchron angewendet und werden erst nach Abschluss des Vorgangs in der Ausgabe berücksichtigt. Verwenden Sie den [get-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-event-source-mapping.html)-Befehl, um den aktuellen Status anzuzeigen.

Um ein Ziel zu entfernen, geben Sie eine leere Zeichenfolge als Argument für den `destination-config`-Parameter an:

```
aws lambda update-event-source-mapping \
--uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
--destination-config '{"OnFailure": {"Destination": ""}}'
```

### Bewährte Methoden für die Sicherheit in Amazon S3-Zielen
<a name="ddb-s3-destination-security"></a>

Das Löschen eines S3-Buckets, der als Ziel konfiguriert ist, ohne das Ziel aus der Konfiguration Ihrer Funktion zu entfernen, kann ein Sicherheitsrisiko darstellen. Wenn ein anderer Benutzer den Namen Ihres Ziel-Buckets kennt, kann er den Bucket in seinem AWS-Konto neu erstellen. Aufzeichnungen über fehlgeschlagene Aufrufe werden an den entsprechenden Bucket gesendet, wodurch möglicherweise Daten aus Ihrer Funktion verfügbar gemacht werden.

**Warnung**  
Um sicherzustellen, dass Aufrufdatensätze Ihrer Funktion nicht an einen S3-Bucket in einem anderen gesendet werden können AWS-Konto, fügen Sie der Ausführungsrolle Ihrer Funktion eine Bedingung hinzu, die die `s3:PutObject` Berechtigungen auf Buckets in Ihrem Konto beschränkt. 

-Das folgende Beispiel zeigt eine IAM-Richtlinie, die die `s3:PutObject`-Berechtigungen Ihrer Funktion auf Buckets in Ihrem Konto beschränkt. Diese Richtlinie gibt Lambda auch die `s3:ListBucket`-Erlaubnis, einen S3-Bucket als Ziel zu verwenden.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*/*",
                "arn:aws:s3:::*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

Um der Ausführungsrolle Ihrer Funktion mithilfe von AWS-Managementkonsole oder eine Berechtigungsrichtlinie hinzuzufügen AWS CLI, lesen Sie die Anweisungen in den folgenden Verfahren:

------
#### [ Console ]

**So fügen Sie der Ausführungsrolle einer Funktion (Konsole) eine Berechtigungsrichtlinie hinzu**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Lambda-Funktion aus, deren Ausführungsrolle Sie ändern möchten.

1. Klicken Sie in der Registerkarte **Konfiguration** auf die Option **Berechtigungen**.

1. Wählen Sie auf der Registerkarte **Ausführungsrolle** den **Rollennamen** Ihrer Funktion aus, um die IAM-Konsolenseite der Rolle zu öffnen.

1. Fügen Sie der Rolle wie folgt eine Richtlinie mit Berechtigungen hinzu:

   1. Wählen Sie im Bereich **Berechtigungsrichtlinien** die Optionen **Berechtigungen hinzufügen** und dann **Inline-Richtlinie erstellen** aus.

   1. Wählen Sie im **Richtlinien-Editor** **JSON** aus.

   1. Fügen Sie die Richtlinie, die Sie hinzufügen möchten, in den Editor ein (indem Sie die vorhandene JSON-Datei ersetzt) und wählen Sie dann **Weiter** aus.

   1. Geben Sie unter **Richtliniendetails** für den **Richtliniennamen** ein.

   1. Wählen Sie **Richtlinie erstellen** aus.

------
#### [ AWS CLI ]

**So fügen Sie der Ausführungsrolle einer Funktion (CLI) eine Berechtigungsrichtlinie hinzu**

1. Erstellen Sie ein JSON-Richtliniendokument mit den erforderlichen Berechtigungen und speichern Sie es in einem lokalen Verzeichnis.

1. Verwenden Sie den `put-role-policy` IAM-CLI-Befehl, um die Berechtigungen zur Ausführungsrolle Ihrer Funktion hinzuzufügen. Führen Sie den folgenden Befehl in dem Verzeichnis aus, in dem Sie Ihr JSON-Richtliniendokument gespeichert haben und ersetzen Sie den Rollennamen, den Richtliniennamen und das Richtliniendokument durch Ihre eigenen Werte.

   ```
   aws iam put-role-policy \
   --role-name my_lambda_role \
   --policy-name LambdaS3DestinationPolicy \
   --policy-document file://my_policy.json
   ```

------

### Beispiel für einen Amazon SNS- und Amazon SQS-Aufrufsatz
<a name="kinesis-on-failure-destination-example-sns-sqs"></a>

Das folgende Beispiel zeigt einen Aufrufsatz, den Lambda an ein SQS- oder SNS-Ziel für einen DynamoDB-Stream sendet.

```
{
    "requestContext": {
        "requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction",
        "condition": "RetryAttemptsExhausted",
        "approximateInvokeCount": 1
    },
    "responseContext": {
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "version": "1.0",
    "timestamp": "2019-11-14T00:13:49.717Z",
    "DDBStreamBatchInfo": {
        "shardId": "shardId-00000001573689847184-864758bb",
        "startSequenceNumber": "800000000003126276362",
        "endSequenceNumber": "800000000003126276362",
        "approximateArrivalOfFirstRecord": "2019-11-14T00:13:19Z",
        "approximateArrivalOfLastRecord": "2019-11-14T00:13:19Z",
        "batchSize": 1,
        "streamArn": "arn:aws:dynamodb:us-east-2:123456789012:table/mytable/stream/2019-11-14T00:04:06.388"
    }
}
```

Sie können diese Informationen verwenden, um die betroffenen Datensätze aus dem Stream für die Fehlersuche abzurufen. Die tatsächlichen Datensätze sind nicht enthalten, daher müssen Sie diesen Datensatz verarbeiten und aus dem Stream abrufen, bevor sie ablaufen und verloren gehen.

### Beispiel eines Amazon S3-Aufrufdatensatzes
<a name="kinesis-on-failure-destination-example-sns-sqs-s3"></a>

Das folgende Beispiel zeigt einen Aufrufsatz, den Lambda für einen DynamoDB-Stream an einen S3-Bucket sendet. Zusätzlich zu allen Feldern aus dem vorherigen Beispiel für SQS- und SNS-Ziele enthält das Feld `payload` den ursprünglichen Aufrufdatensatz als maskierte JSON-Zeichenfolge.

```
{
    "requestContext": {
        "requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction",
        "condition": "RetryAttemptsExhausted",
        "approximateInvokeCount": 1
    },
    "responseContext": {
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "version": "1.0",
    "timestamp": "2019-11-14T00:13:49.717Z",
    "DDBStreamBatchInfo": {
        "shardId": "shardId-00000001573689847184-864758bb",
        "startSequenceNumber": "800000000003126276362",
        "endSequenceNumber": "800000000003126276362",
        "approximateArrivalOfFirstRecord": "2019-11-14T00:13:19Z",
        "approximateArrivalOfLastRecord": "2019-11-14T00:13:19Z",
        "batchSize": 1,
        "streamArn": "arn:aws:dynamodb:us-east-2:123456789012:table/mytable/stream/2019-11-14T00:04:06.388"
    },
    "payload": "<Whole Event>" // Only available in S3
}
```

Das S3-Objekt, das den Aufrufdatensatz enthält, verwendet die folgende Namenskonvention:

```
aws/lambda/<ESM-UUID>/<shardID>/YYYY/MM/DD/YYYY-MM-DDTHH.MM.SS-<Random UUID>
```

# Implementierung der statusbehafteten DynamoDB-Stream-Verarbeitung in Lambda
<a name="services-ddb-windows"></a>

Lambda-Funktionen können kontinuierliche Stream-Verarbeitungsanwendungen ausführen. Ein Stream entspricht einer unbegrenzten Menge von Daten, die kontinuierlich durch Ihre Anwendung fließen. Um Informationen aus dieser sich ständig aktualisierenden Eingabe zu analysieren, können Sie die enthaltenen Datensätze mithilfe eines zeitlich definierten Fensters binden.

Rollierende Fenster sind unterschiedliche Zeitfenster, die sich in regelmäßigen Abständen öffnen und schließen. Standardmäßig sind Lambda-Aufrufe zustandslos – Sie können sie nicht für die Verarbeitung von Daten über mehrere kontinuierliche Aufrufe hinweg ohne eine externe Datenbank verwenden. Mit rollierenden Fenstern können Sie jedoch Ihren Status über Aufrufe hinweg beibehalten. Dieser Zustand enthält das Gesamtergebnis der Nachrichten, die zuvor für das aktuelle Fenster verarbeitet wurden. Ihr Zustand kann maximal 1 MB pro Shard betragen. Wenn er diese Größe überschreitet, wird Lambda das Fenster vorzeitig beenden.

Jeder Datensatz in einem Stream gehört zu einem bestimmten Fenster. Lambda verarbeitet jeden Datensatz mindestens einmal, garantiert jedoch nicht, dass jeder Datensatz nur einmal verarbeitet wird. In seltenen Fällen, etwa bei der Fehlerbehandlung, werden einige Datensätze möglicherweise mehrmals verarbeitet. Datensätze werden beim ersten Mal immer in der richtigen Reihenfolge verarbeitet. Wenn Datensätze mehr als einmal verarbeitet werden, werden sie nicht in der richtigen Reihenfolge verarbeitet.

## Aggregation und Verarbeitung
<a name="streams-tumbling-processing"></a>

Ihre benutzerverwaltete Funktion wird sowohl zur Aggregation als auch zur Verarbeitung der Endergebnisse dieser Aggregation aufgerufen. Lambda aggregiert alle im Fenster empfangenen Datensätze. Sie können diese Datensätze in mehreren Stapeln erhalten, jeweils als ein separater Aufruf. Jeder Aufruf erhält einen Zustand. Wenn Sie also rollierende Fenster verwenden, muss Ihre Lambda-Funktionsantwort eine `state`-Eigenschaft enthalten. Wenn die Antwort keine `state`-Eigenschaft enthält, betrachtet Lambda dies als fehlgeschlagenen Aufruf. Um diese Bedingung zu erfüllen, kann Ihre Funktion ein `TimeWindowEventResponse`-Objekt zurückgeben, das die folgende JSON-Form aufweist:

**Example `TimeWindowEventResponse`-Werte**  

```
{
    "state": {
        "1": 282,
        "2": 715
    },
    "batchItemFailures": []
}
```

**Anmerkung**  
Für Java-Funktionen empfehlen wir, eine `Map<String, String>` zu verwenden, um den Status darzustellen.

Am Ende des Fensters wird das Flag `isFinalInvokeForWindow` auf `true` gesetzt, um anzugeben, dass es sich um den Endzustand handelt und dass es für die Verarbeitung bereit ist. Nach der Verarbeitung werden das Fenster und Ihr endgültiger Aufruf wird abgeschlossen, und dann wird der Zustand gelöscht.

Am Ende Ihres Fensters verwendet Lambda die endgültige Verarbeitung für Aktionen an den Aggregationsergebnissen. Ihre endgültige Verarbeitung wird synchron aufgerufen. Nach erfolgreichem Aufruf zeigt Ihre Funktion auf die Sequenznummer und die Stream-Verarbeitung wird fortgesetzt. Wenn der Aufruf nicht erfolgreich ist, unterbricht Ihre Lambda-Funktion die weitere Verarbeitung bis zu einem erfolgreichen Aufruf.

**Example DynamodbTimeWindowEvent**  

```
{
   "Records":[
      {
         "eventID":"1",
         "eventName":"INSERT",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "NewImage":{
               "Message":{
                  "S":"New item!"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"111",
            "SizeBytes":26,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      },
      {
         "eventID":"2",
         "eventName":"MODIFY",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "NewImage":{
               "Message":{
                  "S":"This item has changed"
               },
               "Id":{
                  "N":"101"
               }
            },
            "OldImage":{
               "Message":{
                  "S":"New item!"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"222",
            "SizeBytes":59,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      },
      {
         "eventID":"3",
         "eventName":"REMOVE",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "OldImage":{
               "Message":{
                  "S":"This item has changed"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"333",
            "SizeBytes":38,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      }
   ],
    "window": {
        "start": "2020-07-30T17:00:00Z",
        "end": "2020-07-30T17:05:00Z"
    },
    "state": {
        "1": "state1"
    },
    "shardId": "shard123456789",
    "eventSourceARN": "stream-ARN",
    "isFinalInvokeForWindow": false,
    "isWindowTerminatedEarly": false
}
```

## Konfiguration
<a name="streams-tumbling-config"></a>

Sie können rollierende Fenster konfigurieren, wenn Sie eine Ereignisquellenzuordnung erstellen oder aktualisieren. Um ein Tumbling-Fenster zu konfigurieren, geben Sie das Fenster in Sekunden an (). [TumblingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-TumblingWindowInSeconds) Mit dem folgenden Beispielbefehl AWS Command Line Interface (AWS CLI) wird eine Quellenzuordnung für Streaming-Ereignisse erstellt, die ein Wechselfenster von 120 Sekunden hat. Die für Aggregation und Verarbeitung definierte Lambda-Funktion wird `tumbling-window-example-function` genannt.

```
aws lambda create-event-source-mapping \
--event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525 \
--function-name tumbling-window-example-function \
--starting-position TRIM_HORIZON \
--tumbling-window-in-seconds 120
```

Lambda bestimmt die rollierenden Fenstergrenzen basierend auf dem Zeitpunkt, zu dem Datensätze in den Stream eingefügt wurden. Für alle Datensätze steht ein ungefährer Zeitstempel zur Verfügung, den Lambda in Grenzbestimmungen verwendet.

Rollierende Fensteraggregationen unterstützen kein Resharding. Wenn der Shard endet, betrachtet Lambda das Fenster als geschlossen und die untergeordneten Shards beginnen ihr eigenes Fenster in einem neuen Zustand.

Rollierende Fenster unterstützen vollständig die bestehenden Wiederholungsrichtlinien `maxRetryAttempts` und `maxRecordAge`.

**Example Handler.py – Aggregation und Verarbeitung**  
Die folgende Python-Funktion veranschaulicht, wie Sie Ihren Endzustand aggregieren und dann verarbeiten:  

```
def lambda_handler(event, context):
    print('Incoming event: ', event)
    print('Incoming state: ', event['state'])

#Check if this is the end of the window to either aggregate or process.
    if event['isFinalInvokeForWindow']:
        # logic to handle final state of the window
        print('Destination invoke')
    else:
        print('Aggregate invoke')

#Check for early terminations
    if event['isWindowTerminatedEarly']:
        print('Window terminated early')

    #Aggregation logic
    state = event['state']
    for record in event['Records']:
        state[record['dynamodb']['NewImage']['Id']] = state.get(record['dynamodb']['NewImage']['Id'], 0) + 1

    print('Returning state: ', state)
    return {'state': state}
```

# Lambdaparameter für Amazon DynamoDB-SQS-Zuordnungen von Ereignisquellen
<a name="services-ddb-params"></a>

Alle Lambda-Ereignisquelltypen verwenden dieselben [CreateEventSourceMapping[UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)API-Operationen. Allerdings gelten nur einige der Parameter für DynamoDB Streams.


| Parameter | Erforderlich | Standard | Hinweise | 
| --- | --- | --- | --- | 
|  BatchSize  |  N  |  100  |  Höchstwert: 10 000.  | 
|  BisectBatchOnFunctionError  |  N  |  false  | Keine  | 
|  DestinationConfig  |  N  | –  |  Ein Ziel der Amazon-SQS-Standardwarteschlange oder des Amazon-SNS-Standardthemas für verworfene Datensätze  | 
|  Aktiviert  |  N  |  true  | Keine  | 
|  EventSourceArn  |  Y  | – |  Der ARN des Datenstroms oder eines Stream-Konsumenten  | 
|  FilterCriteria  |  N  | –  |  [Steuern Sie, welche Ereignisse Lambda an Ihre Funktion sendet](invocation-eventfiltering.md)  | 
|  FunctionName  |  Y  | –  | Keine  | 
|  FunctionResponseTypes  |  N  | – |  Damit Ihre Funktion bestimmte Fehler in einem Batch meldet, beziehen Sie den Wert `ReportBatchItemFailures` in `FunctionResponseTypes` ein. Weitere Informationen finden Sie unter [Konfigurieren einer teilweisen Batch-Antwort mit DynamoDB und Lambda](services-ddb-batchfailurereporting.md).  | 
|  MaximumBatchingWindowInSeconds  |  N  |  0  | Keine  | 
|  MaximumRecordAgeInSeconds  |  N  |  -1  |  -1 bedeutet unendlich: Fehlgeschlagene Datensätze werden wiederholt, bis der Datensatz abläuft. Das [Datenaufbewahrungslimit für DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html#Streams.DataRetention) beträgt 24 Stunden. Minimum: -1 Höchstwert: 604 800  | 
|  MaximumRetryAttempts  |  N  |  -1  |  -1 bedeutet unendlich: Fehlgeschlagene Datensätze werden wiederholt, bis der Datensatz abläuft Minimum: 0 Höchstwert: 10 000.  | 
|  ParallelizationFactor  |  N  |  1  |  Maximum: 10  | 
|  StartingPosition  |  Y  | –  |  TRIM\$1HORIZON oder LATEST  | 
|  TumblingWindowInSeconds  |  N  | –  |  Minimum: 0 Maximum: 900  | 

# Verwendung der Ereignisfilterung mit einer DynamoDB-Ereignisquelle
<a name="with-ddb-filtering"></a>

Sie können die Ereignisfilterung verwenden, um zu steuern, welche Datensätze aus einem Stream oder einer Warteschlange Lambda an Ihre Funktion sendet. Allgemeine Informationen über die Funktionsweise der Ereignisfilterung finden Sie unter [Steuern Sie, welche Ereignisse Lambda an Ihre Funktion sendet](invocation-eventfiltering.md).

Dieser Abschnitt konzentriert sich auf die Ereignisfilterung für DynamoDB-Ereignisquellen.

**Anmerkung**  
DynamoDB-Zuordnungen von Ereignisquellen unterstützen nur das Filtern nach dem `dynamodb`-Schlüssel.

**Topics**
+ [

## DynamoDB-Ereignis
](#filtering-ddb)
+ [

## Filterung mit Tabellenattributen
](#filtering-ddb-attributes)
+ [

## Filterung mit booleschen Ausdrücken
](#filtering-ddb-boolean)
+ [

## Verwenden des Exists-Operators
](#filtering-ddb-exists)
+ [

## JSON-Format für DynamoDB-Filterung
](#filtering-ddb-JSON-format)

## DynamoDB-Ereignis
<a name="filtering-ddb"></a>

Angenommen, Sie haben eine DynamoDB-Tabelle mit dem Primärschlüssel `CustomerName` und den Attributen `AccountManager` und `PaymentTerms`. Im Folgenden sehen Sie einen Beispieldatensatz aus dem Stream Ihrer DynamoDB-Tabelle.

```
{
      "eventID": "1",
      "eventVersion": "1.0",
      "dynamodb": {
          "ApproximateCreationDateTime": "1678831218.0",
          "Keys": {
              "CustomerName": {
                  "S": "AnyCompany Industries"
              }
          },
          "NewImage": {
              "AccountManager": {
                  "S": "Pat Candella"
              },
              "PaymentTerms": {
                  "S": "60 days"
              },
              "CustomerName": {
                  "S": "AnyCompany Industries"
              }
          },
          "SequenceNumber": "111",
          "SizeBytes": 26,
          "StreamViewType": "NEW_IMAGE"
      }
  }
```

Um anhand der Schlüssel- und Attributwerte in Ihrer DynamoDB-Tabelle zu filtern, verwenden Sie den `dynamodb`-Schlüssel im Datensatz. Die folgenden Abschnitte enthalten Beispiele für verschiedene Filtertypen.

### Filtern mit Tabellenschlüsseln
<a name="filtering-ddb-keys"></a>

Angenommen, Sie möchten, dass Ihre Funktion nur die Datensätze verarbeitet, deren Primärschlüssel `CustomerName` "AnyCompany Industries" lautet. Das `FilterCriteria`-Objekt würde wie folgt aussehen.

```
{
     "Filters": [
          {
              "Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"
          }
      ]
 }
```

Zur Verdeutlichung sehen Sie hier den Wert des Filter-`Pattern` in reinem JSON. 

```
{
     "dynamodb": {
          "Keys": {
              "CustomerName": {
                  "S": [ "AnyCompany Industries" ]
                  }
              }
          }
 }
```

Sie können Ihren Filter mithilfe der Konsole, AWS CLI oder einer AWS SAM-Vorlage hinzufügen.

------
#### [ Console ]

Um diesen Filter mithilfe der Konsole hinzuzufügen, folgen Sie den Anweisungen unter [Anhängen von Filterkriterien an eine Ereignisquellenzuordnung (Konsole)](invocation-eventfiltering.md#filtering-console) und geben Sie die folgende Zeichenfolge für die **Filterkriterien** ein.

```
{ "dynamodb" : { "Keys" : { "CustomerName" : { "S" : [ "AnyCompany Industries" ] } } } }
```

------
#### [ AWS CLI ]

Um eine neue Zuordnung von Ereignisquellen mit diesen Filterkriterien über die AWS Command Line Interface (AWS CLI) zu erstellen, führen Sie den folgenden Befehl aus.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"}]}'
```

Führen Sie den folgenden Befehl aus, um diese Filterkriterien zu einer vorhandenen Zuordnung von Ereignisquellen hinzuzufügen.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"}]}'
```

------
#### [ AWS SAM ]

Um diesen Filter mit der AWS SAM hinzuzufügen, fügen Sie das folgende Snippet zur YAML-Vorlage für Ihre Ereignisquelle hinzu.

```
FilterCriteria:
   Filters:
     - Pattern: '{ "dynamodb" : { "Keys" : { "CustomerName" : { "S" : [ "AnyCompany Industries" ] } } } }'
```

------

## Filterung mit Tabellenattributen
<a name="filtering-ddb-attributes"></a>

Mit DynamoDB können Sie auch die Schlüssel `NewImage` und `OldImage` verwenden, um nach Attributwerten zu filtern. Angenommen, Sie möchten Datensätze filtern, bei denen das `AccountManager`-Attribut im letzten Tabellenbild "Pat Candella" oder "Shirley Rodriguez" lautet. Das `FilterCriteria`-Objekt würde wie folgt aussehen.

```
{
    "Filters": [
        {
            "Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"
        }
    ]
}
```

Zur Verdeutlichung sehen Sie hier den Wert des Filter-`Pattern` in reinem JSON.

```
{
    "dynamodb": {
        "NewImage": {
            "AccountManager": {
                "S": [ "Pat Candella", "Shirley Rodriguez" ]
            }
        }
    }
}
```

Sie können Ihren Filter mithilfe der Konsole, AWS CLI oder einer AWS SAM-Vorlage hinzufügen.

------
#### [ Console ]

Um diesen Filter mithilfe der Konsole hinzuzufügen, folgen Sie den Anweisungen unter [Anhängen von Filterkriterien an eine Ereignisquellenzuordnung (Konsole)](invocation-eventfiltering.md#filtering-console) und geben Sie die folgende Zeichenfolge für die **Filterkriterien** ein.

```
{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella", "Shirley Rodriguez" ] } } } }
```

------
#### [ AWS CLI ]

Um eine neue Zuordnung von Ereignisquellen mit diesen Filterkriterien über die AWS Command Line Interface (AWS CLI) zu erstellen, führen Sie den folgenden Befehl aus.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"}]}'
```

Führen Sie den folgenden Befehl aus, um diese Filterkriterien zu einer vorhandenen Zuordnung von Ereignisquellen hinzuzufügen.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"}]}'
```

------
#### [ AWS SAM ]

Um diesen Filter mit der AWS SAM hinzuzufügen, fügen Sie das folgende Snippet zur YAML-Vorlage für Ihre Ereignisquelle hinzu.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella", "Shirley Rodriguez" ] } } } }'
```

------

## Filterung mit booleschen Ausdrücken
<a name="filtering-ddb-boolean"></a>

Sie können Filter auch mithilfe von booleschen UND-Ausdrücken erstellen. Diese Ausdrücke können sowohl die Schlüssel- als auch die Attributparameter Ihrer Tabelle enthalten. Angenommen, Sie möchten Datensätze filtern, bei denen der `NewImage`-Wert von `AccountManager` „Pat Candella“ und der `OldImage`-Wert „Terry Whitlock“ ist. Das `FilterCriteria`-Objekt würde wie folgt aussehen.

```
{
    "Filters": [
        {
            "Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } }"
        }
    ]
}
```

Zur Verdeutlichung sehen Sie hier den Wert des Filter-`Pattern` in reinem JSON.

```
{ 
    "dynamodb" : { 
        "NewImage" : { 
            "AccountManager" : { 
                "S" : [ 
                    "Pat Candella" 
                ] 
            } 
        } 
    }, 
    "dynamodb": { 
        "OldImage": { 
            "AccountManager": { 
                "S": [ 
                    "Terry Whitlock" 
                ] 
            } 
        } 
    } 
}
```

Sie können Ihren Filter mithilfe der Konsole, AWS CLI oder einer AWS SAM-Vorlage hinzufügen.

------
#### [ Console ]

Um diesen Filter mithilfe der Konsole hinzuzufügen, folgen Sie den Anweisungen unter [Anhängen von Filterkriterien an eine Ereignisquellenzuordnung (Konsole)](invocation-eventfiltering.md#filtering-console) und geben Sie die folgende Zeichenfolge für die **Filterkriterien** ein.

```
{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } } , "dynamodb" : { "OldImage" : { "AccountManager" : { "S" : [ "Terry Whitlock" ] } } } }
```

------
#### [ AWS CLI ]

Um eine neue Zuordnung von Ereignisquellen mit diesen Filterkriterien über die AWS Command Line Interface (AWS CLI) zu erstellen, führen Sie den folgenden Befehl aus.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } } "}]}'
```

Führen Sie den folgenden Befehl aus, um diese Filterkriterien zu einer vorhandenen Zuordnung von Ereignisquellen hinzuzufügen.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } } "}]}'
```

------
#### [ AWS SAM ]

Um diesen Filter mit der AWS SAM hinzuzufügen, fügen Sie das folgende Snippet zur YAML-Vorlage für Ihre Ereignisquelle hinzu.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } } , "dynamodb" : { "OldImage" : { "AccountManager" : { "S" : [ "Terry Whitlock" ] } } } }'
```

------

**Anmerkung**  
Die DynamoDB-Ereignisfilterung unterstützt nicht die Verwendung von numerischen Operatoren (numerisch gleich und numerisch Bereich). Auch wenn Elemente in Ihrer Tabelle als Zahlen gespeichert sind, werden diese Parameter im JSON-Datensatzobjekt in Strings umgewandelt.

## Verwenden des Exists-Operators
<a name="filtering-ddb-exists"></a>

Aufgrund der Struktur von JSON-Ereignisobjekten aus DynamoDB ist bei der Verwendung des Operators „Exists“ besondere Vorsicht geboten. Der Exists-Operator funktioniert nur bei Blattknoten im Ereignis-JSON. Wenn Ihr Filtermuster also Exists verwendet, um nach einem Zwischenknoten zu suchen, wird es nicht funktionieren. Betrachten Sie das folgende DynamoDB-Tabellenelement:

```
{
  "UserID": {"S": "12345"},
  "Name": {"S": "John Doe"},
  "Organizations": {"L": [
      {"S":"Sales"},
      {"S":"Marketing"},
      {"S":"Support"}
    ]
  }
}
```

Möglicherweise möchten Sie ein Filtermuster wie das folgende erstellen, das nach Ereignissen sucht, die `"Organizations"` enthalten:

```
{ "dynamodb" : { "NewImage" : { "Organizations" : [ { "exists": true } ] } } }
```

Dieses Filtermuster würde jedoch nie eine Übereinstimmung ergeben, da `"Organizations"` kein Blattknoten ist. Das folgende Beispiel zeigt, wie der Operator „Exists“ richtig verwendet wird, um das gewünschte Filtermuster zu erstellen:

```
{ "dynamodb" : { "NewImage" : {"Organizations": {"L": {"S": [ {"exists": true } ] } } } } }
```

## JSON-Format für DynamoDB-Filterung
<a name="filtering-ddb-JSON-format"></a>

Um Ereignisse aus DynamoDB-Quellen richtig zu filtern, müssen sowohl das Datenfeld als auch Ihre Filterkriterien für das Datenfeld (`dynamodb`) im gültigen JSON-Format vorliegen. Wenn eines der Felder kein gültiges JSON-Format hat, verwirft Lambda die Nachricht oder gibt eine Ausnahme aus. In der folgenden Tabelle ist das Verhalten zusammengefasst: 


| Format der eingehenden Daten | Filtermusterformat für Dateneigenschaften | Resultierende Aktion | 
| --- | --- | --- | 
|  Gültiges JSON  |  Gültiges JSON  |  Lambda filtert basierend auf Ihren Filterkriterien.  | 
|  Gültiges JSON  |  Kein Filtermuster für Dateneigenschaften  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Gültiges JSON  |  Kein JSON  |  Lambda gibt zum Zeitpunkt der Erstellung oder Aktualisierung der Ereignisquellenzuordnung eine Ausnahme aus. Das Filtermuster für Dateneigenschaften muss ein gültiges JSON-Format haben.  | 
|  Kein JSON  |  Gültiges JSON  |  Lambda verwirft den Datensatz.  | 
|  Kein JSON  |  Kein Filtermuster für Dateneigenschaften  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Kein JSON  |  Kein JSON  |  Lambda gibt zum Zeitpunkt der Erstellung oder Aktualisierung der Ereignisquellenzuordnung eine Ausnahme aus. Das Filtermuster für Dateneigenschaften muss ein gültiges JSON-Format haben.  | 

# Tutorial: Verwendung AWS Lambda mit Amazon DynamoDB DynamoDB-Streams
<a name="with-ddb-example"></a>

 In diesem Tutorial erstellen Sie eine Lambda-Funktion zum Verarbeiten von Ereignissen aus einem Amazon-DynamoDB-Stream.

## Voraussetzungen
<a name="with-ddb-prepare"></a>

### Installieren Sie das AWS Command Line Interface
<a name="install_aws_cli"></a>

Wenn Sie das noch nicht installiert haben AWS Command Line Interface, folgen Sie den Schritten unter [Installieren oder Aktualisieren der neuesten Version von AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), um es zu installieren.

Das Tutorial erfordert zum Ausführen von Befehlen ein Befehlszeilenterminal oder eine Shell. Verwenden Sie unter Linux und macOS Ihre bevorzugte Shell und Ihren bevorzugten Paketmanager.

**Anmerkung**  
In Windows werden einige Bash-CLI-Befehle, die Sie häufig mit Lambda verwenden (z. B. `zip`), von den integrierten Terminals des Betriebssystems nicht unterstützt. Um eine in Windows integrierte Version von Ubuntu und Bash zu erhalten, [installieren Sie das Windows-Subsystem für Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). 

## Erstellen der Ausführungsrolle
<a name="with-ddb-create-execution-role"></a>

Erstellen Sie die [Ausführungsrolle](lambda-intro-execution-role.md), die Ihrer Funktion die Berechtigung zum Zugriff auf AWS Ressourcen erteilt.

**So erstellen Sie eine Ausführungsrolle**

1. Öffnen Sie die Seite [Roles (Rollen)](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie **Rolle erstellen** aus.

1. Erstellen Sie eine Rolle mit den folgenden Eigenschaften.
   + **Vertrauenswürdige Entität** – Lambda.
   + **Berechtigungen** — **AWSLambdaDBExecutionDynamo-Rolle**.
   + **Role name (Name der Rolle** – **lambda-dynamodb-role**.

Die **AWSLambdaDBExecutionDynamo-Rolle** verfügt über die Berechtigungen, die die Funktion benötigt, um Elemente aus DynamoDB zu lesen und Protokolle in Logs zu schreiben. CloudWatch 

## Erstellen der Funktion
<a name="with-ddb-example-create-function"></a>

Erstellen Sie eine Lambda-Funktion, die Ihre DynamoDB-Ereignisse verarbeitet. Der Funktionscode schreibt einige der eingehenden Ereignisdaten in Logs. CloudWatch 

------
#### [ .NET ]

**SDK für .NET**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Nutzen eines DynamoDB-Ereignisses mit Lambda unter Verwendung von .NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using System.Text.Json;
using System.Text;
using Amazon.Lambda.Core;
using Amazon.Lambda.DynamoDBEvents;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace AWSLambda_DDB;

public class Function
{
    public void FunctionHandler(DynamoDBEvent dynamoEvent, ILambdaContext context)
    {
        context.Logger.LogInformation($"Beginning to process {dynamoEvent.Records.Count} records...");

        foreach (var record in dynamoEvent.Records)
        {
            context.Logger.LogInformation($"Event ID: {record.EventID}");
            context.Logger.LogInformation($"Event Name: {record.EventName}");

            context.Logger.LogInformation(JsonSerializer.Serialize(record));
        }

        context.Logger.LogInformation("Stream processing complete.");
    }
}
```

------
#### [ Go ]

**SDK für Go V2**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Nutzen eines DynamoDB-Ereignisses mit Lambda unter Verwendung von Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main

import (
	"context"
	"github.com/aws/aws-lambda-go/lambda"
	"github.com/aws/aws-lambda-go/events"
	"fmt"
)

func HandleRequest(ctx context.Context, event events.DynamoDBEvent) (*string, error) {
	if len(event.Records) == 0 {
		return nil, fmt.Errorf("received empty event")
	}

	for _, record := range event.Records {
	 	LogDynamoDBRecord(record)
	}

	message := fmt.Sprintf("Records processed: %d", len(event.Records))
	return &message, nil
}

func main() {
	lambda.Start(HandleRequest)
}

func LogDynamoDBRecord(record events.DynamoDBEventRecord){
	fmt.Println(record.EventID)
	fmt.Println(record.EventName)
	fmt.Printf("%+v\n", record.Change)
}
```

------
#### [ Java ]

**SDK für Java 2.x**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Nutzen eines DynamoDB-Ereignisses mit Lambda unter Verwendung von Java.  

```
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent.DynamodbStreamRecord;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class example implements RequestHandler<DynamodbEvent, Void> {

    private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();

    @Override
    public Void handleRequest(DynamodbEvent event, Context context) {
        System.out.println(GSON.toJson(event));
        event.getRecords().forEach(this::logDynamoDBRecord);
        return null;
    }

    private void logDynamoDBRecord(DynamodbStreamRecord record) {
        System.out.println(record.getEventID());
        System.out.println(record.getEventName());
        System.out.println("DynamoDB Record: " + GSON.toJson(record.getDynamodb()));
    }
}
```

------
#### [ JavaScript ]

**SDK für JavaScript (v3)**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Konsumieren eines DynamoDB-Ereignisses mit Lambda unter Verwendung. JavaScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
    console.log(JSON.stringify(event, null, 2));
    event.Records.forEach(record => {
        logDynamoDBRecord(record);
    });
};

const logDynamoDBRecord = (record) => {
    console.log(record.eventID);
    console.log(record.eventName);
    console.log(`DynamoDB Record: ${JSON.stringify(record.dynamodb)}`);
};
```
Konsumieren eines DynamoDB-Ereignisses mit Lambda unter Verwendung. TypeScript  

```
export const handler = async (event, context) => {
    console.log(JSON.stringify(event, null, 2));
    event.Records.forEach(record => {
        logDynamoDBRecord(record);
    });
}
const logDynamoDBRecord = (record) => {
    console.log(record.eventID);
    console.log(record.eventName);
    console.log(`DynamoDB Record: ${JSON.stringify(record.dynamodb)}`);
};
```

------
#### [ PHP ]

**SDK für PHP**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Nutzen eines DynamoDB-Ereignisses mit Lambda unter Verwendung von PHP.  

```
<?php

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\DynamoDb\DynamoDbEvent;
use Bref\Event\DynamoDb\DynamoDbHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler extends DynamoDbHandler
{
    private StderrLogger $logger;

    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws JsonException
     * @throws \Bref\Event\InvalidLambdaEvent
     */
    public function handleDynamoDb(DynamoDbEvent $event, Context $context): void
    {
        $this->logger->info("Processing DynamoDb table items");
        $records = $event->getRecords();

        foreach ($records as $record) {
            $eventName = $record->getEventName();
            $keys = $record->getKeys();
            $old = $record->getOldImage();
            $new = $record->getNewImage();
            
            $this->logger->info("Event Name:".$eventName."\n");
            $this->logger->info("Keys:". json_encode($keys)."\n");
            $this->logger->info("Old Image:". json_encode($old)."\n");
            $this->logger->info("New Image:". json_encode($new));
            
            // TODO: Do interesting work based on the new data

            // Any exception thrown will be logged and the invocation will be marked as failed
        }

        $totalRecords = count($records);
        $this->logger->info("Successfully processed $totalRecords items");
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

------
#### [ Python ]

**SDK für Python (Boto3)**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Nutzen eines DynamoDB-Ereignisses mit Lambda unter Verwendung von Python.  

```
import json

def lambda_handler(event, context):
    print(json.dumps(event, indent=2))

    for record in event['Records']:
        log_dynamodb_record(record)

def log_dynamodb_record(record):
    print(record['eventID'])
    print(record['eventName'])
    print(f"DynamoDB Record: {json.dumps(record['dynamodb'])}")
```

------
#### [ Ruby ]

**SDK für Ruby**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Nutzen eines DynamoDB-Ereignisses mit Lambda unter Verwendung von Ruby.  

```
def lambda_handler(event:, context:)
    return 'received empty event' if event['Records'].empty?
  
    event['Records'].each do |record|
      log_dynamodb_record(record)
    end
  
    "Records processed: #{event['Records'].length}"
  end
  
  def log_dynamodb_record(record)
    puts record['eventID']
    puts record['eventName']
    puts "DynamoDB Record: #{JSON.generate(record['dynamodb'])}"
  end
```

------
#### [ Rust ]

**SDK für Rust**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Nutzen eines DynamoDB-Ereignisses mit Lambda unter Verwendung von Rust.  

```
use lambda_runtime::{service_fn, tracing, Error, LambdaEvent};
use aws_lambda_events::{
    event::dynamodb::{Event, EventRecord},
   };


// Built with the following dependencies:
//lambda_runtime = "0.11.1"
//serde_json = "1.0"
//tokio = { version = "1", features = ["macros"] }
//tracing = { version = "0.1", features = ["log"] }
//tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] }
//aws_lambda_events = "0.15.0"

async fn function_handler(event: LambdaEvent<Event>) ->Result<(), Error> {
    
    let records = &event.payload.records;
    tracing::info!("event payload: {:?}",records);
    if records.is_empty() {
        tracing::info!("No records found. Exiting.");
        return Ok(());
    }

    for record in records{
        log_dynamo_dbrecord(record);
    }

    tracing::info!("Dynamo db records processed");

    // Prepare the response
    Ok(())

}

fn log_dynamo_dbrecord(record: &EventRecord)-> Result<(), Error>{
    tracing::info!("EventId: {}", record.event_id);
    tracing::info!("EventName: {}", record.event_name);
    tracing::info!("DynamoDB Record: {:?}", record.change );
    Ok(())

}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
    .with_max_level(tracing::Level::INFO)
    .with_target(false)
    .without_time()
    .init();

    let func = service_fn(function_handler);
    lambda_runtime::run(func).await?;
    Ok(())
    
}
```

------

**So erstellen Sie die Funktion**

1. Kopieren Sie den Beispiel-Code in eine Datei mit dem Namen `example.js`.

1. Erstellen Sie ein Bereitstellungspaket.

   ```
   zip function.zip example.js
   ```

1. Erstellen Sie eine Lambda-Funktion mit dem Befehl `create-function`.

   ```
   aws lambda create-function --function-name ProcessDynamoDBRecords \
       --zip-file fileb://function.zip --handler example.handler --runtime nodejs24.x \
       --role arn:aws:iam::111122223333:role/lambda-dynamodb-role
   ```

## Lambda-Funktion testen
<a name="with-dbb-invoke-manually"></a>

In diesem Schritt rufen Sie Ihre Lambda-Funktion manuell mit dem `invoke` AWS Lambda CLI-Befehl und dem folgenden DynamoDB-Beispielereignis auf. Kopieren Sie den folgenden Code in eine Datei mit dem Namen `input.txt`.

**Example input.txt**  

```
{
   "Records":[
      {
         "eventID":"1",
         "eventName":"INSERT",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "NewImage":{
               "Message":{
                  "S":"New item!"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"111",
            "SizeBytes":26,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      },
      {
         "eventID":"2",
         "eventName":"MODIFY",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "NewImage":{
               "Message":{
                  "S":"This item has changed"
               },
               "Id":{
                  "N":"101"
               }
            },
            "OldImage":{
               "Message":{
                  "S":"New item!"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"222",
            "SizeBytes":59,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      },
      {
         "eventID":"3",
         "eventName":"REMOVE",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "OldImage":{
               "Message":{
                  "S":"This item has changed"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"333",
            "SizeBytes":38,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      }
   ]
}
```

Führen Sie den Befehl `invoke` aus. 

```
aws lambda invoke --function-name ProcessDynamoDBRecords \
    --cli-binary-format raw-in-base64-out \
    --payload file://input.txt outputfile.txt
```

Die **cli-binary-format** Option ist erforderlich, wenn Sie Version 2 verwenden. AWS CLI Um dies zur Standardeinstellung zu machen, führen Sie `aws configure set cli-binary-format raw-in-base64-out` aus. Weitere Informationen finden Sie unter [Von AWS CLI unterstützte globale Befehlszeilenoptionen](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) im *AWS Command Line Interface -Benutzerhandbuch für Version 2*.

Die Funktion gibt die Zeichenfolge `message` im Antworttext zurück. 

Überprüfen Sie die Ausgabe in der Datei `outputfile.txt`.

## Erstellen einer DynamoDB-Tabelle mit einem aktivierten Stream
<a name="with-ddb-create-buckets"></a>

Erstellen einer Amazon-DynamoDB-Tabelle mit einem aktivierten Stream.

**So erstellen Sie eine DynamoDB-Tabelle**

1. Öffnen Sie die [DynamoDB-Konsole](https://console.aws.amazon.com/dynamodb).

1. Wählen Sie **Create table** aus.

1. Erstellen Sie eine Tabelle mit den folgenden Einstellungen:
   + **Tabellenname** – **lambda-dynamodb-stream**
   + **Primärschlüssel** – **id** (Zeichenfolge)

1. Wählen Sie **Erstellen** aus.

**So aktivieren Sie Streams**

1. Öffnen Sie die [DynamoDB-Konsole](https://console.aws.amazon.com/dynamodb).

1. Wählen Sie **Tables (Tabellen)** aus.

1. Wählen Sie die **lambda-dynamodb-stream** Tabelle aus. 

1. Wählen Sie unter **Exports and streams** (Exporte und Streams) die Option **DynamoDB stream details** (Details zu DynamoDB-Streams) aus.

1. Wählen Sie **Turn on** (Einschalten) aus.

1. Wählen Sie als **Ansichtstyp** die Option **Nur Schlüsselattribute** aus.

1. Wählen Sie **Stream einschalten**.

Notieren Sie sich den Stream-ARN. Sie benötigen diesen im nächsten Schritt, um die Lambda-Funktion dem Stream zuzuordnen. Weitere Informationen zur Aktivierung von Streams finden Sie unter [Erfassen von Tabellenaktivitäten mit DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html).

## Fügen Sie eine Ereignisquelle hinzu in AWS Lambda
<a name="with-ddb-attach-notification-configuration"></a>

Erstellen Sie eine Ereignisquellenzuordnung in AWS Lambda. Diese Ereignisquellenzuordnung ordnet den DynamoDB-Stream Ihrer Lambda-Funktion zu. Nachdem Sie diese Ereignisquellenzuordnung erstellt haben, AWS Lambda beginnt die Abfrage des Streams.

Führen Sie den Befehl AWS CLI `create-event-source-mapping` aus. Notieren Sie sich die UUID, nachdem Sie den Befehl ausgeführt haben. Sie benötigen diese UUID, um in Befehlen auf die Ereignisquellenzuordnung zu verweisen (beispielsweise beim Löschen der Ereignisquellen-Zuweisung).

```
aws lambda create-event-source-mapping --function-name ProcessDynamoDBRecords \
    --batch-size 100 --starting-position LATEST --event-source DynamoDB-stream-arn
```

 Dadurch wird eine Zuweisung zwischen dem angegebenen DynamoDB-Stream und der Lambda-Funktion erstellt. Sie können einen DynamoDB-Stream mehreren Lambda-Funktionen und dieselbe Lambda-Funktion mehreren Streams zuordnen. Die Lambda-Funktionen teilen jedoch den Lesedurchsatz für den geteilten Stream. 

Sie erhalten die Liste der Ereignisquellen-Zuweisungen, indem Sie folgenden Befehl ausführen.

```
aws lambda list-event-source-mappings
```

Die Liste gibt alle von Ihnen erstellten Ereignisquellenzuordnungen zurück und für jede Zuordnung zeigt sie u. a. den `LastProcessingResult`. Dieses Feld wird verwendet, um eine informative Meldung bereitzustellen, wenn Probleme auftreten. Werte wie `No records processed` (gibt an, dass die Abfrage nicht gestartet AWS Lambda wurde oder dass der Stream keine Datensätze enthält) und `OK` (gibt an, dass Datensätze AWS Lambda erfolgreich aus dem Stream gelesen und Ihre Lambda-Funktion aufgerufen wurden) zeigen an, dass keine Probleme vorliegen. Bei Problemen erhalten Sie eine Fehlermeldung.

Bei einer großen Anzahl von Ereignisquellen-Zuweisungen verwenden Sie den Funktionsnamen-Parameter, um die Ergebnisse einzugrenzen.

```
aws lambda list-event-source-mappings --function-name ProcessDynamoDBRecords
```

## Testen der Einrichtung
<a name="with-ddb-final-integration-test-no-iam"></a>

Testen Sie das Erlebnis. end-to-end Beim Aktualisieren der Tabelle schreibt DynamoDB Ereignisdatensätze in den Stream. Da AWS Lambda den Stream abfragt, erkennt es neue Datensätze im Stream und ruft Ihre Lambda-Funktion für Sie auf, indem Ereignisse an die Funktion übergeben werden. 

1. Fügen Sie in der DynamoDB-Konsole Elemente hinzu, aktualisieren und löschen Sie diese und fügen Sie diese hinzu. DynamoDB schreibt Datensätze dieser Aktionen in den Stream.

1. AWS Lambda fragt den Stream ab und wenn es Aktualisierungen am Stream erkennt, ruft es Ihre Lambda-Funktion auf, indem es die im Stream gefundenen Ereignisdaten weitergibt.

1. Ihre Funktion wird in Amazon ausgeführt und erstellt Protokolle CloudWatch. Sie können die in der CloudWatch Amazon-Konsole gemeldeten Protokolle überprüfen.

## Nächste Schritte
<a name="with-ddb-next-steps"></a>

In diesem Tutorial haben Sie die Grundlagen der Verarbeitung von DynamoDB-Stream-Ereignissen mit Lambda kennengelernt. Bei Produktions-Workloads sollten Sie erwägen, eine Logik für teilweise Batch-Antworten zu implementieren, um einzelne Datensatzfehler effizienter zu handhaben. Das [Batchverarbeitungsprogramm](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) von Powertools for AWS Lambda ist in Python TypeScript, .NET und Java verfügbar und bietet hierfür eine robuste Lösung, die die Komplexität von partiellen Batch-Antworten automatisch handhabt und die Anzahl der Wiederholungen für erfolgreich verarbeitete Datensätze reduziert.

## Bereinigen Ihrer Ressourcen
<a name="cleanup"></a>

Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Durch das Löschen von AWS Ressourcen, die Sie nicht mehr verwenden, vermeiden Sie unnötige Kosten für Ihre. AWS-Konto

**So löschen Sie die Lambda-Funktion:**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion aus, die Sie erstellt haben.

1. Wählen Sie **Aktionen**, **Löschen** aus.

1. Geben Sie **confirm** in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie die Ausführungsrolle**

1. Öffnen Sie die Seite [Roles](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie die von Ihnen erstellte Ausführungsrolle aus.

1. Wählen Sie **Löschen** aus.

1. Geben Sie den Namen der Rolle in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie die DynamoDB-Tabelle**

1. Öffnen Sie die Seite [Tables (Tabellen)](https://console.aws.amazon.com//dynamodb/home#tables:) in der DynamoDB-Konsole.

1. Wählen Sie die von Ihnen erstellte Tabelle aus.

1. Wählen Sie **Löschen** aus.

1. Geben Sie **delete** in das Textfeld ein.

1. Wählen Sie **Delete Table** (Tabelle löschen).

# Verarbeiten Sie Amazon EC2-Lebenszyklusereignisse mit einer Lambda-Funktion
<a name="services-ec2"></a>

Sie können AWS Lambda verwenden, um Lebenszyklusereignisse aus Amazon Elastic Compute Cloud zu verarbeiten und Amazon-EC2-Ressourcen zu verwalten. Amazon EC2 sendet Ereignisse an [Amazon EventBridge (CloudWatch Events)](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) für [Lebenszyklus-Ereignisse](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-lifecycle.html), z. B. wenn eine Instance ihren Status ändert, wenn ein Volume-Snapshot von Amazon Elastic Block Store abgeschlossen wird oder wenn eine Spot Instance beendet werden soll. Sie konfigurieren EventBridge (CloudWatch Events), um diese Ereignisse zur Verarbeitung an eine Lambda-Funktion weiterzuleiten.

EventBridge (CloudWatch Events) ruft Ihre Lambda-Funktion asynchron mit dem Ereignisdokument von Amazon EC2 auf.

**Example Instance-Lebenszyklusereignis**  

```
{
    "version": "0",
    "id": "b6ba298a-7732-2226-xmpl-976312c1a050",
    "detail-type": "EC2 Instance State-change Notification",
    "source": "aws.ec2",
    "account": "111122223333",
    "time": "2019-10-02T17:59:30Z",
    "region": "us-east-1",
    "resources": [
        "arn:aws:ec2:us-east-1:111122223333:instance/i-0c314xmplcd5b8173"
    ],
    "detail": {
        "instance-id": "i-0c314xmplcd5b8173",
        "state": "running"
    }
}
```

Einzelheiten zur Konfiguration von Ereignissen finden Sie unter [Aufrufen einer Lambda-Funktion nach einem Zeitplan](with-eventbridge-scheduler.md). Eine Beispielfunktion, die Amazon-EBS-Snapshot-Benachrichtigungen verarbeitet, finden Sie unter [EventBridge Scheduler für Amazon EBS](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-cloud-watch-events.html).

Sie können auch das AWS-SDK verwenden, um Instances und andere Ressourcen mit der Amazon-EC2-API zu verwalten. 

## Erteilen von Berechtigungen für EventBridge (CloudWatch Events)
<a name="services-ec2-permissions"></a>

Um Lebenszyklusereignisse von Amazon EC2 zu verarbeiten, benötigt EventBridge (CloudWatch Events) die Erlaubnis, Ihre Funktion aufzurufen. Diese Berechtigung stammt aus der [ressourcenbasierten Richtlinie](access-control-resource-based.md) der Funktion. Wenn Sie die EventBridge (CloudWatch Events) Konsole verwenden, um einen Ereignisauslöser zu konfigurieren, aktualisiert die Konsole die ressourcenbasierte Richtlinie in Ihrem Namen. Andernfalls fügen Sie eine Anweisung wie die folgende hinzu:

**Example Ressourcenbasierte Richtlinienanweisung für Amazon-EC2-Lebenszyklusbenachrichtigungen**  

```
{
  "Sid": "ec2-events",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": "lambda:InvokeFunction",
  "Resource": "arn:aws:lambda:us-east-1:12456789012:function:my-function",
  "Condition": {
    "ArnLike": {
      "AWS:SourceArn": "arn:aws:events:us-east-1:12456789012:rule/*"
    }
  }
}
```

Verwenden Sie den `add-permission` AWS CLI-Befehl, um eine Anweisung hinzuzufügen.

```
aws lambda add-permission --action lambda:InvokeFunction --statement-id ec2-events \
--principal events.amazonaws.com --function-name my-function --source-arn 'arn:aws:events:us-east-1:12456789012:rule/*'
```

Wenn Ihre Funktion das AWS-SDK zum Verwalten von Amazon-EC2-Ressourcen verwendet, fügen Sie der [Ausführungsrolle](lambda-intro-execution-role.md) der Funktion Amazon-EC2-Berechtigungen hinzu.

# Verarbeiten von Application Load Balancer-Anfragen mit Lambda
<a name="services-alb"></a>

Sie können eine Lambda-Funktion verwenden, um Anforderungen aus einem Application Load Balancer zu verarbeiten. Elastic Load Balancing unterstützt Lambda-Funktionen als Ziel für Application Load Balancer. Sie können Load Balancer-Regeln zum Weiterleiten von HTTP-Anforderungen an eine Funktion verwenden, basierend auf Pfad- oder Header-Werten. Die Anforderung wird verarbeitet und es wird eine HTTP-Antwort aus Ihrer Lambda-Funktion zurückgegeben.

Elastic Load Balancing ruft Ihre Lambda-Funktion synchron mit einem Ereignis auf, das den Text und die Metadaten der Anforderung enthält.

**Example Anforderungsereignis von einem Application Load Balancer**  

```
{
    "requestContext": {
        "elb": {
            "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/lambda-279XGJDqGZ5rsrHC2Fjr/49e9d65c45c6791a"
        }
    },
    "httpMethod": "GET",
    "path": "/lambda",
    "queryStringParameters": {
        "query": "1234ABCD"
    },
    "headers": {
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "accept-encoding": "gzip",
        "accept-language": "en-US,en;q=0.9",
        "connection": "keep-alive",
        "host": "lambda-alb-123578498.us-east-1.elb.amazonaws.com",
        "upgrade-insecure-requests": "1",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
        "x-amzn-trace-id": "Root=1-5c536348-3d683b8b04734faae651f476",
        "x-forwarded-for": "72.12.164.125",
        "x-forwarded-port": "80",
        "x-forwarded-proto": "http",
        "x-imforwards": "20"
    },
    "body": "",
    "isBase64Encoded": False
}
```

Ihre Funktion verarbeitet das Ereignis und gibt ein Antwortdokument in JSON an den Load Balancer zurück. Elastic Load Balancing konvertiert das Dokument in eine HTTP-Erfolgs- oder Fehlerantwort und gibt es an den Benutzer zurück.

**Example Format des Antwortdokuments**  

```
{
    "statusCode": 200,
    "statusDescription": "200 OK",
    "isBase64Encoded": False,
    "headers": {
        "Content-Type": "text/html"
    },
    "body": "<h1>Hello from Lambda!</h1>"
}
```

Um eine Application Load Balancer als Funktionsauslöser zu konfigurieren, gewähren Sie Elastic Load Balancing die Berechtigung zur Ausführung der Funktion, erstellen eine Zielgruppe, die Anforderungen an die Funktion weiterleitet und fügen dem Load Balancer eine Regel hinzu, die Anforderungen an die Zielgruppe sendet.

Sie können den Befehl `add-permission` verwenden, um der ressourcenbasierten Richtlinie Ihrer Funktion eine Berechtigungsanweisung hinzuzufügen.

```
aws lambda add-permission --function-name alb-function \
--statement-id load-balancer --action "lambda:InvokeFunction" \
--principal elasticloadbalancing.amazonaws.com
```

Die Ausgabe sollte folgendermaßen aussehen:

```
{
    "Statement": "{\"Sid\":\"load-balancer\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"elasticloadbalancing.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-west-2:123456789012:function:alb-function\"}"
}
```

Anweisungen zum Konfigurieren des Application Load Balancer-Listeners und der Zielgruppe finden Sie unter [Lambda-Funktionen als Ziel](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html) im *Benutzerhandbuch für Application Load Balancer*.

## Event-Handler von Powertools für Lambda AWS
<a name="services-alb-powertools"></a>

Der Event-Handler aus dem Powertools for AWS Lambda-Toolkit bietet Routing, Middleware, CORS-Konfiguration, Generierung von OpenAPI-Spezifikationen, Anforderungsvalidierung, Fehlerbehandlung und andere nützliche Funktionen beim Schreiben von Lambda-Funktionen, die von einem Application Load Balancer aufgerufen werden. Das Dienstprogramm für den Ereignishandler ist für Python verfügbar. Weitere Informationen finden Sie unter [Event Handler REST API](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/) in der Dokumentation zu *Powertools for AWS Lambda (Python)*.

### Python
<a name="services-alb-powertools-python"></a>

```
import requests
from requests import Response

from aws_lambda_powertools import Logger, Tracer
from aws_lambda_powertools.event_handler import ALBResolver
from aws_lambda_powertools.logging import correlation_paths
from aws_lambda_powertools.utilities.typing import LambdaContext

tracer = Tracer()
logger = Logger()
app = ALBResolver()


@app.get("/todos")
@tracer.capture_method
def get_todos():
    todos: Response = requests.get("https://jsonplaceholder.typicode.com/todos")
    todos.raise_for_status()

    # for brevity, we'll limit to the first 10 only
    return {"todos": todos.json()[:10]}


# You can continue to use other utilities just as before
@logger.inject_lambda_context(correlation_id_path=correlation_paths.APPLICATION_LOAD_BALANCER)
@tracer.capture_lambda_handler
def lambda_handler(event: dict, context: LambdaContext) -> dict:
    return app.resolve(event, context)
```

# Aufrufen einer Lambda-Funktion nach einem Zeitplan
<a name="with-eventbridge-scheduler"></a>

[Amazon EventBridge Scheduler](https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html) ist ein Serverless-Scheduler, mit dem Sie Aufgaben von einem zentralen, verwalteten Service aus erstellen, ausführen und verwalten können. Mit EventBridge Scheduler können Sie mithilfe von Cron- und Rate-Ausdrücken Zeitpläne für wiederkehrende Muster erstellen oder einmalige Aufrufe konfigurieren. Sie können flexible Zeitfenster für die Zustellung einrichten, Wiederholungslimits definieren und die maximale Aufbewahrungszeit für unverarbeitete Ereignisse festlegen.

Wenn Sie EventBridge Scheduler mit Lambda einrichten, ruft EventBridge Scheduler Ihre Lambda-Funktion asynchron auf. Auf dieser Seite wird erläutert, wie Sie mit EventBridge Scheduler eine Lambda-Funktion nach einem Zeitplan aufrufen.

## Einrichten der Ausführungsrolle
<a name="using-eventbridge-scheduler-execution-role"></a>

 Wenn Sie einen neuen Zeitplan erstellen, muss EventBridge Scheduler über die Berechtigung verfügen, seinen Ziel-API-Vorgang in Ihrem Namen aufzurufen. Sie gewähren EventBridge Scheduler diese Berechtigungen mithilfe einer *Ausführungsrolle*. Die Berechtigungsrichtlinie, die Sie der Ausführungsrolle Ihres Zeitplans hinzufügen, definiert die erforderlichen Berechtigungen. Diese Berechtigungen hängen von der Ziel-API ab, die EventBridge Scheduler aufrufen soll.

 Wenn Sie die EventBridge-Scheduler-Konsole zum Erstellen eines Zeitplans verwenden, wie im folgenden Verfahren, richtet EventBridge Scheduler automatisch eine Ausführungsrolle basierend auf Ihrem ausgewählten Ziel ein. Wenn Sie einen Zeitplan mit einem der EventBridge-Scheduler-SDKs (AWS CLI oder CloudFormation) erstellen möchten, müssen Sie über eine vorhandene Ausführungsrolle verfügen, die die Berechtigungen gewährt, die EventBridge Scheduler zum Aufrufen eines Ziels benötigt. Weitere Informationen zum manuellen Einrichten einer Ausführungsrolle für Ihren Zeitplan finden Sie unter [Einrichten einer Ausführungsrolle](https://docs.aws.amazon.com/scheduler/latest/UserGuide/setting-up.html#setting-up-execution-role) im *Benutzerhandbuch für EventBridge Scheduler*. 

## Erstellen eines Zeitplans
<a name="using-eventbridge-scheduler-create"></a>

**So erstellen Sie einen Zeitplan mithilfe der Konsole**

1. Öffnen Sie die Amazon-EventBridge-Scheduler-Konsole unter [https://console.aws.amazon.com/scheduler/home](https://console.aws.amazon.com/scheduler/home/).

1.  Wählen Sie auf der Seite **Zeitpläne** die Option **Zeitplan erstellen** aus. 

1.  Gehen Sie auf der Seite **Zeitplandetails angeben** im Abschnitt **Zeitplanname und -beschreibung** wie folgt vor: 

   1. Geben Sie unter **Zeitplanname** einen Namen für Ihren Zeitplan ein. Beispiel, **MyTestSchedule**. 

   1. (Optional) Geben Sie unter **Beschreibung** eine Beschreibung für Ihren Zeitplan ein. Beispiel, **My first schedule**.

   1. Wählen Sie für **Zeitplangruppe** eine Zeitplangruppe aus der Dropdown-Liste aus. Wenn Sie noch keine Gruppe haben, wählen Sie **Standard**. Um eine Zeitplangruppe zu erstellen, wählen Sie **Eigenen Zeitplan erstellen**. 

      Sie verwenden Zeitplangruppen, um Tags zu Zeitplangruppen hinzuzufügen. 

1. 

   1. Wählen Sie Ihre Zeitplanoptionen.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/with-eventbridge-scheduler.html)

1. (Optional) Wenn Sie im vorherigen Schritt **Wiederkehrender Zeitplan** ausgewählt haben, gehen Sie im Abschnitt **Zeitrahmen** wie folgt vor: 

   1. Wählen Sie unter **Zeitzone** eine Zeitzone aus. 

   1. Geben Sie für **Startdatum und -uhrzeit** ein gültiges Datum im `YYYY/MM/DD`-Format ein und geben Sie dann einen Zeitstempel im 24-Stunden-Format (`hh:mm`) an. 

   1. Geben Sie für **Enddatum und -uhrzeit** ein gültiges Datum im `YYYY/MM/DD`-Format ein und geben Sie dann einen Zeitstempel im 24-Stunden-Format (`hh:mm`) an. 

1. Wählen Sie **Weiter** aus. 

1. Wählen Sie auf der Seite **Ziel auswählen** den AWS-API-Vorgang aus, den EventBridge Scheduler aufruft: 

   1. Wählen Sie **AWS Lambda aufrufen** aus.

   1. Wählen Sie im Abschnitt **Aufrufen** eine Funktion aus oder wählen Sie **Neue Lambda-Funktion erstellen**.

   1. (Optional) Geben Sie eine JSON-Nutzlast ein. Wenn Sie keine Nutzlast eingeben, verwendet EventBridge Scheduler ein leeres Ereignis, um die Funktion aufzurufen.

1. Wählen Sie **Weiter** aus. 

1. Führen Sie auf der Seite **Settings (Einstellungen)** die folgenden Schritte aus: 

   1. Um den Zeitplan zu aktivieren, schalten Sie unter **Zeitplanstatus** die Option **Zeitplan aktivieren** ein. 

   1. Um eine Wiederholungsrichtlinie für Ihren Zeitplan zu konfigurieren, gehen Sie unter **Wiederholungsrichtlinie und Warteschlange für unzustellbare Nachrichten (DLQ)** wie folgt vor:
      + Aktivieren Sie die Option **Wiederholen**.
      + Geben Sie unter **Maximales Alter des Ereignisses** die maximale(n) **Stunde(n)** und **Minute(n)** ein, die EventBridge Scheduler ein unverarbeitetes Ereignis aufbewahren muss.
      + Die Höchstdauer beträgt 24 Stunden.
      + Geben Sie unter **Maximale Wiederholungsversuche** an, wie oft EventBridge Scheduler den Zeitplan maximal wiederholen soll, wenn das Ziel einen Fehler zurückgibt. 

         Der Maximalwert beträgt 185 Wiederholungen. 

      Bei Wiederholungsrichtlinien führt EventBridge Scheduler den Zeitplan erneut aus, wenn ein Zeitplan sein Ziel nicht aufrufen kann. Falls konfiguriert, müssen Sie die maximale Aufbewahrungszeit und Wiederholungsversuche für den Zeitplan festlegen.

   1. Wählen Sie aus, wo EventBridge Scheduler nicht zugestellte Ereignisse speichert.     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/with-eventbridge-scheduler.html)

   1. Um einen kundenverwalteten Schlüssel zur Verschlüsselung Ihrer Zieleingabe zu verwenden, wählen Sie unter **Verschlüsselung** die Option **Verschlüsselungseinstellungen anpassen (erweitert)**. 

      Wenn Sie diese Option wählen, geben Sie einen vorhandenen CMK-ARN ein oder wählen Sie **Erstellen eines AWS KMS key**, um zur AWS KMS-Konsole zu navigieren. Weitere Informationen darüber, wie EventBridge Scheduler Ihre Daten im Ruhezustand verschlüsselt, finden Sie unter [Verschlüsselung im Ruhezustand](https://docs.aws.amazon.com/scheduler/latest/UserGuide/encryption-rest.html) im *Benutzerhandbuch zu Amazon EventBridge Scheduler*. 

   1. Damit EventBridge Scheduler eine neue Ausführungsrolle für Sie erstellt, wählen Sie **Neue Rolle für diesen Zeitplan erstellen**. Geben Sie dann einen Namen für **Rollenname** ein. Wenn Sie diese Option wählen, fügt EventBridge Scheduler der Rolle die erforderlichen Berechtigungen für Ihr Vorlagenziel hinzu.

1. Wählen Sie **Weiter** aus. 

1.  Überprüfen Sie auf der Seite **Zeitplan überprüfen und erstellen** die Details Ihres Zeitplans. Wählen Sie in jedem Abschnitt **Bearbeiten** aus, um zu diesem Schritt zurückzukehren und seine Details zu bearbeiten. 

1. Wählen Sie **Zeitplan erstellen**. 

   Auf der Seite **Zeitpläne** können Sie eine Liste Ihrer neuen und vorhandenen Zeitpläne anzeigen. Überprüfen Sie in der Spalte **Status**, ob Ihr neuer Zeitplan **aktiviert** ist. 

Um zu bestätigen, dass EventBridge Scheduler die Funktion aufgerufen hat, [überprüfen Sie die Amazon CloudWatch Logs der Funktion](monitoring-cloudwatchlogs-view.md#monitoring-cloudwatchlogs-console).

## Zugehörige Ressourcen
<a name="using-eventbridge-scheduler-related-resources"></a>

 Weitere Informationen zum EventBridge Scheduler finden Sie hier: 
+ [EventBridge-Scheduler-Benutzerhandbuch](https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html)
+ [EventBridge-Scheduler-API-Referenz](https://docs.aws.amazon.com/scheduler/latest/APIReference/Welcome.html)
+ [EventBridge Scheduler – Preisgestaltung](https://aws.amazon.com/eventbridge/pricing/#Scheduler)

# Verwenden von AWS Lambda mit AWS IoT
<a name="services-iot"></a>

AWS IoT bietet eine sichere Kommunikation zwischen über das Internet verbundenen Geräten (z. B. Sensoren) und der AWS Cloud. Auf diese Weise können Sie die Telemetriedaten von mehreren Geräten erfassen, speichern und analysieren.

Sie können AWS IoT-Regeln für Ihre Geräte erstellen, um mit AWS-Services zu interagieren. Die AWS IoT-[Regel-Engine](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules.html) bietet eine SQL-basierte Sprache zur Auswahl von Daten aus Nachrichten-Nutzlasten und zum Senden von Daten zu anderen Services, z. B. Amazon S3, Amazon DynamoDB und AWS Lambda. Sie definieren eine Regel zum Aufrufen einer Lambda-Funktion, wenn Sie einen anderen AWS-Service oder den Service eines Drittanbieters aufrufen möchten. 

Wenn eine eingehende IoT-Nachricht die Regel auslöst, ruft AWS IoT Ihre Lambda-Funktion [asynchron](invocation-async.md) auf und übergibt Daten aus der IoT-Nachricht an die Funktion. 

Das folgende Beispiel zeigt einen Feuchtigkeitsablesung von einem Gewächshaussensor. Die Werte **row** und **pos** bestimmen die Position des Sensors. Dieses Beispielereignis basiert auf dem Gewächshaustyp in den [AWS IoT-Regel-Tutorials](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules-tutorial.html). 

**Example AWS IoT-Nachrichtenereignis**  

```
{
    "row" : "10",
    "pos" : "23",
    "moisture" : "75"
}
```

Bei asynchronem Aufruf stellt Lambda die Nachricht in die Warteschlange und [wiederholt den Vorgang](invocation-retries.md), wenn Ihre Funktion einen Fehler zurückgibt. Konfigurieren Sie Ihre Funktion mit einem [Ziel](invocation-async-retain-records.md#invocation-async-destinations), um Ereignisse beizubehalten, die Ihre Funktion nicht verarbeiten konnte.

Sie müssen die Berechtigung für den AWS IoT-Service erteilen, um Ihre Lambda-Funktion aufzurufen. Sie können den Befehl `add-permission` verwenden, um der ressourcenbasierten Richtlinie Ihrer Funktion eine Berechtigungsanweisung hinzuzufügen.

```
aws lambda add-permission --function-name my-function \
--statement-id iot-events --action "lambda:InvokeFunction" --principal iot.amazonaws.com
```

Die Ausgabe sollte folgendermaßen aussehen:

```
{
    "Statement": "{\"Sid\":\"iot-events\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-1:123456789012:function:my-function\"}"
}
```

Weitere Informationen zur Verwendung von Lambda mit AWS IoT finden Sie unter [Erstellen einer AWS Lambda-Regel](https://docs.aws.amazon.com/iot/latest/developerguide/iot-lambda-rule.html). 

# Verarbeiten von Datensätzen aus Amazon Kinesis Data Streams mit Lambda
<a name="with-kinesis"></a>

Sie können eine Lambda-Funktion verwenden, um Datensätze in einem [Amazon Kinesis-Datenstrom](https://docs.aws.amazon.com/streams/latest/dev/introduction.html) zu verarbeiten. Sie können eine Lambda-Funktion zu einem Kinesis Data Streams Konsumenten mit gemeinsam genutztem Durchsatz (Standard-Iterator) oder zu einem Konsumenten mit dediziertem Durchsatz mit [erweitertem Rundsenden](https://docs.aws.amazon.com/kinesis/latest/dev/enhanced-consumers.html) zuweisen. Bei Standard-Iteratoren fragt Lambda jeden Shard in Ihrem Kinesis-Stream nach Datensätzen ab, die das HTTP-Protokoll verwenden. Die Ereignisquellenzuordnung teilt den Lesedurchsatz mit anderen Konsumenten des Shards zusammen.

 Weitere Informationen zu Kinesis-Datenströmen finden Sie unter [Daten aus Amazon Kinesis Data Streams](https://docs.aws.amazon.com/kinesis/latest/dev/building-consumers.html).

**Anmerkung**  
Kinesis berechnet Gebühren für jeden Shard, sowie bei verbessertem Rundsenden für Daten, die aus dem Stream gelesen werden. Details zu den Preisen finden Sie unter [Amazon-Kinesis- Preise](https://aws.amazon.com/kinesis/data-streams/pricing).

## Abfragen und Stapeln von Streams
<a name="kinesis-polling-and-batching"></a>

Lambda liest Datensätze aus dem Datenstrom und ruft Ihre Funktion [synchron](invocation-sync.md) mit einem Ereignis auf, das Stream-Datensätze enthält. Lambda liest Datensätze in Batches und ruft Ihre Funktion auf, um Datensätze aus dem Batch zu verarbeiten. Jeder Batch enthält Datensätze aus einem einzelnen Shard/Datenstrom.

Ihre Lambda-Funktion ist eine Konsumentenanwendung für Ihren Daten-Stream. Sie verarbeitet jeweils einen Batch Datensätzen aus jedem Shard. Sie können eine Lambda-Funktion zu einem Konsumenten mit gemeinsam genutztem Durchsatz (Standard-Iterator) oder zu einem Konsumenten mit dediziertem Durchsatz mit erweitertem Rundsenden zuweisen.
+ **Standard-Iterator:** Lambda fragt jeden Shard in Ihrem Kinesis-Stream mit einer Basisrate von einmal pro Sekunde nach Datensätzen ab. Wenn mehr Datensätze verfügbar sind, verarbeitet Lambda Batches, bis die Funktion mit dem Stream gleichzieht. Die Ereignisquellenzuordnung teilt den Lesedurchsatz mit anderen Konsumenten des Shards zusammen.
+ **Erweitertes Rundsenden:** Um die Latenz zu minimieren und den Lesedurchsatz zu maximieren, erstellen Sie einen Daten-Stream-Konsumenten mit [erweitertem Rundsenden](https://docs.aws.amazon.com/streams/latest/dev/enhanced-consumers.html). Stream-Konsumenten mit erweitertem Rundsenden erhalten eine dedizierte Verbindung für jeden Shard, der keine Auswirkungen auf andere Anwendungen hat, die aus dem Stream lesen. Stream-Konsumenten verwenden HTTP/2, um die Latenz zu reduzieren, indem Datensätze über eine langlebige Verbindung an Lambda übertragen und Anforderungs-Header komprimiert werden. Sie können einen Stream-Konsumenten mit der Kinesis-[RegisterStreamConsumer](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_RegisterStreamConsumer.html)-API erstellen.

```
aws kinesis register-stream-consumer \
--consumer-name con1 \
--stream-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream
```

Die Ausgabe sollte folgendermaßen aussehen:

```
{
    "Consumer": {
        "ConsumerName": "con1",
        "ConsumerARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream/consumer/con1:1540591608",
        "ConsumerStatus": "CREATING",
        "ConsumerCreationTimestamp": 1540591608.0
    }
}
```

Um die Geschwindigkeit zu erhöhen, mit der Ihre Funktion Datensätze verarbeitet, [fügen Sie Ihrem Datenstrom Shards hinzu](https://repost.aws/knowledge-center/kinesis-data-streams-open-shards). Lambda verarbeitet Datensätze in jedem Shard in der Reihenfolge. Es beendet die Verarbeitung zusätzlicher Datensätze in einem Shard, wenn Ihre Funktion einen Fehler zurückgibt. Mehr Shards bedeutet, dass mehr Stapel verarbeitet und gleichzeitig die Auswirkungen von Fehlern auf die Nebenläufigkeit verringert werden.

Wenn Ihre Funktion nicht hochskalieren kann, um alle gleichzeitigen Stapel zu verarbeiten, [fordern Sie eine Kontingenterhöhung an](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html) oder [reservieren Sie Gleichzeitigkeit](configuration-concurrency.md) für Ihre Funktion.

Standardmäßig ruft Lambda Ihre Funktion auf, sobald Datensätze verfügbar sind. Wenn der Batch, den Lambda aus der Ereignisquelle liest, nur einen Datensatz enthält, sendet Lambda nur einen Datensatz an die Funktion. Damit die Funktion nicht mit einer kleinen Anzahl von Datensätzen aufgerufen wird, können Sie die Ereignisquelle anweisen, Datensätze bis zu 5 Minuten lang zu puffern, indem Sie ein *Batch-Fenster* konfigurieren. Bevor die Funktion aufgerufen wird, liest Lambda so lange Datensätze aus der Ereignisquelle, bis es einen vollständigen Batch erfasst hat, das Batch-Verarbeitungsfenster abläuft oder der Batch die Nutzlastgrenze von 6 MB erreicht. Weitere Informationen finden Sie unter [Batching-Verhalten](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

**Warnung**  
Zuordnung von Lambda-Ereignisquellen verarbeiten jedes Ereignis mindestens einmal und es kann zu einer doppelten Verarbeitung von Datensätzen kommen. Um mögliche Probleme im Zusammenhang mit doppelten Ereignissen zu vermeiden, empfehlen wir Ihnen dringend, Ihren Funktionscode idempotent zu machen. Weitere Informationen finden Sie unter [Wie mache ich meine Lambda-Funktion idempotent](https://repost.aws/knowledge-center/lambda-function-idempotent) im AWS-Wissenszentrum.

Lambda wartet mit dem Senden des nächsten zu verarbeitenden Stapels nicht, bis ggf. konfigurierte [Erweiterungen](lambda-extensions.md) abgeschlossen sind. Anders ausgedrückt: Ihre Erweiterungen werden möglicherweise weiter ausgeführt, während Lambda den nächsten Stapel von Datensätzen verarbeitet. Dies kann zu Drosselungsproblemen führen, wenn Sie gegen eine Einstellung oder gegen einen Grenzwert im Zusammenhang mit der [Parallelität](lambda-concurrency.md) Ihres Kontos verstoßen. Um zu erkennen, ob möglicherweise ein Problem vorliegt, müssen Sie Ihre Funktionen überwachen sowie überprüfen, ob für Ihre Zuordnung von Ereignisquellen unerwartet hohe [Parallelitätsmetriken](monitoring-concurrency.md#general-concurrency-metrics) vorliegen. Aufgrund der kurzen Zeit zwischen den Aufrufen kann Lambda kurzzeitig eine höhere Gleichzeitigkeitsnutzung als die Anzahl der Shards melden. Dies kann sogar für Lambda-Funktionen ohne Erweiterungen gelten.

Konfigurieren Sie die [ParallelizationFactor](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-ParallelizationFactor)-Einstellung, um einen Shard eines Kinesis-Datenstroms mit mehr als einem Lambda-Aufruf gleichzeitig zu verarbeiten. Sie können die Anzahl der gleichzeitigen Batches angeben, die Lambda von einem Shard über einen Parallelisierungsfaktor von 1 (Standard) bis 10 abfragt. Wenn `ParallelizationFactor` beispielsweise auf 2 gesetzt ist, können Sie maximal 200 gleichzeitige Lambda-Aufrufe haben, um 100 Kinesis-Daten-Shards zu verarbeiten (in der Praxis werden womöglich andere Werte für die Metrik `ConcurrentExecutions` angezeigt). Dies hilft, den Verarbeitungsdurchsatz hochzuskalieren, wenn das Datenvolumen flüchtig ist und `IteratorAge` hoch ist. Wenn Sie die Anzahl gleichzeitiger Batches pro Shard erhöhen, stellt Lambda weiterhin die Auftragsverarbeitung auf Partitionsschlüsselebene sicher.

Sie können `ParallelizationFactor` auch mit der Kinesis-Aggregation verwenden. Das Verhalten der Zuordnung von Ereignisquellen hängt davon ab, ob Sie das [erweiterte Rundsenden](https://docs.aws.amazon.com/streams/latest/dev/enhanced-consumers.html) verwenden:
+ **Ohne erweitertes Rundsenden**: Alle Ereignisse innerhalb eines aggregierten Ereignisses müssen denselben Partitionsschlüssel haben. Der Partitionsschlüssel muss außerdem mit dem des aggregierten Ereignisses übereinstimmen. Wenn die Ereignisse innerhalb des aggregierten Ereignisses unterschiedliche Partitionsschlüssel haben, kann Lambda nicht garantieren, dass die Ereignisse in der richtigen Reihenfolge nach Partitionsschlüssel verarbeitet werden.
+ **Mit verbessertem Rundsenden**: Zunächst dekodiert Lambda das aggregierte Ereignis in seine einzelnen Ereignisse. Das aggregierte Ereignis kann einen anderen Partitionsschlüssel haben als die darin enthaltenen Ereignisse. Ereignisse, die nicht dem Partitionsschlüssel entsprechen, werden jedoch [gelöscht und gehen verloren](https://github.com/awslabs/kinesis-aggregation/blob/master/potential_data_loss.md). Lambda verarbeitet diese Ereignisse nicht und sendet sie nicht an ein konfiguriertes Fehlerziel.

## Beispielereignis
<a name="services-kinesis-event-example"></a>

**Example**  

```
{
    "Records": [
        {
            "kinesis": {
                "kinesisSchemaVersion": "1.0",
                "partitionKey": "1",
                "sequenceNumber": "49590338271490256608559692538361571095921575989136588898",
                "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
                "approximateArrivalTimestamp": 1545084650.987
            },
            "eventSource": "aws:kinesis",
            "eventVersion": "1.0",
            "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898",
            "eventName": "aws:kinesis:record",
            "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role",
            "awsRegion": "us-east-2",
            "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream"
        },
        {
            "kinesis": {
                "kinesisSchemaVersion": "1.0",
                "partitionKey": "1",
                "sequenceNumber": "49590338271490256608559692540925702759324208523137515618",
                "data": "VGhpcyBpcyBvbmx5IGEgdGVzdC4=",
                "approximateArrivalTimestamp": 1545084711.166
            },
            "eventSource": "aws:kinesis",
            "eventVersion": "1.0",
            "eventID": "shardId-000000000006:49590338271490256608559692540925702759324208523137515618",
            "eventName": "aws:kinesis:record",
            "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role",
            "awsRegion": "us-east-2",
            "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream"
        }
    ]
}
```

# Verarbeiten von Amazon Kinesis Data Streams-Datensätzen mit Lambda
<a name="services-kinesis-create"></a>

Um Amazon-Kinesis-Data-Streams-Datensätze mit Lambda zu verarbeiten, erstellen Sie eine Lambda-Zuordnung von Ereignisquellen. Sie können eine Lambda-Funktion zu einem Standard-Iterator oder zu einem Konsumenten für das erweiterte Rundsenden zuweisen. Weitere Informationen finden Sie unter [Abfragen und Stapeln von Streams](with-kinesis.md#kinesis-polling-and-batching).

## Erstellen einer Zuordnung von Ereignisquellen für Kinesis
<a name="services-kinesis-eventsourcemapping"></a>

Um Ihre Lambda-Funktion mit Datensätzen aus Ihrem Datenstrom aufzurufen, erstellen Sie eine [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md). Sie können mehrere Ereignisquellenzuordnungen erstellen, um gleiche Daten mit mehreren Lambda-Funktionen oder Elemente aus mehreren Daten-Streams mit nur einer Funktion zu verarbeiten. Bei der Verarbeitung von Elementen aus mehreren Datenströmen enthält jeder Batch Datensätze aus nur einem einzigen Shard oder Stream.

Sie können Zuordnungen von Ereignisquellen konfigurieren, um Datensätze aus einem Stream in einem anderen AWS-Konto zu verarbeiten. Weitere Informationen hierzu finden Sie unter [Erstellen einer kontoübergreifenden Zuordnung von Ereignisquellen](#services-kinesis-eventsourcemapping-cross-account).

Bevor Sie ein Zuordnung von Ereignisquellen erstellen, müssen Sie Ihrer Lambda-Funktion die Berechtigung zum Lesen aus einem Kinesis-Datenstrom erteilen. Lambda benötigt die folgenden Berechtigungen zum Verwalten von Ressourcen, die zu Ihrem Kinesis-Datenstrom gehören:
+ [Kinese: DescribeStream](https://docs.aws.amazon.com/lambda/latest/api/API_DescribeStream.html)
+ [Kinese: DescribeStreamSummary](https://docs.aws.amazon.com/lambda/latest/api/API_DescribeStreamSummary.html)
+ [Kinese: GetRecords](https://docs.aws.amazon.com/lambda/latest/api/API_GetRecords.html)
+ [Kinese: GetShardIterator](https://docs.aws.amazon.com/lambda/latest/api/API_GetShardIterator.html)
+ [Kinese: ListShards](https://docs.aws.amazon.com/lambda/latest/api/API_ListShards.html)
+ [Kinese: SubscribeToShard](https://docs.aws.amazon.com/lambda/latest/api/API_SubscribeToShard.html)

Die AWS verwaltete Richtlinie [AWSLambdaKinesisExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaKinesisExecutionRole.html)umfasst diese Berechtigungen. Fügen Sie diese verwaltete Richtlinie zu Ihrer Funktion hinzu, wie im folgenden Verfahren beschrieben.

**Anmerkung**  
Sie benötigen keine `kinesis:ListStreams`-Berechtigung, um Zuordnungen von Ereignisquellen für Kinesis zu erstellen und zu verwalten. Wenn Sie jedoch eine Zuordnung von Ereignisquellen in der Konsole erstellen und nicht über diese Berechtigung verfügen, können Sie keinen Kinesis-Stream aus einer Dropdown-Liste auswählen und die Konsole zeigt einen Fehler an. Um die Zuordnung von Ereignisquellen zu erstellen, müssen Sie den Amazon-Ressourcennamen (ARN) Ihres Streams manuell eingeben.
Lambda ruft die APIs `kinesis:GetRecords` und `kinesis:GetShardIterator` auf, wenn fehlgeschlagene Aufrufe erneut versucht werden.

------
#### [ AWS-Managementkonsole ]

**So fügen Sie Kinesis-Berechtigungen zu Ihrer Funktion hinzu**

1. Öffnen Sie die [Funktionsseite](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole und wählen Sie Ihre Funktion aus.

1. Klicken Sie in der Registerkarte **Konfiguration** auf die Option **Berechtigungen**.

1. Wählen Sie im Bereich **Ausführungsrolle** unter **Rollenname** den Link zur Ausführungsrolle Ihrer Funktion aus. Dieser Link öffnet die Seite für diese Rolle in der IAM-Konsole.

1. Unter **Berechtigungsrichtlinien** im Abschnitt **Berechtigungen hinzufügen** wählen Sie dann **Richtlinien anfügen** aus.

1. Geben Sie im Suchfeld **AWSLambdaKinesisExecutionRole** ein.

1. Aktivieren Sie das Kontrollkästchen neben der Richtlinie und wählen Sie **Berechtigung hinzufügen**.

------
#### [ AWS CLI ]

**So fügen Sie Kinesis-Berechtigungen zu Ihrer Funktion hinzu**
+ Führen Sie den folgenden CLI-Befehl aus, um die `AWSLambdaKinesisExecutionRole`-Richtlinie zur Ausführungsrolle Ihrer Funktion hinzuzufügen:

  ```
  aws iam attach-role-policy \
  --role-name MyFunctionRole \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaKinesisExecutionRole
  ```

------
#### [ AWS SAM ]

**So fügen Sie Kinesis-Berechtigungen zu Ihrer Funktion hinzu**
+ Fügen Sie die `Policies`-Eigenschaft wie im folgenden Beispiel gezeigt in der Definition Ihrer Funktion hinzu:

  ```
  Resources:
    MyFunction:
      Type: AWS::Serverless::Function
      Properties:
        CodeUri: ./my-function/
        Handler: index.handler
        Runtime: nodejs24.x
        Policies:
          - AWSLambdaKinesisExecutionRole
  ```

------

Nachdem Sie die erforderlichen Berechtigungen konfiguriert haben, erstellen Sie die Zuordnung von Ereignisquellen.

------
#### [ AWS-Managementkonsole ]

**So erstellen Sie die Kinesis-Zuordnung von Ereignisquellen**

1. Öffnen Sie die [Funktionsseite](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole und wählen Sie Ihre Funktion aus.

1. Wählen Sie im Bereich **Function overview (Funktionsübersicht)** die Option **Add trigger (Auslöser hinzufügen)**.

1. Wählen Sie unter **Trigger-Konfiguration** als Quelle die Option **Kinesis** aus.

1. Wählen Sie den Kinesis-Stream, für den Sie die Zuordnung von Ereignisquellen erstellen möchten und optional einen Konsumenten Ihres Streams.

1. (Optional) Bearbeiten Sie die **Batch-Größe**, die **Startposition** und das **Batch-Fenster** für Ihre Zuordnung von Ereignisquellen.

1. Wählen Sie **Hinzufügen** aus.

Wenn Sie Ihre Ereignisquellenzuordnung von der Konsole aus erstellen, muss Ihre IAM-Rolle über die Berechtigungen [kinesis: ListStreams und [kinesis](https://docs.aws.amazon.com/lambda/latest/api/API_ListStreamConsumers.html):](https://docs.aws.amazon.com/lambda/latest/api/API_ListStreams.html) verfügen. ListStreamConsumers

------
#### [ AWS CLI ]

**So erstellen Sie die Kinesis-Zuordnung von Ereignisquellen**
+ Führen Sie den folgenden CLI-Befehl aus, um eine Kinesis-Zuordnung von Ereignisquellen zu erstellen. Wählen Sie Ihre eigene Batch-Größe und Startposition entsprechend Ihrem Anwendungsfall.

  ```
  aws lambda create-event-source-mapping \
  --function-name MyFunction \
  --event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream \
  --starting-position LATEST \
  --batch-size 100
  ```

Um ein Batching-Fenster anzugeben, fügen Sie die `--maximum-batching-window-in-seconds`-Option hinzu. *Weitere Informationen zur Verwendung dieses und anderer Parameter finden Sie [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)in der AWS CLI Befehlsreferenz.*

------
#### [ AWS SAM ]

**So erstellen Sie die Kinesis-Zuordnung von Ereignisquellen**
+ Fügen Sie die `KinesisEvent`-Eigenschaft wie im folgenden Beispiel gezeigt in der Definition Ihrer Funktion hinzu:

  ```
  Resources:
    MyFunction:
      Type: AWS::Serverless::Function
      Properties:
        CodeUri: ./my-function/
        Handler: index.handler
        Runtime: nodejs24.x
        Policies:
          - AWSLambdaKinesisExecutionRole
        Events:
          KinesisEvent:
            Type: Kinesis
            Properties:
              Stream: !GetAtt MyKinesisStream.Arn
              StartingPosition: LATEST
              BatchSize: 100
  
    MyKinesisStream:
      Type: AWS::Kinesis::Stream
      Properties:
        ShardCount: 1
  ```

Weitere Informationen zum Erstellen einer Ereignisquellenzuordnung für Kinesis Data Streams finden Sie unter [Kinesis](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-kinesis.html) im *AWS Serverless Application Model Entwicklerhandbuch*. AWS SAM

------

## Abfrage und Startposition des Streams
<a name="services-kinesis-stream-start-pos"></a>

Beachten Sie, dass die Stream-Abfrage bei der Erstellung und Aktualisierung der Zuordnung von Ereignisquellen letztendlich konsistent ist.
+ Bei der Erstellung der Zuordnung von Ereignisquellen kann es mehrere Minuten dauern, bis mit der Abfrage von Ereignissen aus dem Stream begonnen wird.
+ Bei Aktualisierungen der Zuordnung von Ereignisquellen kann es mehrere Minuten dauern, bis die Abfrage von Ereignissen aus dem Stream gestoppt und neu gestartet wird.

Dieses Verhalten bedeutet, dass, wenn Sie `LATEST` als Startposition für den Stream angeben, die Zuordnung von Ereignisquellen bei der Erstellung oder Aktualisierung möglicherweise Ereignisse übersieht. Um sicherzustellen, dass keine Ereignisse übersehen werden, geben Sie die Startposition des Streams als `TRIM_HORIZON` oder `AT_TIMESTAMP` an.

## Erstellen einer kontoübergreifenden Zuordnung von Ereignisquellen
<a name="services-kinesis-eventsourcemapping-cross-account"></a>

Amazon Kinesis Data Streams unterstützt [ressourcenbasierte Richtlinien](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html). Aus diesem Grund können Sie in einen Stream aufgenommene Daten in einem Konto AWS-Konto mit einer Lambda-Funktion in einem anderen Konto verarbeiten.

Um eine Ereignisquellenzuordnung für Ihre Lambda-Funktion mithilfe eines Kinesis-Streams in einem anderen zu erstellen AWS-Konto, müssen Sie den Stream mithilfe einer ressourcenbasierten Richtlinie konfigurieren, um Ihrer Lambda-Funktion die Berechtigung zum Lesen von Elementen zu erteilen. Informationen dazu, wie Sie Ihren Stream so konfigurieren, dass er kontoübergreifenden Zugriff ermöglicht, finden Sie unter [Zugriff mit kontoübergreifenden AWS Lambda Funktionen teilen](https://docs.aws.amazon.com/streams/latest/dev/resource-based-policy-examples.html#Resource-based-policy-examples-lambda) im *Amazon Kinesis Streams Streams-Entwicklerhandbuch*.

Sobald Sie Ihren Stream mit einer ressourcenbasierten Richtlinie konfiguriert haben, die Ihrer Lambda-Funktion die erforderlichen Berechtigungen erteilt, erstellen Sie die Zuordnung von Ereignisquellen mit einer der im vorherigen Abschnitt beschriebenen Methoden.

Wenn Sie Ihre Zuordnung von Ereignisquellen über die Lambda-Konsole erstellen möchten, fügen Sie den ARN Ihres Streams direkt in das Eingabefeld ein. Wenn Sie einen Verbraucher für Ihren Stream angeben möchten, wird durch Einfügen der ARN des Verbrauchers automatisch das Stream-Feld ausgefüllt.

# Konfigurieren einer teilweisen Batch-Antwort mit Kinesis Data Streams und Lambda
<a name="services-kinesis-batchfailurereporting"></a>

Beim Konsumieren und Verarbeiten von Streaming-Daten aus einer Ereignisquelle werden standardmäßig Lambda-Checkpoints auf die höchste Sequenznummer eines Batches nur dann überprüft, wenn der Batch ein voller Erfolg ist. Lambda behandelt alle anderen Ergebnisse als einen vollständigen Fehler und versucht, den Batch bis zum Wiederholungslimit zu verarbeiten. Um beim Verarbeiten von Stapeln aus einem Stream Teilerfolge zu ermöglichen, aktivieren Sie `ReportBatchItemFailures`. Das Zulassen von Teilerfolgen kann dazu beitragen, die Anzahl der Wiederholungen in einer Aufzeichnung zu reduzieren, obwohl die Möglichkeit von Wiederholungen in einer erfolgreichen Aufzeichnung nicht vollständig verhindert wird.

Zum Aktivieren von `ReportBatchItemFailures` fügen Sie den Enum-Wert **ReportBatchItemFailures** der [FunctionResponseTypes](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-FunctionResponseTypes)-Liste hinzu. Diese Liste zeigt an, welche Antworttypen für Ihre Funktion aktiviert sind. Sie können diese Liste konfigurieren, wenn Sie eine Zuordnung von Ereignisquellen [erstellen](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) oder [aktualisieren](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html).

**Anmerkung**  
Selbst wenn Ihr Funktionscode teilweise Antworten bei Batch-Fehlern zurückgibt, werden diese Antworten nicht von Lambda verarbeitet, es sei denn, das `ReportBatchItemFailures`-Feature ist explizit für Ihre Zuordnung von Ereignisquellen aktiviert.

## Berichtsyntax
<a name="streams-batchfailurereporting-syntax"></a>

Beim Konfigurieren von Berichten zu Batch-Elementfehlern wird die `StreamsEventResponse`-Klasse mit einer Liste von Batch-Elementfehlern zurückgegeben. Sie können ein `StreamsEventResponse`-Objekt verwenden, um die Sequenznummer des ersten fehlgeschlagenen Datensatzes im Batch zurückzugeben. Sie können auch Ihre eigene benutzerdefinierte Klasse mit der richtigen Antwortsyntax erstellen. Die folgende JSON-Struktur zeigt die erforderliche Antwortsyntax:

```
{ 
  "batchItemFailures": [ 
        {
            "itemIdentifier": "<SequenceNumber>"
        }
    ]
}
```

**Anmerkung**  
Wenn das `batchItemFailures`-Array mehrere Elemente enthält, verwendet Lambda den Datensatz mit der niedrigsten Sequenznummer als Kontrollpunkt. Lambda wiederholt dann alle Datensätze ab diesem Kontrollpunkt.

## Erfolgs- und Misserfolgsbedingungen
<a name="streams-batchfailurereporting-conditions"></a>

Lambda behandelt einen Batch als vollständigen Erfolg, wenn Sie eines der folgenden Elemente zurückgeben:
+ Eine leere `batchItemFailure`-Liste
+ Eine ungültige `batchItemFailure`-Liste
+ Ein leeres `EventResponse`
+ Ein ungültiges `EventResponse`

Lambda behandelt einen Batch als vollständigen Misserfolg, wenn Sie eines der folgenden Elemente zurückgeben:
+ Eine leere Zeichenfolge `itemIdentifier`
+ Ein ungültiges `itemIdentifier`
+ Ein `itemIdentifier` mit einem falschen Schlüsselnamen

Lambda wiederholt Fehler basierend auf Ihrer Wiederholungsstrategie.

## Einen Batch halbieren
<a name="streams-batchfailurereporting-bisect"></a>

Wenn Ihr Aufruf fehlschlägt und `BisectBatchOnFunctionError` eingeschaltet ist, wird der Stapel unabhängig von Ihrer `ReportBatchItemFailures`-Einstellung halbiert.

Wenn eine partielle Batch-Erfolgsantwort empfangen wird und sowohl `BisectBatchOnFunctionError` als auch `ReportBatchItemFailures` aktiviert sind, wird der Batch mit der zurückgegebenen Sequenznummer halbiert und Lambda versucht nur die verbleibenden Datensätze erneut.

Um die Implementierung der partiellen Batch-Antwortlogik zu vereinfachen, sollten Sie in Erwägung ziehen, das [Batch Processor Utility](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) von Powertools for zu verwenden AWS Lambda, das diese Komplexität automatisch für Sie erledigt.

Hier sind einige Beispiele für Funktionscode, der die Liste der fehlgeschlagenen Nachrichten IDs im Batch zurückgibt:

------
#### [ .NET ]

**SDK für .NET**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melden von Fehlern bei Kinesis-Batchelementen mit Lambda unter Verwendung von .NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
﻿using System.Text;
using System.Text.Json.Serialization;
using Amazon.Lambda.Core;
using Amazon.Lambda.KinesisEvents;
using AWS.Lambda.Powertools.Logging;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace KinesisIntegration;

public class Function
{
    // Powertools Logger requires an environment variables against your function
    // POWERTOOLS_SERVICE_NAME
    [Logging(LogEvent = true)]
    public async Task<StreamsEventResponse> FunctionHandler(KinesisEvent evnt, ILambdaContext context)
    {
        if (evnt.Records.Count == 0)
        {
            Logger.LogInformation("Empty Kinesis Event received");
            return new StreamsEventResponse();
        }

        foreach (var record in evnt.Records)
        {
            try
            {
                Logger.LogInformation($"Processed Event with EventId: {record.EventId}");
                string data = await GetRecordDataAsync(record.Kinesis, context);
                Logger.LogInformation($"Data: {data}");
                // TODO: Do interesting work based on the new data
            }
            catch (Exception ex)
            {
                Logger.LogError($"An error occurred {ex.Message}");
                /* Since we are working with streams, we can return the failed item immediately.
                   Lambda will immediately begin to retry processing from this failed item onwards. */
                return new StreamsEventResponse
                {
                    BatchItemFailures = new List<StreamsEventResponse.BatchItemFailure>
                    {
                        new StreamsEventResponse.BatchItemFailure { ItemIdentifier = record.Kinesis.SequenceNumber }
                    }
                };
            }
        }
        Logger.LogInformation($"Successfully processed {evnt.Records.Count} records.");
        return new StreamsEventResponse();
    }

    private async Task<string> GetRecordDataAsync(KinesisEvent.Record record, ILambdaContext context)
    {
        byte[] bytes = record.Data.ToArray();
        string data = Encoding.UTF8.GetString(bytes);
        await Task.CompletedTask; //Placeholder for actual async work
        return data;
    }
}

public class StreamsEventResponse
{
    [JsonPropertyName("batchItemFailures")]
    public IList<BatchItemFailure> BatchItemFailures { get; set; }
    public class BatchItemFailure
    {
        [JsonPropertyName("itemIdentifier")]
        public string ItemIdentifier { get; set; }
    }
}
```

------
#### [ Go ]

**SDK für Go V2**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melden von Fehlern bei Kinesis-Batchelementen mit Lambda unter Verwendung von Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main

import (
	"context"
	"fmt"
	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context, kinesisEvent events.KinesisEvent) (map[string]interface{}, error) {
	batchItemFailures := []map[string]interface{}{}

	for _, record := range kinesisEvent.Records {
		curRecordSequenceNumber := ""

		// Process your record
		if /* Your record processing condition here */ {
			curRecordSequenceNumber = record.Kinesis.SequenceNumber
		}

		// Add a condition to check if the record processing failed
		if curRecordSequenceNumber != "" {
			batchItemFailures = append(batchItemFailures, map[string]interface{}{"itemIdentifier": curRecordSequenceNumber})
		}
	}

	kinesisBatchResponse := map[string]interface{}{
		"batchItemFailures": batchItemFailures,
	}
	return kinesisBatchResponse, nil
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK für Java 2.x**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melden von Fehlern bei Kinesis-Batchelementen mit Lambda unter Verwendung von Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.KinesisEvent;
import com.amazonaws.services.lambda.runtime.events.StreamsEventResponse;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class ProcessKinesisRecords implements RequestHandler<KinesisEvent, StreamsEventResponse> {

    @Override
    public StreamsEventResponse handleRequest(KinesisEvent input, Context context) {

        List<StreamsEventResponse.BatchItemFailure> batchItemFailures = new ArrayList<>();
        String curRecordSequenceNumber = "";

        for (KinesisEvent.KinesisEventRecord kinesisEventRecord : input.getRecords()) {
            try {
                //Process your record
                KinesisEvent.Record kinesisRecord = kinesisEventRecord.getKinesis();
                curRecordSequenceNumber = kinesisRecord.getSequenceNumber();

            } catch (Exception e) {
                /* Since we are working with streams, we can return the failed item immediately.
                   Lambda will immediately begin to retry processing from this failed item onwards. */
                batchItemFailures.add(new StreamsEventResponse.BatchItemFailure(curRecordSequenceNumber));
                return new StreamsEventResponse(batchItemFailures);
            }
        }
       
       return new StreamsEventResponse(batchItemFailures);   
    }
}
```

------
#### [ JavaScript ]

**SDK für JavaScript (v3)**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/blob/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melden von Fehlern bei Kinesis-Batchelementen mit Lambda unter Verwendung von Javascript.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
  for (const record of event.Records) {
    try {
      console.log(`Processed Kinesis Event - EventID: ${record.eventID}`);
      const recordData = await getRecordDataAsync(record.kinesis);
      console.log(`Record Data: ${recordData}`);
      // TODO: Do interesting work based on the new data
    } catch (err) {
      console.error(`An error occurred ${err}`);
      /* Since we are working with streams, we can return the failed item immediately.
            Lambda will immediately begin to retry processing from this failed item onwards. */
      return {
        batchItemFailures: [{ itemIdentifier: record.kinesis.sequenceNumber }],
      };
    }
  }
  console.log(`Successfully processed ${event.Records.length} records.`);
  return { batchItemFailures: [] };
};

async function getRecordDataAsync(payload) {
  var data = Buffer.from(payload.data, "base64").toString("utf-8");
  await Promise.resolve(1); //Placeholder for actual async work
  return data;
}
```
Melden von Fehlern Kinesis Kinesis-Batch-Elementen mit Lambda unter Verwendung von. TypeScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import {
  KinesisStreamEvent,
  Context,
  KinesisStreamHandler,
  KinesisStreamRecordPayload,
  KinesisStreamBatchResponse,
} from "aws-lambda";
import { Buffer } from "buffer";
import { Logger } from "@aws-lambda-powertools/logger";

const logger = new Logger({
  logLevel: "INFO",
  serviceName: "kinesis-stream-handler-sample",
});

export const functionHandler: KinesisStreamHandler = async (
  event: KinesisStreamEvent,
  context: Context
): Promise<KinesisStreamBatchResponse> => {
  for (const record of event.Records) {
    try {
      logger.info(`Processed Kinesis Event - EventID: ${record.eventID}`);
      const recordData = await getRecordDataAsync(record.kinesis);
      logger.info(`Record Data: ${recordData}`);
      // TODO: Do interesting work based on the new data
    } catch (err) {
      logger.error(`An error occurred ${err}`);
      /* Since we are working with streams, we can return the failed item immediately.
            Lambda will immediately begin to retry processing from this failed item onwards. */
      return {
        batchItemFailures: [{ itemIdentifier: record.kinesis.sequenceNumber }],
      };
    }
  }
  logger.info(`Successfully processed ${event.Records.length} records.`);
  return { batchItemFailures: [] };
};

async function getRecordDataAsync(
  payload: KinesisStreamRecordPayload
): Promise<string> {
  var data = Buffer.from(payload.data, "base64").toString("utf-8");
  await Promise.resolve(1); //Placeholder for actual async work
  return data;
}
```

------
#### [ PHP ]

**SDK für PHP**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melden von Fehlern bei Kinesis-Batchelementen mit Lambda unter Verwendung von PHP.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
<?php

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\Kinesis\KinesisEvent;
use Bref\Event\Handler as StdHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler implements StdHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws JsonException
     * @throws \Bref\Event\InvalidLambdaEvent
     */
    public function handle(mixed $event, Context $context): array
    {
        $kinesisEvent = new KinesisEvent($event);
        $this->logger->info("Processing records");
        $records = $kinesisEvent->getRecords();

        $failedRecords = [];
        foreach ($records as $record) {
            try {
                $data = $record->getData();
                $this->logger->info(json_encode($data));
                // TODO: Do interesting work based on the new data
            } catch (Exception $e) {
                $this->logger->error($e->getMessage());
                // failed processing the record
                $failedRecords[] = $record->getSequenceNumber();
            }
        }
        $totalRecords = count($records);
        $this->logger->info("Successfully processed $totalRecords records");

        // change format for the response
        $failures = array_map(
            fn(string $sequenceNumber) => ['itemIdentifier' => $sequenceNumber],
            $failedRecords
        );

        return [
            'batchItemFailures' => $failures
        ];
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

------
#### [ Python ]

**SDK für Python (Boto3)**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melden von Fehlern bei Kinesis-Batchelementen mit Lambda unter Verwendung von Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def handler(event, context):
    records = event.get("Records")
    curRecordSequenceNumber = ""
    
    for record in records:
        try:
            # Process your record
            curRecordSequenceNumber = record["kinesis"]["sequenceNumber"]
        except Exception as e:
            # Return failed record's sequence number
            return {"batchItemFailures":[{"itemIdentifier": curRecordSequenceNumber}]}

    return {"batchItemFailures":[]}
```

------
#### [ Ruby ]

**SDK für Ruby**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melden von Fehlern bei Kinesis-Batchelementen mit Lambda unter Verwendung von Ruby.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
require 'aws-sdk'

def lambda_handler(event:, context:)
  batch_item_failures = []

  event['Records'].each do |record|
    begin
      puts "Processed Kinesis Event - EventID: #{record['eventID']}"
      record_data = get_record_data_async(record['kinesis'])
      puts "Record Data: #{record_data}"
      # TODO: Do interesting work based on the new data
    rescue StandardError => err
      puts "An error occurred #{err}"
      # Since we are working with streams, we can return the failed item immediately.
      # Lambda will immediately begin to retry processing from this failed item onwards.
      return { batchItemFailures: [{ itemIdentifier: record['kinesis']['sequenceNumber'] }] }
    end
  end

  puts "Successfully processed #{event['Records'].length} records."
  { batchItemFailures: batch_item_failures }
end

def get_record_data_async(payload)
  data = Base64.decode64(payload['data']).force_encoding('utf-8')
  # Placeholder for actual async work
  sleep(1)
  data
end
```

------
#### [ Rust ]

**SDK für Rust**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melden von Fehlern bei Kinesis-Batchelementen mit Lambda unter Verwendung von Rust.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use aws_lambda_events::{
    event::kinesis::KinesisEvent,
    kinesis::KinesisEventRecord,
    streams::{KinesisBatchItemFailure, KinesisEventResponse},
};
use lambda_runtime::{run, service_fn, Error, LambdaEvent};

async fn function_handler(event: LambdaEvent<KinesisEvent>) -> Result<KinesisEventResponse, Error> {
    let mut response = KinesisEventResponse {
        batch_item_failures: vec![],
    };

    if event.payload.records.is_empty() {
        tracing::info!("No records found. Exiting.");
        return Ok(response);
    }

    for record in &event.payload.records {
        tracing::info!(
            "EventId: {}",
            record.event_id.as_deref().unwrap_or_default()
        );

        let record_processing_result = process_record(record);

        if record_processing_result.is_err() {
            response.batch_item_failures.push(KinesisBatchItemFailure {
                item_identifier: record.kinesis.sequence_number.clone(),
            });
            /* Since we are working with streams, we can return the failed item immediately.
            Lambda will immediately begin to retry processing from this failed item onwards. */
            return Ok(response);
        }
    }

    tracing::info!(
        "Successfully processed {} records",
        event.payload.records.len()
    );

    Ok(response)
}

fn process_record(record: &KinesisEventRecord) -> Result<(), Error> {
    let record_data = std::str::from_utf8(record.kinesis.data.as_slice());

    if let Some(err) = record_data.err() {
        tracing::error!("Error: {}", err);
        return Err(Error::from(err));
    }

    let record_data = record_data.unwrap_or_default();

    // do something interesting with the data
    tracing::info!("Data: {}", record_data);

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        // disable printing the name of the module in every log line.
        .with_target(false)
        // disabling time is handy because CloudWatch will add the ingestion time.
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

## Powertools für die AWS Lambda Batch-Verarbeitung verwenden
<a name="services-kinesis-batchfailurereporting-powertools"></a>

Das Batchverarbeitungsprogramm von Powertools for verarbeitet AWS Lambda automatisch die Logik für partielle Batch-Antworten und reduziert so die Komplexität der Implementierung von Batch-Fehlerberichten. Hier sind Beispiele für die Verwendung des Batch-Prozessors:

**Python**  
Umfassende Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Batch-Prozessor](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/).
Verarbeitung von Kinesis Data Streams Streams-Stream-Datensätzen mit einem AWS Lambda Batch-Prozessor.  

```
import json
from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType, process_partial_response
from aws_lambda_powertools.utilities.data_classes import KinesisEvent
from aws_lambda_powertools.utilities.typing import LambdaContext

processor = BatchProcessor(event_type=EventType.KinesisDataStreams)
logger = Logger()

def record_handler(record):
    logger.info(record)
    # Your business logic here
    # Raise an exception to mark this record as failed
    
def lambda_handler(event, context: LambdaContext):
    return process_partial_response(
        event=event, 
        record_handler=record_handler, 
        processor=processor,
        context=context
    )
```

**TypeScript**  
Umfassende Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Batch-Prozessor](https://docs.aws.amazon.com/powertools/typescript/latest/features/batch/).
Verarbeitung von Kinesis Data Streams Streams-Stream-Datensätzen mit einem AWS Lambda Batch-Prozessor.  

```
import { BatchProcessor, EventType, processPartialResponse } from '@aws-lambda-powertools/batch';
import { Logger } from '@aws-lambda-powertools/logger';
import type { KinesisEvent, Context } from 'aws-lambda';

const processor = new BatchProcessor(EventType.KinesisDataStreams);
const logger = new Logger();

const recordHandler = async (record: any): Promise<void> => {
    logger.info('Processing record', { record });
    // Your business logic here
    // Throw an error to mark this record as failed
};

export const handler = async (event: KinesisEvent, context: Context) => {
    return processPartialResponse(event, recordHandler, processor, {
        context,
    });
};
```

**Java**  
Umfassende Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Batch-Prozessor](https://docs.powertools.aws.dev/lambda/java/latest/utilities/batch/).
Verarbeitung von Kinesis Data Streams Streams-Stream-Datensätzen mit einem AWS Lambda Batch-Prozessor.  

```
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.KinesisEvent;
import com.amazonaws.services.lambda.runtime.events.StreamsEventResponse;
import software.amazon.lambda.powertools.batch.BatchMessageHandlerBuilder;
import software.amazon.lambda.powertools.batch.handler.BatchMessageHandler;

public class KinesisStreamBatchHandler implements RequestHandler<KinesisEvent, StreamsEventResponse> {

    private final BatchMessageHandler<KinesisEvent, StreamsEventResponse> handler;

    public KinesisStreamBatchHandler() {
        handler = new BatchMessageHandlerBuilder()
                .withKinesisBatchHandler()
                .buildWithRawMessageHandler(this::processMessage);
    }

    @Override
    public StreamsEventResponse handleRequest(KinesisEvent kinesisEvent, Context context) {
        return handler.processBatch(kinesisEvent, context);
    }

    private void processMessage(KinesisEvent.KinesisEventRecord kinesisEventRecord, Context context) {
        // Process the stream record
    }
}
```

**.NET**  
Umfassende Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Batch-Prozessor](https://docs.aws.amazon.com/powertools/dotnet/utilities/batch-processing/).
Verarbeitung von Kinesis Data Streams Streams-Stream-Datensätzen mit einem AWS Lambda Batch-Prozessor.  

```
using System;
using System.Threading;
using System.Threading.Tasks;
using Amazon.Lambda.Core;
using Amazon.Lambda.KinesisEvents;
using Amazon.Lambda.Serialization.SystemTextJson;
using AWS.Lambda.Powertools.BatchProcessing;

[assembly: LambdaSerializer(typeof(DefaultLambdaJsonSerializer))]

namespace HelloWorld;

public class OrderEvent
{
    public string? OrderId { get; set; }
    public string? CustomerId { get; set; }
    public decimal Amount { get; set; }
    public DateTime OrderDate { get; set; }
}

internal class TypedKinesisRecordHandler : ITypedRecordHandler<OrderEvent> 
{
    public async Task<RecordHandlerResult> HandleAsync(OrderEvent orderEvent, CancellationToken cancellationToken)
    {
        if (string.IsNullOrEmpty(orderEvent.OrderId)) 
        {
            throw new ArgumentException("Order ID is required");
        }

        return await Task.FromResult(RecordHandlerResult.None); 
    }
}

public class Function
{
    [BatchProcessor(TypedRecordHandler = typeof(TypedKinesisRecordHandler))]
    public BatchItemFailuresResponse HandlerUsingTypedAttribute(KinesisEvent _)
    {
        return TypedKinesisStreamBatchProcessor.Result.BatchItemFailuresResponse; 
    }
}
```

# Aufbewahrung verworfener Batch-Datensätze für eine Kinesis Data Streams-Ereignisquelle in Lambda
<a name="kinesis-on-failure-destination"></a>

Die Fehlerbehandlung für Kinesis-Zuordnungen von Ereignisquellen hängt davon ab, ob der Fehler vor dem Aufruf der Funktion oder während des Funktionsaufrufs auftritt:
+ **Vor dem Aufruf:** Wenn eine Lambda-Ereignisquellenzuordnung die Funktion aufgrund von Drosselung oder anderen Problemen nicht aufrufen kann, versucht sie es erneut, bis die Datensätze ablaufen oder das in der Ereignisquellenzuordnung () konfigurierte Höchstalter überschreiten. [MaximumRecordAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRecordAgeInSeconds)
+ **Während des Aufrufs:** Wenn die Funktion aufgerufen wird, aber einen Fehler zurückgibt, versucht Lambda es erneut, bis die Datensätze ablaufen, das Höchstalter ([MaximumRecordAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRecordAgeInSeconds)) überschreiten oder die konfigurierte Wiederholungsquote () erreicht haben. [MaximumRetryAttempts](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRetryAttempts) Bei Funktionsfehlern können Sie auch konfigurieren [BisectBatchOnFunctionError](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-response-BisectBatchOnFunctionError), dass ein fehlgeschlagener Batch in zwei kleinere Batches aufgeteilt wird, wodurch fehlerhafte Datensätze isoliert und Timeouts vermieden werden. Durch das Aufteilen von Batches wird die Quote für Wiederholungen nicht verbraucht.

Wenn die Fehlerbehandlungsmaßnahmen fehlschlagen, verwirft Lambda die Datensätze und setzt die Verarbeitung von Batches aus dem Stream fort. Bei den Standardeinstellungen bedeutet dies, dass ein fehlerhafter Datensatz die Verarbeitung auf dem betroffenen Shard für bis zu eine Woche blockieren kann. Um dies zu vermeiden, konfigurieren Sie die Ereignisquellenzuordnung Ihrer Funktion mit einer angemessenen Anzahl von Wiederholungen und einem maximalen Datensatzalter, das zu Ihrem Anwendungsfall passt.

## Konfigurieren von Zielen für fehlgeschlagene Aufrufe
<a name="kinesis-on-failure-destination-console"></a>

Um Datensätze zu fehlgeschlagenen Aufrufen zur Zuordnung von Ereignisquellen beizubehalten, fügen Sie der Zuordnung von Ereignisquellen Ihrer Funktion ein Ziel hinzu. Jeder an das Ziel gesendete Datensatz ist ein JSON-Dokument mit Metadaten über den fehlgeschlagenen Aufruf. Bei Amazon S3-Zielen sendet Lambda auch den gesamten Aufrufdatensatz zusammen mit den Metadaten. Sie können jedes Amazon SNS SNS-Thema, jede Amazon SQS SQS-Warteschlange, jeden Amazon S3 S3-Bucket oder Kafka als Ziel konfigurieren.

Bei Amazon-S3-Zielen können Sie das Feature [Amazon S3 Event Notifications](https://docs.aws.amazon.com/) verwenden, um Benachrichtigungen zu erhalten, wenn Objekte in Ihren S3-Ziel-Bucket hochgeladen werden. Sie können S3-Ereignisbenachrichtigungen auch so konfigurieren, dass sie eine andere Lambda-Funktion aufrufen, um eine automatische Verarbeitung für fehlgeschlagene Stapel durchzuführen.

Ihre Ausführungsrolle muss über Berechtigungen für das Ziel verfügen:
+ **[Für ein SQS-Ziel: sqs: SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)**
+ **[Für ein SNS-Ziel: sns:Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)**
+ **Für ein S3-Ziel: s3:** [und [s3: PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/ListObjectsV2.html)
+ **Für ein Kafka-Ziel: [kafka-cluster](https://docs.aws.amazon.com/msk/latest/developerguide/kafka-actions.html):** WriteData

Sie können ein Kafka-Thema als Ziel für den Fall eines Fehlers für Ihre Quellenzuordnungen für Kafka-Ereignisse konfigurieren. Wenn Lambda Datensätze nach anstrengenden Wiederholungsversuchen nicht verarbeiten kann oder wenn Datensätze das Höchstalter überschreiten, sendet Lambda die fehlgeschlagenen Datensätze zur späteren Verarbeitung an das angegebene Kafka-Thema. Weitere Informationen finden Sie unter [Ein Kafka-Thema als Ziel für den Fall eines Fehlers verwenden](kafka-on-failure-destination.md).

[Wenn Sie die Verschlüsselung mit Ihrem eigenen KMS-Schlüssel für ein S3-Ziel aktiviert haben, muss die Ausführungsrolle Ihrer Funktion auch die Berechtigung haben, kms: aufzurufen. GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) Wenn sich der KMS-Schlüssel und das S3-Bucket-Ziel in einem anderen Konto als Ihre Lambda-Funktion und Ausführungsrolle befinden, konfigurieren Sie den KMS-Schlüssel so, dass er der Ausführungsrolle vertraut, die zugelassen kms: GenerateDataKey wird.

Gehen Sie folgendermaßen vor, um ein Ausfallziel mit der Konsole zu konfigurieren:

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie eine Funktion aus.

1. Wählen Sie unter **Function overview (Funktionsübersicht)** die Option **Add destination (Ziel hinzufügen)**.

1. Wählen Sie als **Quelle** die Option **Aufruf der Zuordnung von Ereignisquellen** aus.

1. Wählen Sie für die **Zuordnung von Ereignisquellen** eine Ereignisquelle aus, die für diese Funktion konfiguriert ist.

1. Wählen Sie für **Bedingung** die Option **Bei Ausfall** aus. Für Aufrufe zur Zuordnung von Ereignisquellen ist dies die einzig akzeptierte Bedingung.

1. Wählen Sie unter **Zieltyp** den Zieltyp aus, an den Lambda Aufrufdatensätze sendet.

1. Wählen Sie unter **Destination (Ziel)** eine Ressource aus.

1. Wählen Sie **Speichern**.

Sie können mit AWS Command Line Interface (AWS CLI) auch ein Ziel für den Fall eines Fehlers konfigurieren. Mit dem folgenden [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)Befehl wird beispielsweise eine Zuordnung der Ereignisquelle mit einem SQS-Ziel für den Fall eines Fehlers hinzugefügt: `MyFunction`

```
aws lambda create-event-source-mapping \
--function-name "MyFunction" \
--event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream \
--destination-config '{"OnFailure": {"Destination": "arn:aws:sqs:us-east-1:123456789012:dest-queue"}}'
```

Der folgende [update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html)Befehl aktualisiert eine Ereignisquellenzuordnung, sodass fehlgeschlagene Aufrufdatensätze nach zwei Wiederholungsversuchen oder wenn die Datensätze älter als eine Stunde sind, an ein SNS-Ziel gesendet werden.

```
aws lambda update-event-source-mapping \
--uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
--maximum-retry-attempts 2 \
--maximum-record-age-in-seconds 3600 \
--destination-config '{"OnFailure": {"Destination": "arn:aws:sns:us-east-1:123456789012:dest-topic"}}'
```

Aktualisierte Einstellungen werden asynchron angewendet und werden erst nach Abschluss des Vorgangs in der Ausgabe berücksichtigt. Verwenden Sie den [get-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-event-source-mapping.html)-Befehl, um den aktuellen Status anzuzeigen.

Um ein Ziel zu entfernen, geben Sie eine leere Zeichenfolge als Argument für den `destination-config`-Parameter an:

```
aws lambda update-event-source-mapping \
--uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
--destination-config '{"OnFailure": {"Destination": ""}}'
```

### Bewährte Methoden für die Sicherheit in Amazon S3-Zielen
<a name="kinesis-s3-destination-security"></a>

Das Löschen eines S3-Buckets, der als Ziel konfiguriert ist, ohne das Ziel aus der Konfiguration Ihrer Funktion zu entfernen, kann ein Sicherheitsrisiko darstellen. Wenn ein anderer Benutzer den Namen Ihres Ziel-Buckets kennt, kann er den Bucket in seinem AWS-Konto neu erstellen. Aufzeichnungen über fehlgeschlagene Aufrufe werden an den entsprechenden Bucket gesendet, wodurch möglicherweise Daten aus Ihrer Funktion verfügbar gemacht werden.

**Warnung**  
Um sicherzustellen, dass Aufrufdatensätze Ihrer Funktion nicht an einen S3-Bucket in einem anderen gesendet werden können AWS-Konto, fügen Sie der Ausführungsrolle Ihrer Funktion eine Bedingung hinzu, die die `s3:PutObject` Berechtigungen auf Buckets in Ihrem Konto beschränkt. 

-Das folgende Beispiel zeigt eine IAM-Richtlinie, die die `s3:PutObject`-Berechtigungen Ihrer Funktion auf Buckets in Ihrem Konto beschränkt. Diese Richtlinie gibt Lambda auch die `s3:ListBucket`-Erlaubnis, einen S3-Bucket als Ziel zu verwenden.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*/*",
                "arn:aws:s3:::*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

Um der Ausführungsrolle Ihrer Funktion mithilfe von AWS-Managementkonsole oder eine Berechtigungsrichtlinie hinzuzufügen AWS CLI, lesen Sie die Anweisungen in den folgenden Verfahren:

------
#### [ Console ]

**So fügen Sie der Ausführungsrolle einer Funktion (Konsole) eine Berechtigungsrichtlinie hinzu**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Lambda-Funktion aus, deren Ausführungsrolle Sie ändern möchten.

1. Klicken Sie in der Registerkarte **Konfiguration** auf die Option **Berechtigungen**.

1. Wählen Sie auf der Registerkarte **Ausführungsrolle** den **Rollennamen** Ihrer Funktion aus, um die IAM-Konsolenseite der Rolle zu öffnen.

1. Fügen Sie der Rolle wie folgt eine Richtlinie mit Berechtigungen hinzu:

   1. Wählen Sie im Bereich **Berechtigungsrichtlinien** die Optionen **Berechtigungen hinzufügen** und dann **Inline-Richtlinie erstellen** aus.

   1. Wählen Sie im **Richtlinien-Editor** **JSON** aus.

   1. Fügen Sie die Richtlinie, die Sie hinzufügen möchten, in den Editor ein (indem Sie die vorhandene JSON-Datei ersetzt) und wählen Sie dann **Weiter** aus.

   1. Geben Sie unter **Richtliniendetails** für den **Richtliniennamen** ein.

   1. Wählen Sie **Richtlinie erstellen** aus.

------
#### [ AWS CLI ]

**So fügen Sie der Ausführungsrolle einer Funktion (CLI) eine Berechtigungsrichtlinie hinzu**

1. Erstellen Sie ein JSON-Richtliniendokument mit den erforderlichen Berechtigungen und speichern Sie es in einem lokalen Verzeichnis.

1. Verwenden Sie den `put-role-policy` IAM-CLI-Befehl, um die Berechtigungen zur Ausführungsrolle Ihrer Funktion hinzuzufügen. Führen Sie den folgenden Befehl in dem Verzeichnis aus, in dem Sie Ihr JSON-Richtliniendokument gespeichert haben und ersetzen Sie den Rollennamen, den Richtliniennamen und das Richtliniendokument durch Ihre eigenen Werte.

   ```
   aws iam put-role-policy \
   --role-name my_lambda_role \
   --policy-name LambdaS3DestinationPolicy \
   --policy-document file://my_policy.json
   ```

------

### Beispiel für einen Amazon SNS- und Amazon SQS-Aufrufsatz
<a name="kinesis-on-failure-destination-example-sns-sqs"></a>

Das folgende Beispiel zeigt, was Lambda bei einem fehlgeschlagenen Aufruf der Kinesis-Ereignisquelle an eine SQS-Warteschlange oder ein SNS-Thema sendet. Da Lambda nur die Metadaten für diese Zieltypen sendet, verwenden Sie die Felder `streamArn`, `shardId`, `startSequenceNumber` und `endSequenceNumber`, um den vollständigen Originaldatensatz abzurufen. Alle in der `KinesisBatchInfo`-Eigenschaft angezeigten Felder sind immer vorhanden.

```
{
    "requestContext": {
        "requestId": "c9b8fa9f-5a7f-xmpl-af9c-0c604cde93a5",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction",
        "condition": "RetryAttemptsExhausted",
        "approximateInvokeCount": 1
    },
    "responseContext": {
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "version": "1.0",
    "timestamp": "2019-11-14T00:38:06.021Z",
    "KinesisBatchInfo": {
        "shardId": "shardId-000000000001",
        "startSequenceNumber": "49601189658422359378836298521827638475320189012309704722",
        "endSequenceNumber": "49601189658422359378836298522902373528957594348623495186",
        "approximateArrivalOfFirstRecord": "2019-11-14T00:38:04.835Z",
        "approximateArrivalOfLastRecord": "2019-11-14T00:38:05.580Z",
        "batchSize": 500,
        "streamArn": "arn:aws:kinesis:us-east-2:123456789012:stream/mystream"
    }
}
```

Sie können diese Informationen verwenden, um die betroffenen Datensätze aus dem Stream für die Fehlersuche abzurufen. Die tatsächlichen Datensätze sind nicht enthalten, daher müssen Sie diesen Datensatz verarbeiten und aus dem Stream abrufen, bevor sie ablaufen und verloren gehen.

### Beispiel eines Amazon S3-Aufrufdatensatzes
<a name="kinesis-on-failure-destination-example-sns-sqs-s3"></a>

Das folgende Beispiel zeigt, was Lambda bei einem fehlgeschlagenen Aufruf der Kinesis-Ereignisquelle an einen Amazon S3-Bucket sendet. Zusätzlich zu allen Feldern aus dem vorherigen Beispiel für SQS- und SNS-Ziele enthält das Feld `payload` den ursprünglichen Aufrufdatensatz als maskierte JSON-Zeichenfolge.

```
{
    "requestContext": {
        "requestId": "c9b8fa9f-5a7f-xmpl-af9c-0c604cde93a5",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction",
        "condition": "RetryAttemptsExhausted",
        "approximateInvokeCount": 1
    },
    "responseContext": {
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "version": "1.0",
    "timestamp": "2019-11-14T00:38:06.021Z",
    "KinesisBatchInfo": {
        "shardId": "shardId-000000000001",
        "startSequenceNumber": "49601189658422359378836298521827638475320189012309704722",
        "endSequenceNumber": "49601189658422359378836298522902373528957594348623495186",
        "approximateArrivalOfFirstRecord": "2019-11-14T00:38:04.835Z",
        "approximateArrivalOfLastRecord": "2019-11-14T00:38:05.580Z",
        "batchSize": 500,
        "streamArn": "arn:aws:kinesis:us-east-2:123456789012:stream/mystream"
    },
    "payload": "<Whole Event>" // Only available in S3
}
```

Das S3-Objekt, das den Aufrufdatensatz enthält, verwendet die folgende Namenskonvention:

```
aws/lambda/<ESM-UUID>/<shardID>/YYYY/MM/DD/YYYY-MM-DDTHH.MM.SS-<Random UUID>
```

# Implementierung der zustandsabhängigen Verarbeitung von Kinesis-Datenströmen in Lambda
<a name="services-kinesis-windows"></a>

Lambda-Funktionen können kontinuierliche Stream-Verarbeitungsanwendungen ausführen. Ein Stream entspricht einer unbegrenzten Menge von Daten, die kontinuierlich durch Ihre Anwendung fließen. Um Informationen aus dieser sich ständig aktualisierenden Eingabe zu analysieren, können Sie die enthaltenen Datensätze mithilfe eines zeitlich definierten Fensters binden.

Rollierende Fenster sind unterschiedliche Zeitfenster, die sich in regelmäßigen Abständen öffnen und schließen. Standardmäßig sind Lambda-Aufrufe zustandslos – Sie können sie nicht für die Verarbeitung von Daten über mehrere kontinuierliche Aufrufe hinweg ohne eine externe Datenbank verwenden. Mit rollierenden Fenstern können Sie jedoch Ihren Status über Aufrufe hinweg beibehalten. Dieser Zustand enthält das Gesamtergebnis der Nachrichten, die zuvor für das aktuelle Fenster verarbeitet wurden. Ihr Zustand kann maximal 1 MB pro Shard betragen. Wenn er diese Größe überschreitet, wird Lambda das Fenster vorzeitig beenden.

Jeder Datensatz in einem Stream gehört zu einem bestimmten Fenster. Lambda verarbeitet jeden Datensatz mindestens einmal, garantiert jedoch nicht, dass jeder Datensatz nur einmal verarbeitet wird. In seltenen Fällen, etwa bei der Fehlerbehandlung, werden einige Datensätze möglicherweise mehrmals verarbeitet. Datensätze werden beim ersten Mal immer in der richtigen Reihenfolge verarbeitet. Wenn Datensätze mehr als einmal verarbeitet werden, werden sie nicht in der richtigen Reihenfolge verarbeitet.

## Aggregation und Verarbeitung
<a name="streams-tumbling-processing"></a>

Ihre benutzerverwaltete Funktion wird sowohl zur Aggregation als auch zur Verarbeitung der Endergebnisse dieser Aggregation aufgerufen. Lambda aggregiert alle im Fenster empfangenen Datensätze. Sie können diese Datensätze in mehreren Stapeln erhalten, jeweils als ein separater Aufruf. Jeder Aufruf erhält einen Zustand. Wenn Sie also rollierende Fenster verwenden, muss Ihre Lambda-Funktionsantwort eine `state`-Eigenschaft enthalten. Wenn die Antwort keine `state`-Eigenschaft enthält, betrachtet Lambda dies als fehlgeschlagenen Aufruf. Um diese Bedingung zu erfüllen, kann Ihre Funktion ein `TimeWindowEventResponse`-Objekt zurückgeben, das die folgende JSON-Form aufweist:

**Example `TimeWindowEventResponse`-Werte**  

```
{
    "state": {
        "1": 282,
        "2": 715
    },
    "batchItemFailures": []
}
```

**Anmerkung**  
Für Java-Funktionen empfehlen wir, eine `Map<String, String>` zu verwenden, um den Status darzustellen.

Am Ende des Fensters wird das Flag `isFinalInvokeForWindow` auf `true` gesetzt, um anzugeben, dass es sich um den Endzustand handelt und dass es für die Verarbeitung bereit ist. Nach der Verarbeitung werden das Fenster und Ihr endgültiger Aufruf wird abgeschlossen, und dann wird der Zustand gelöscht.

Am Ende Ihres Fensters verwendet Lambda die endgültige Verarbeitung für Aktionen an den Aggregationsergebnissen. Ihre endgültige Verarbeitung wird synchron aufgerufen. Nach erfolgreichem Aufruf zeigt Ihre Funktion auf die Sequenznummer und die Stream-Verarbeitung wird fortgesetzt. Wenn der Aufruf nicht erfolgreich ist, unterbricht Ihre Lambda-Funktion die weitere Verarbeitung bis zu einem erfolgreichen Aufruf.

**Example KinesisTimeWindowEvent**  

```
{
    "Records": [
        {
            "kinesis": {
                "kinesisSchemaVersion": "1.0",
                "partitionKey": "1",
                "sequenceNumber": "49590338271490256608559692538361571095921575989136588898",
                "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
                "approximateArrivalTimestamp": 1607497475.000
            },
            "eventSource": "aws:kinesis",
            "eventVersion": "1.0",
            "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898",
            "eventName": "aws:kinesis:record",
            "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-kinesis-role",
            "awsRegion": "us-east-1",
            "eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/lambda-stream"
        }
    ],
    "window": {
        "start": "2020-12-09T07:04:00Z",
        "end": "2020-12-09T07:06:00Z"
    },
    "state": {
        "1": 282,
        "2": 715
    },
    "shardId": "shardId-000000000006",
    "eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/lambda-stream",
    "isFinalInvokeForWindow": false,
    "isWindowTerminatedEarly": false
}
```

## Konfiguration
<a name="streams-tumbling-config"></a>

Sie können rollierende Fenster konfigurieren, wenn Sie eine Ereignisquellenzuordnung erstellen oder aktualisieren. Um ein Taumelfenster zu konfigurieren, geben Sie das Fenster in Sekunden an ([TumblingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-TumblingWindowInSeconds)). Der folgende Beispielbefehl AWS Command Line Interface (AWS CLI) erstellt eine Quellenzuordnung für Streaming-Ereignisse mit einem Wechselfenster von 120 Sekunden. Die für Aggregation und Verarbeitung definierte Lambda-Funktion wird `tumbling-window-example-function` genannt.

```
aws lambda create-event-source-mapping \
--event-source-arn arn:aws:kinesis:us-east-1:123456789012:stream/lambda-stream \
--function-name tumbling-window-example-function \
--starting-position TRIM_HORIZON \
--tumbling-window-in-seconds 120
```

Lambda bestimmt die rollierenden Fenstergrenzen basierend auf dem Zeitpunkt, zu dem Datensätze in den Stream eingefügt wurden. Für alle Datensätze steht ein ungefährer Zeitstempel zur Verfügung, den Lambda in Grenzbestimmungen verwendet.

Rollierende Fensteraggregationen unterstützen kein Resharding. Wenn ein Shard endet, betrachtet Lambda das aktuelle Fenster als geschlossen, und alle untergeordneten Shards beginnen ihr eigenes Fenster in einem neuen Zustand. Wenn dem aktuellen Fenster keine neuen Datensätze hinzugefügt werden, wartet Lambda bis zu 2 Minuten, bevor es annimmt, dass das Fenster zu Ende ist. Dadurch wird sichergestellt, dass die Funktion alle Datensätze im aktuellen Fenster liest, auch wenn die Datensätze in Abständen hinzugefügt werden.

Rollierende Fenster unterstützen vollständig die bestehenden Wiederholungsrichtlinien `maxRetryAttempts` und `maxRecordAge`.

**Example Handler.py – Aggregation und Verarbeitung**  
Die folgende Python-Funktion veranschaulicht, wie Sie Ihren Endzustand aggregieren und dann verarbeiten:  

```
def lambda_handler(event, context):
    print('Incoming event: ', event)
    print('Incoming state: ', event['state'])

#Check if this is the end of the window to either aggregate or process.
    if event['isFinalInvokeForWindow']:
        # logic to handle final state of the window
        print('Destination invoke')
    else:
        print('Aggregate invoke')

#Check for early terminations
    if event['isWindowTerminatedEarly']:
        print('Window terminated early')

    #Aggregation logic
    state = event['state']
    for record in event['Records']:
        state[record['kinesis']['partitionKey']] = state.get(record['kinesis']['partitionKey'], 0) + 1

    print('Returning state: ', state)
    return {'state': state}
```

# Lambda-Parameter für Amazon Kinesis Data Streams Zuordnungen von Ereignisquellen
<a name="services-kinesis-parameters"></a>

Alle Lambda-Zuordnungen von Ereignisquellen verwenden dieselben API-Operationen [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) und [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html). Allerdings gelten nur einige der Parameter für Kinesis.


| Parameter | Erforderlich | Standard | Hinweise | 
| --- | --- | --- | --- | 
|  [BatchSize](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-BatchSize)  |  N  |  100  |  Höchstwert: 10 000.  | 
|  [BisectBatchOnFunctionError](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-BisectBatchOnFunctionError)  |  N  |  false  |  Keine | 
|  [DestinationConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-DestinationConfig)  |  N  | N/A |  Ein Ziel der Amazon-SQS-Warteschlange oder des Amazon-SNS-Themas für verworfene Datensätze. Weitere Informationen finden Sie unter [Konfigurieren von Zielen für fehlgeschlagene Aufrufe](kinesis-on-failure-destination.md#kinesis-on-failure-destination-console).  | 
|  [Aktiviert](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-Enabled)  |  N  |  true  |  Keine | 
|  [EventSourceArn](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-EventSourceArn)  |  Y  | N/A |  Der ARN des Datenstroms oder eines Stream-Konsumenten  | 
|  [FunctionName](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-FunctionName)  |  Y  | N/A |  Keine | 
|  [FunctionResponseTypes](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-FunctionResponseTypes)  |  N  |  N/A |  Damit Ihre Funktion bestimmte Fehler in einem Batch meldet, beziehen Sie den Wert `ReportBatchItemFailures` in `FunctionResponseTypes` ein. Weitere Informationen finden Sie unter [Konfigurieren einer teilweisen Batch-Antwort mit Kinesis Data Streams und Lambda](services-kinesis-batchfailurereporting.md).  | 
|  [MaximumBatchingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumBatchingWindowInSeconds)  |  N  |  0  |  Keine | 
|  [MaximumRecordAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRecordAgeInSeconds)  |  N  |  -1  |  -1 bedeutet unendlich: Lambda verwirft keine Datensätze ([Kinesis Data Streams-Datenaufbewahrungseinstellungen](https://docs.aws.amazon.com/streams/latest/dev/kinesis-extended-retention.html) gelten weiterhin) Minimum: -1 Höchstwert: 604 800  | 
|  [MaximumRetryAttempts](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRetryAttempts)  |  N  |  -1  |  -1 bedeutet unendlich: Fehlgeschlagene Datensätze werden wiederholt, bis der Datensatz abläuft Minimum: -1 Höchstwert: 10 000.  | 
|  [ParallelizationFactor](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-ParallelizationFactor)  |  N  |  1  |  Maximum: 10  | 
|  [StartingPosition](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-StartingPosition)  |  Y  |  N/A |  AT\$1TIMESTAMP, TRIM\$1HORIZON, oder LATEST  | 
|  [StartingPositionTimestamp](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-StartingPositionTimestamp)  |  N  |  N/A |  Nur gültig, wenn StartingPosition auf AT\$1TIMESTAMP gesetzt ist. Die Zeit, ab der mit dem Lesen begonnen werden soll, in Unix-Zeitsekunden  | 
|  [TumblingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-TumblingWindowInSeconds)  |  N  |  N/A |  Minimum: 0 Maximum: 900  | 

# Verwendung der Ereignisfilterung mit einer Kinesis-Ereignisquelle
<a name="with-kinesis-filtering"></a>

Sie können die Ereignisfilterung verwenden, um zu steuern, welche Datensätze aus einem Stream oder einer Warteschlange Lambda an Ihre Funktion sendet. Allgemeine Informationen über die Funktionsweise der Ereignisfilterung finden Sie unter [Steuern Sie, welche Ereignisse Lambda an Ihre Funktion sendet](invocation-eventfiltering.md).

Dieser Abschnitt konzentriert sich auf die Ereignisfilterung für Kinesis-Ereignisquellen.

**Anmerkung**  
Kinesis-Zuordnungen von Ereignisquellen unterstützen nur das Filtern nach dem `data`-Schlüssel.

**Topics**
+ [

## Grundlagen der Kinesis-Ereignisfilterung
](#filtering-kinesis)
+ [

## Filtern von aggregierten Kinesis-Datensätzen
](#filtering-kinesis-efo)

## Grundlagen der Kinesis-Ereignisfilterung
<a name="filtering-kinesis"></a>

Angenommen, ein Producer gibt JSON-formatierte Daten in Ihren Kinesis-Datenstrom ein. Ein Beispieldatensatz würde wie folgt aussehen, wobei die JSON-Daten im `data`-Feld in eine Base64-kodierte Zeichenfolge umgewandelt wurden.

```
{
    "kinesis": {
        "kinesisSchemaVersion": "1.0",
        "partitionKey": "1",
        "sequenceNumber": "49590338271490256608559692538361571095921575989136588898",
        "data": "eyJSZWNvcmROdW1iZXIiOiAiMDAwMSIsICJUaW1lU3RhbXAiOiAieXl5eS1tbS1kZFRoaDptbTpzcyIsICJSZXF1ZXN0Q29kZSI6ICJBQUFBIn0=",
        "approximateArrivalTimestamp": 1545084650.987
        },
    "eventSource": "aws:kinesis",
    "eventVersion": "1.0",
    "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898",
    "eventName": "aws:kinesis:record",
    "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role",
    "awsRegion": "us-east-2",
    "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream"
}
```

Solange die Daten, die der Producer in den Stream einspeist, als JSON gültig sind, können Sie die Ereignisfilterung verwenden, um Datensätze anhand des `data`-Schlüssels zu filtern. Nehmen wir an, ein Produzent gibt Datensätze im folgenden JSON-Format in Ihren Kinesis-Stream ein.

```
{
    "record": 12345,
    "order": {
        "type": "buy",
        "stock": "ANYCO",
        "quantity": 1000
        }
}
```

Um nur die Datensätze zu filtern, bei denen der Auftragstyp "Kaufen" ist, würde das `FilterCriteria`-Objekt wie folgt aussehen.

```
{
    "Filters": [
        {
            "Pattern": "{ \"data\" : { \"order\" : { \"type\" : [ \"buy\" ] } } }"
        }
    ]
}
```

Zur Verdeutlichung sehen Sie hier den Wert des Filter-`Pattern` in reinem JSON. 

```
{
    "data": {
        "order": {
            "type": [ "buy" ]
            }
      }
}
```

Sie können Ihren Filter mithilfe der Konsole, AWS CLI oder einer AWS SAM-Vorlage hinzufügen.

------
#### [ Console ]

Um diesen Filter mithilfe der Konsole hinzuzufügen, folgen Sie den Anweisungen unter [Anhängen von Filterkriterien an eine Ereignisquellenzuordnung (Konsole)](invocation-eventfiltering.md#filtering-console) und geben Sie die folgende Zeichenfolge für die **Filterkriterien** ein.

```
{ "data" : { "order" : { "type" : [ "buy" ] } } }
```

------
#### [ AWS CLI ]

Um eine neue Zuordnung von Ereignisquellen mit diesen Filterkriterien über die AWS Command Line Interface (AWS CLI) zu erstellen, führen Sie den folgenden Befehl aus.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/my-stream \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"order\" : { \"type\" : [ \"buy\" ] } } }"}]}'
```

Führen Sie den folgenden Befehl aus, um diese Filterkriterien zu einer vorhandenen Zuordnung von Ereignisquellen hinzuzufügen.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"order\" : { \"type\" : [ \"buy\" ] } } }"}]}'
```

------
#### [ AWS SAM ]

Um diesen Filter mit der AWS SAM hinzuzufügen, fügen Sie das folgende Snippet zur YAML-Vorlage für Ihre Ereignisquelle hinzu.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "data" : { "order" : { "type" : [ "buy" ] } } }'
```

------

Um Ereignisse aus Kinesis-Quellen ordnungsgemäß zu filtern, müssen sowohl das Datenfeld als auch die Filterkriterien für das Datenfeld ein gültiges JSON-Format aufweisen. Wenn eines der Felder kein gültiges JSON-Format hat, verwirft Lambda die Nachricht oder gibt eine Ausnahme aus. In der folgenden Tabelle ist das Verhalten zusammengefasst: 


| Format der eingehenden Daten | Filtermusterformat für Dateneigenschaften | Resultierende Aktion | 
| --- | --- | --- | 
|  Gültiges JSON  |  Gültiges JSON  |  Lambda filtert basierend auf Ihren Filterkriterien.  | 
|  Gültiges JSON  |  Kein Filtermuster für Dateneigenschaften  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Gültiges JSON  |  Kein JSON  |  Lambda gibt zum Zeitpunkt der Erstellung oder Aktualisierung der Ereignisquellenzuordnung eine Ausnahme aus. Das Filtermuster für Dateneigenschaften muss ein gültiges JSON-Format haben.  | 
|  Kein JSON  |  Gültiges JSON  |  Lambda verwirft den Datensatz.  | 
|  Kein JSON  |  Kein Filtermuster für Dateneigenschaften  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Kein JSON  |  Kein JSON  |  Lambda gibt zum Zeitpunkt der Erstellung oder Aktualisierung der Ereignisquellenzuordnung eine Ausnahme aus. Das Filtermuster für Dateneigenschaften muss ein gültiges JSON-Format haben.  | 

## Filtern von aggregierten Kinesis-Datensätzen
<a name="filtering-kinesis-efo"></a>

Mit Kinesis können Sie mehrere Datensätze in einem einzigen Kinesis-Datenstrom-Datensatz zusammenfassen, um Ihren Datendurchsatz zu erhöhen. Lambda kann Filterkriterien nur auf aggregierte Datensätze anwenden, wenn Sie Kinesis [Enhanced Fanout](https://docs.aws.amazon.com/streams/latest/dev/enhanced-consumers.html) verwenden. Das Filtern aggregierter Datensätze mit Standard-Kinesis wird nicht unterstützt. Bei der Verwendung von Enhanced Fan-Out konfigurieren Sie einen dedizierten Kinesis-Durchsatzverbraucher, der als Auslöser für Ihre Lambda-Funktion dient. Lambda filtert dann die aggregierten Datensätze und übergibt nur die Datensätze, die Ihren Filterkriterien entsprechen.

Weitere Informationen zur Aggregation von Kinesis-Datensätzen finden Sie im Abschnitt [Aggregation](https://docs.aws.amazon.com/streams/latest/dev/kinesis-kpl-concepts.html#kinesis-kpl-concepts-aggretation) auf der Seite mit den wichtigsten Konzepten der Kinesis Producer Library (KPL). Weitere Informationen zur Verwendung von Lambda mit Kinesis Enhanced Fanout finden Sie im AWS-Compute-Blog unter [Erhöhung der Streamverarbeitungsleistung in Echtzeit mit Amazon Kinesis Data Streams Enhanced Fanout und AWS Lambda](https://aws.amazon.com/blogs/compute/increasing-real-time-stream-processing-performance-with-amazon-kinesis-data-streams-enhanced-fan-out-and-aws-lambda/).

# Anleitung: Verwenden von Lambda mit Kinesis Data Streams
<a name="with-kinesis-example"></a>

In dieser Anleitung erstellen Sie eine Lambda-Funktion, um Ereignisse aus einem Amazon Kinesis Data Streams zu nutzen. 

1. Die benutzerdefinierte Anwendung schreibt die Datensätze zum Stream.

1. AWS Lambda fragt den Stream ab und ruft, wenn es neue Datensätze im Stream erkennt, Ihre Lambda-Funktion auf.

1. AWS Lambda führt die Lambda-Funktion aus, indem es die Ausführungsrolle annimmt, die Sie bei der Erstellung der Lambda-Funktion angegeben haben.

## Voraussetzungen
<a name="with-kinesis-prepare"></a>

### Installieren Sie die AWS Command Line Interface
<a name="install_aws_cli"></a>

Wenn Sie das noch nicht installiert haben AWS Command Line Interface, folgen Sie den Schritten unter [Installieren oder Aktualisieren der neuesten Version von AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), um es zu installieren.

Das Tutorial erfordert zum Ausführen von Befehlen ein Befehlszeilenterminal oder eine Shell. Verwenden Sie unter Linux und macOS Ihre bevorzugte Shell und Ihren bevorzugten Paketmanager.

**Anmerkung**  
In Windows werden einige Bash-CLI-Befehle, die Sie häufig mit Lambda verwenden (z. B. `zip`), von den integrierten Terminals des Betriebssystems nicht unterstützt. Um eine in Windows integrierte Version von Ubuntu und Bash zu erhalten, [installieren Sie das Windows-Subsystem für Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). 

## Erstellen der Ausführungsrolle
<a name="with-kinesis-example-create-iam-role"></a>

Erstellen Sie die [Ausführungsrolle](lambda-intro-execution-role.md), die Ihrer Funktion die Berechtigung zum Zugriff auf AWS Ressourcen erteilt.

**So erstellen Sie eine Ausführungsrolle**

1. Öffnen Sie die Seite [Roles (Rollen)](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie **Rolle erstellen** aus.

1. Erstellen Sie eine Rolle mit den folgenden Eigenschaften.
   + **Trusted entity (Vertrauenswürdige Entität** – **AWS Lambda**.
   + **Berechtigungen** — **AWSLambdaKinesisExecutionRole**.
   + **Role name (Name der Rolle** – **lambda-kinesis-role**.

Die **AWSLambdaKinesisExecutionRole**Richtlinie verfügt über die Berechtigungen, die die Funktion zum Lesen von Elementen aus Kinesis und zum CloudWatch Schreiben von Protokollen in Logs benötigt.

## Erstellen der Funktion
<a name="with-kinesis-example-create-function"></a>

Erstellen Sie eine Lambda-Funktion, die Ihre Kinesis-Nachrichten verarbeitet. Der Funktionscode protokolliert die Ereignis-ID und die Ereignisdaten des Kinesis-Datensatzes in CloudWatch Logs.

In diesem Tutorial wird die Runtime Node.js 24 verwendet, aber wir haben auch Beispielcode in anderen Laufzeitsprachen bereitgestellt. Sie können die Registerkarte im folgenden Feld auswählen, um Code für die gewünschte Laufzeit anzusehen. Der JavaScript Code, den Sie in diesem Schritt verwenden, befindet sich im ersten Beispiel, das auf der **JavaScript**Registerkarte angezeigt wird.

------
#### [ .NET ]

**SDK für .NET**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Nutzen eines Kinesis-Ereignisses mit Lambda unter Verwendung von .NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
﻿using System.Text;
using Amazon.Lambda.Core;
using Amazon.Lambda.KinesisEvents;
using AWS.Lambda.Powertools.Logging;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace KinesisIntegrationSampleCode;

public class Function
{
    // Powertools Logger requires an environment variables against your function
    // POWERTOOLS_SERVICE_NAME
    [Logging(LogEvent = true)]
    public async Task FunctionHandler(KinesisEvent evnt, ILambdaContext context)
    {
        if (evnt.Records.Count == 0)
        {
            Logger.LogInformation("Empty Kinesis Event received");
            return;
        }

        foreach (var record in evnt.Records)
        {
            try
            {
                Logger.LogInformation($"Processed Event with EventId: {record.EventId}");
                string data = await GetRecordDataAsync(record.Kinesis, context);
                Logger.LogInformation($"Data: {data}");
                // TODO: Do interesting work based on the new data
            }
            catch (Exception ex)
            {
                Logger.LogError($"An error occurred {ex.Message}");
                throw;
            }
        }
        Logger.LogInformation($"Successfully processed {evnt.Records.Count} records.");
    }

    private async Task<string> GetRecordDataAsync(KinesisEvent.Record record, ILambdaContext context)
    {
        byte[] bytes = record.Data.ToArray();
        string data = Encoding.UTF8.GetString(bytes);
        await Task.CompletedTask; //Placeholder for actual async work
        return data;
    }
}
```

------
#### [ Go ]

**SDK für Go V2**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Nutzen eines Kinesis-Ereignisses mit Lambda unter Verwendung von Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main

import (
	"context"
	"log"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context, kinesisEvent events.KinesisEvent) error {
	if len(kinesisEvent.Records) == 0 {
		log.Printf("empty Kinesis event received")
		return nil
	}

	for _, record := range kinesisEvent.Records {
		log.Printf("processed Kinesis event with EventId: %v", record.EventID)
		recordDataBytes := record.Kinesis.Data
		recordDataText := string(recordDataBytes)
		log.Printf("record data: %v", recordDataText)
		// TODO: Do interesting work based on the new data
	}
	log.Printf("successfully processed %v records", len(kinesisEvent.Records))
	return nil
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK für Java 2.x**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Nutzen eines Kinesis-Ereignisses mit Lambda unter Verwendung von Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.KinesisEvent;

public class Handler implements RequestHandler<KinesisEvent, Void> {
    @Override
    public Void handleRequest(final KinesisEvent event, final Context context) {
        LambdaLogger logger = context.getLogger();
        if (event.getRecords().isEmpty()) {
            logger.log("Empty Kinesis Event received");
            return null;
        }
        for (KinesisEvent.KinesisEventRecord record : event.getRecords()) {
            try {
                logger.log("Processed Event with EventId: "+record.getEventID());
                String data = new String(record.getKinesis().getData().array());
                logger.log("Data:"+ data);
                // TODO: Do interesting work based on the new data
            }
            catch (Exception ex) {
                logger.log("An error occurred:"+ex.getMessage());
                throw ex;
            }
        }
        logger.log("Successfully processed:"+event.getRecords().size()+" records");
        return null;
    }

}
```

------
#### [ JavaScript ]

**SDK für JavaScript (v3)**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/blob/main/integration-kinesis-to-lambda). 
Ein Kinesis-Ereignis mit Lambda unter Verwendung von. JavaScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
  for (const record of event.Records) {
    try {
      console.log(`Processed Kinesis Event - EventID: ${record.eventID}`);
      const recordData = await getRecordDataAsync(record.kinesis);
      console.log(`Record Data: ${recordData}`);
      // TODO: Do interesting work based on the new data
    } catch (err) {
      console.error(`An error occurred ${err}`);
      throw err;
    }
  }
  console.log(`Successfully processed ${event.Records.length} records.`);
};

async function getRecordDataAsync(payload) {
  var data = Buffer.from(payload.data, "base64").toString("utf-8");
  await Promise.resolve(1); //Placeholder for actual async work
  return data;
}
```
Ein Kinesis-Ereignis mit Lambda unter Verwendung von. TypeScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import {
  KinesisStreamEvent,
  Context,
  KinesisStreamHandler,
  KinesisStreamRecordPayload,
} from "aws-lambda";
import { Buffer } from "buffer";
import { Logger } from "@aws-lambda-powertools/logger";

const logger = new Logger({
  logLevel: "INFO",
  serviceName: "kinesis-stream-handler-sample",
});

export const functionHandler: KinesisStreamHandler = async (
  event: KinesisStreamEvent,
  context: Context
): Promise<void> => {
  for (const record of event.Records) {
    try {
      logger.info(`Processed Kinesis Event - EventID: ${record.eventID}`);
      const recordData = await getRecordDataAsync(record.kinesis);
      logger.info(`Record Data: ${recordData}`);
      // TODO: Do interesting work based on the new data
    } catch (err) {
      logger.error(`An error occurred ${err}`);
      throw err;
    }
    logger.info(`Successfully processed ${event.Records.length} records.`);
  }
};

async function getRecordDataAsync(
  payload: KinesisStreamRecordPayload
): Promise<string> {
  var data = Buffer.from(payload.data, "base64").toString("utf-8");
  await Promise.resolve(1); //Placeholder for actual async work
  return data;
}
```

------
#### [ PHP ]

**SDK für PHP**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Nutzen eines Kinesis-Ereignisses mit Lambda unter Verwendung von PHP.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
<?php

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\Kinesis\KinesisEvent;
use Bref\Event\Kinesis\KinesisHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler extends KinesisHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws JsonException
     * @throws \Bref\Event\InvalidLambdaEvent
     */
    public function handleKinesis(KinesisEvent $event, Context $context): void
    {
        $this->logger->info("Processing records");
        $records = $event->getRecords();
        foreach ($records as $record) {
            $data = $record->getData();
            $this->logger->info(json_encode($data));
            // TODO: Do interesting work based on the new data

            // Any exception thrown will be logged and the invocation will be marked as failed
        }
        $totalRecords = count($records);
        $this->logger->info("Successfully processed $totalRecords records");
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

------
#### [ Python ]

**SDK für Python (Boto3)**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Nutzen eines Kinesis-Ereignisses mit Lambda unter Verwendung von Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
import base64
def lambda_handler(event, context):

    for record in event['Records']:
        try:
            print(f"Processed Kinesis Event - EventID: {record['eventID']}")
            record_data = base64.b64decode(record['kinesis']['data']).decode('utf-8')
            print(f"Record Data: {record_data}")
            # TODO: Do interesting work based on the new data
        except Exception as e:
            print(f"An error occurred {e}")
            raise e
    print(f"Successfully processed {len(event['Records'])} records.")
```

------
#### [ Ruby ]

**SDK für Ruby**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Nutzen eines Kinesis-Ereignisses mit Lambda unter Verwendung von Ruby.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
require 'aws-sdk'

def lambda_handler(event:, context:)
  event['Records'].each do |record|
    begin
      puts "Processed Kinesis Event - EventID: #{record['eventID']}"
      record_data = get_record_data_async(record['kinesis'])
      puts "Record Data: #{record_data}"
      # TODO: Do interesting work based on the new data
    rescue => err
      $stderr.puts "An error occurred #{err}"
      raise err
    end
  end
  puts "Successfully processed #{event['Records'].length} records."
end

def get_record_data_async(payload)
  data = Base64.decode64(payload['data']).force_encoding('UTF-8')
  # Placeholder for actual async work
  # You can use Ruby's asynchronous programming tools like async/await or fibers here.
  return data
end
```

------
#### [ Rust ]

**SDK für Rust**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Nutzen eines Kinesis-Ereignisses mit Lambda unter Verwendung von Rust.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use aws_lambda_events::event::kinesis::KinesisEvent;
use lambda_runtime::{run, service_fn, Error, LambdaEvent};

async fn function_handler(event: LambdaEvent<KinesisEvent>) -> Result<(), Error> {
    if event.payload.records.is_empty() {
        tracing::info!("No records found. Exiting.");
        return Ok(());
    }

    event.payload.records.iter().for_each(|record| {
        tracing::info!("EventId: {}",record.event_id.as_deref().unwrap_or_default());

        let record_data = std::str::from_utf8(&record.kinesis.data);

        match record_data {
            Ok(data) => {
                // log the record data
                tracing::info!("Data: {}", data);
            }
            Err(e) => {
                tracing::error!("Error: {}", e);
            }
        }
    });

    tracing::info!(
        "Successfully processed {} records",
        event.payload.records.len()
    );

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        // disable printing the name of the module in every log line.
        .with_target(false)
        // disabling time is handy because CloudWatch will add the ingestion time.
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

**So erstellen Sie die Funktion**

1. Erstellen Sie ein Verzeichnis für das Projekt und wechseln Sie dann zu diesem Verzeichnis.

   ```
   mkdir kinesis-tutorial
   cd kinesis-tutorial
   ```

1. Kopieren Sie den JavaScript Beispielcode in eine neue Datei mit dem Namen`index.js`.

1. Erstellen Sie ein Bereitstellungspaket.

   ```
   zip function.zip index.js
   ```

1. Erstellen Sie eine Lambda-Funktion mit dem Befehl `create-function`.

   ```
   aws lambda create-function --function-name ProcessKinesisRecords \
   --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
   --role arn:aws:iam::111122223333:role/lambda-kinesis-role
   ```

## Lambda-Funktion testen
<a name="walkthrough-kinesis-events-adminuser-create-test-function-upload-zip-test-manual-invoke"></a>

Rufen Sie Ihre Lambda-Funktion manuell mit dem `invoke` AWS Lambda CLI-Befehl und einem Kinesis-Beispielereignis auf.

**Lambda-Funktion testen**

1. Kopieren Sie das folgende JSON in eine Datei und speichern Sie sie unter `input.txt`. 

   ```
   {
       "Records": [
           {
               "kinesis": {
                   "kinesisSchemaVersion": "1.0",
                   "partitionKey": "1",
                   "sequenceNumber": "49590338271490256608559692538361571095921575989136588898",
                   "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
                   "approximateArrivalTimestamp": 1545084650.987
               },
               "eventSource": "aws:kinesis",
               "eventVersion": "1.0",
               "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898",
               "eventName": "aws:kinesis:record",
               "invokeIdentityArn": "arn:aws:iam::111122223333:role/lambda-kinesis-role",
               "awsRegion": "us-east-2",
               "eventSourceARN": "arn:aws:kinesis:us-east-2:111122223333:stream/lambda-stream"
           }
       ]
   }
   ```

1. Verwenden Sie den `invoke`-Befehl, um das Ereignis an die Funktion zu senden.

   ```
   aws lambda invoke --function-name ProcessKinesisRecords \
   --cli-binary-format raw-in-base64-out \
   --payload file://input.txt outputfile.txt
   ```

   Die **cli-binary-format** Option ist erforderlich, wenn Sie Version 2 verwenden AWS CLI . Um dies zur Standardeinstellung zu machen, führen Sie `aws configure set cli-binary-format raw-in-base64-out` aus. Weitere Informationen finden Sie unter [Von AWS CLI unterstützte globale Befehlszeilenoptionen](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) im *AWS Command Line Interface -Benutzerhandbuch für Version 2*.

   Die Antwort wird in gespeicher `out.txt`.

## Kinesis-Stream erstellen
<a name="with-kinesis-example-configure-event-source-create"></a>

Verwenden Sie den Befehl `create-stream `, um einen Stream zu erstellen.

```
aws kinesis create-stream --stream-name lambda-stream --shard-count 1
```

Führen Sie den folgenden `describe-stream`-Befehl aus, um den Stream-ARN zu erhalten.

```
aws kinesis describe-stream --stream-name lambda-stream
```

Die Ausgabe sollte folgendermaßen aussehen:

```
{
    "StreamDescription": {
        "Shards": [
            {
                "ShardId": "shardId-000000000000",
                "HashKeyRange": {
                    "StartingHashKey": "0",
                    "EndingHashKey": "340282366920746074317682119384634633455"
                },
                "SequenceNumberRange": {
                    "StartingSequenceNumber": "49591073947768692513481539594623130411957558361251844610"
                }
            }
        ],
        "StreamARN": "arn:aws:kinesis:us-east-1:111122223333:stream/lambda-stream",
        "StreamName": "lambda-stream",
        "StreamStatus": "ACTIVE",
        "RetentionPeriodHours": 24,
        "EnhancedMonitoring": [
            {
                "ShardLevelMetrics": []
            }
        ],
        "EncryptionType": "NONE",
        "KeyId": null,
        "StreamCreationTimestamp": 1544828156.0
    }
}
```

Sie benötigen im nächsten Schritt den Stream-ARN, um die Lambda-Funktion dem Stream zuzuordnen.

## Fügen Sie eine Ereignisquelle hinzu in AWS Lambda
<a name="with-kinesis-example-configure-event-source-add-event-source"></a>

Führen Sie den Befehl AWS CLI `add-event-source` aus.

```
aws lambda create-event-source-mapping --function-name ProcessKinesisRecords \
--event-source  arn:aws:kinesis:us-east-1:111122223333:stream/lambda-stream \
--batch-size 100 --starting-position LATEST
```

Notieren Sie die Zuweisungs-ID zur späteren Verwendung. Sie erhalten eine Liste der Zuweisungen von Ereignisquellen, indem Sie den `list-event-source-mappings`-Befehl ausführen.

```
aws lambda list-event-source-mappings --function-name ProcessKinesisRecords \
--event-source arn:aws:kinesis:us-east-1:111122223333:stream/lambda-stream
```

In der Antwort können Sie überprüfen, ob der Statuswert is `enabled`. Ereignisquellen-Zuweisungen können deaktiviert werden, um Abfragen vorübergehend zu pausieren, ohne dass Datensätze verloren gehen.

## Testen der Einrichtung
<a name="with-kinesis-example-configure-event-source-test-end-to-end"></a>

Zum Testen der Ereignisquellen-Zuweisung fügen Sie Ihrem Kinesis-Stream Ereignisdatensätze hinzu. Der Wert `--data` ist eine Zeichenfolge, die die CLI vor dem Senden an Kinesis mit base64 verschlüsselt. Der gleiche Befehl kann mehrmals ausgeführt werden, um dem Stream mehrere Datensätze hinzuzufügen.

```
aws kinesis put-record --stream-name lambda-stream --partition-key 1 \
--data "Hello, this is a test."
```

Lambda verwendet die Ausführungsrolle, um Datensätze aus dem Stream zu lesen. Anschließend wird Ihre Lambda-Funktion aufgerufen und Datensatzbatches werden übergeben. Die Funktion dekodiert Daten aus jedem Datensatz und protokolliert sie, wobei die Ausgabe an CloudWatch Logs gesendet wird. Zeigen Sie die Protokolle in der [CloudWatch -Konsole](https://console.aws.amazon.com/cloudwatch) an.

## Bereinigen Ihrer Ressourcen
<a name="cleanup"></a>

Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Durch das Löschen von AWS Ressourcen, die Sie nicht mehr verwenden, vermeiden Sie unnötige Kosten für Ihre AWS-Konto.

**So löschen Sie die Ausführungsrolle**

1. Öffnen Sie die Seite [Roles](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie die von Ihnen erstellte Ausführungsrolle aus.

1. Wählen Sie **Löschen** aus.

1. Geben Sie den Namen der Rolle in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie die Lambda-Funktion:**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion aus, die Sie erstellt haben.

1. Wählen Sie **Aktionen**, **Löschen** aus.

1. Geben Sie **confirm** in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie den Kinesis-Stream**

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die Kinesis-Konsole unter [https://console.aws.amazon.com/kinesis](https://console.aws.amazon.com/kinesis).

1. Wählen Sie den von Ihnen erstellten Stream aus

1. Wählen Sie **Aktionen**, **Löschen** aus.

1. Geben Sie **delete** in das Texteingabefeld ein.

1. Wählen Sie **Löschen** aus.

# Verwendung von Lambda mit Kubernetes
<a name="with-kubernetes"></a>

Sie können Lambda-Funktionen mit der Kubernetes-API mithilfe von [AWS-Controllern für Kubernetes (ACK)](https://aws-controllers-k8s.github.io/community/docs/community/overview/) oder [Crossplane](https://docs.crossplane.io/latest/packages/providers/) bereitstellen und verwalten.

## AWS-Controller für Kubernetes (ACK)
<a name="kubernetes-ack"></a>

Sie können ACK zum Bereitstellen und Verwalten von AWS-Ressourcen über die Kubernetes-API verwenden. Über ACK stellt AWS benutzerdefinierte Open-Source-Controller für AWS-Services wie Lambda, Amazon Elastic Container Registry (Amazon ECR), Amazon Simple Storage Service (Amazon S3) und Amazon SageMaker AI bereit. Jeder unterstützte AWS-Service verfügt über einen eigenen benutzerdefinierten Controller. Installieren Sie in Ihrem Kubernetes-Cluster einen Controller für jeden AWS-Service, den Sie verwenden möchten. Erstellen Sie anschließend eine [benutzerdefinierte Ressourcendefinition (Custom Resource Definition, CRD)](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/), um die AWS-Ressourcen zu definieren.

Wir empfehlen die Verwendung von [Helm 3.8 oder höher](https://helm.sh/docs/intro/install/), um ACK-Controller zu installieren. Jeder ACK-Controller verfügt über ein eigenes Helm-Chart, das den Controller, CRDs und Kubernetes RBAC-Regeln installiert. Weitere Informationen finden Sie unter [Installieren eines ACK-Controllers](https://aws-controllers-k8s.github.io/community/docs/user-docs/install/) in der ACK-Dokumentation.

Nachdem Sie die benutzerdefinierte ACK-Ressource erstellt haben, können Sie sie wie jedes andere integrierte Kubernetes-Objekt verwenden. Beispielsweise können Sie Lambda-Funktionen mit Ihren bevorzugten Kubernetes-Toolchains, einschließlich [kubectl](https://kubernetes.io/docs/reference/kubectl/), bereitstellen und verwalten.

Hier sind einige Beispielanwendungsfälle für die Bereitstellung von Lambda-Funktionen über ACK:
+ Ihr Unternehmen verwendet [rollenbasierte Zugriffssteuerung (RBAC)](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) und [IAM-Rollen für Service-Konten](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html), um Berechtigungsgrenzen zu erstellen. Mit ACK können Sie dieses Sicherheitsmodell für Lambda wiederverwenden, ohne neue Benutzer und Richtlinien erstellen zu müssen.
+ Ihr Unternehmen verfügt über einen DevOps-Prozess, um Ressourcen mithilfe von Kubernetes-Manifesten in einem Amazon Elastic Kubernetes Service (Amazon EKS)-Cluster bereitzustellen. Mit ACK können Sie ein Manifest verwenden, um Lambda-Funktionen bereitzustellen, ohne eine separate Infrastruktur in Form von Code-Vorlagen zu erstellen.

Weitere Informationen zur Verwendung von ACK finden Sie im [Lambda-Tutorial in der ACK-Dokumentation](https://aws-controllers-k8s.github.io/community/docs/tutorials/lambda-oci-example/).

## Crossplane
<a name="kubernetes-crossplane"></a>

[Crossplane](https://docs.crossplane.io/latest/packages/providers/) ist ein Open-Source-Projekt der Cloud Native Computing Foundation (CNCF), das Kubernetes zur Verwaltung von Cloud-Infrastrukturressourcen verwendet. Mit Crossplane können Entwickler Infrastruktur anfordern, ohne deren Komplexität verstehen zu müssen. Plattformteams behalten die Kontrolle über die Bereitstellung und Verwaltung der Infrastruktur.

Mit Crossplane können Sie Lambda-Funktionen mit Ihren bevorzugten Kubernetes-Toolchains wie [kubectl](https://kubernetes.io/docs/reference/kubectl/) und jeder CI/CD-Pipeline bereitstellen und verwalten, die Manifeste für Kubernetes bereitstellen kann. Hier sind einige Beispielanwendungsfälle für die Bereitstellung von Lambda-Funktionen über Crossplane:
+ Ihr Unternehmen möchte Compliance durchsetzen, indem es sicherstellt, dass Lambda-Funktionen über die richtigen [Tags](configuration-tags.md) verfügen. Plattformteams können [Crossplane Compositions](https://docs.crossplane.io/latest/get-started/get-started-with-composition/) verwenden, um diese Richtlinie durch API-Abstraktionen zu definieren. Entwickler können diese Abstraktionen dann verwenden, um Lambda-Funktionen mit Tags bereitzustellen.
+ Ihr Projekt verwendet GitOps mit Kubernetes. In diesem Modell gleicht Kubernetes kontinuierlich das Git-Repository (gewünschter Status) mit den im Cluster ausgeführten Ressourcen (aktueller Status) ab. Bei Unterschieden nimmt der GitOps-Prozess automatisch Änderungen am Cluster vor. Sie können GitOps mit Kubernetes zum Bereitstellen und Verwalten von Lambda-Funktionen über Crossplane verwenden und dabei bekannte Kubernetes-Tools und -Konzepte wie [CRDs](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) und [Controller](https://kubernetes.io/docs/concepts/architecture/controller/) verwenden.

Weitere Informationen zur Verwendung von Crossplane mit Lambda finden Sie hier:
+ [AWS-Blueprints für Crossplane](https://github.com/awslabs/crossplane-on-eks/blob/main/examples/upbound-aws-provider/README.md#deploy-the-examples): Dieses Repository enthält Beispiele für die Verwendung von Crossplane zum Bereitstellen von AWS-Ressourcen, einschließlich Lambda-Funktionen.
**Anmerkung**  
AWS-Blueprints für Crossplane befinden sich in der aktiven Entwicklung und sollten nicht in der Produktion verwendet werden.
+ [Bereitstellung von Lambda mit Amazon EKS und Crossplane](https://www.youtube.com/watch?v=m-9KLq29K4k): Dieses Video demonstriert ein fortgeschrittenes Beispiel für das Bereitstellen einer Serverless AWS-Architektur mit Crossplane, wobei das Design sowohl aus der Entwickler- als auch aus der Plattformperspektive untersucht wird.

# Verwenden von Lambda mit Amazon MQ
<a name="with-mq"></a>

**Anmerkung**  
Wenn Sie Daten an ein anderes Ziel als eine Lambda-Funktion senden oder die Daten vor dem Senden anreichern möchten, finden Sie weitere Informationen unter [Amazon EventBridge Pipes](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html).

Amazon MQ ist ein verwalteter Message-Broker-Service für [Apache ActiveMQ](https://activemq.apache.org/) und [RabbitMQ](https://www.rabbitmq.com). Mit einem *Message Broker* können Software-Anwendungen und -Komponenten mithilfe verschiedener Programmiersprachen, Betriebssysteme und formeller Messaging-Protokolle entweder über Themen- oder Queue-Ereigniszielen miteinander kommunizieren.

Amazon MQ kann auch Amazon-Elastic-Compute-Cloud-(Amazon-EC2)-Instances in Ihrem Namen verwalten, indem es ActiveMQ- oder RabbitMQ-Broker installiert und verschiedene Netzwerktopologien und andere Infrastrukturanforderungen bereitstellt.

Verwenden Sie eine Lambda-Funktion, um Datensätze von Ihrem Amazon-MQ-Message-Broker zu verarbeiten. Lambda ruft Ihre Funktion über ein [Ereignisquellen-Zuweisung](invocation-eventsourcemapping.md) auf, eine Lambda-Ressource, die Nachrichten von Ihrem Broker liest und die Funktion [synchron](invocation-sync.md) aufruft.

**Warnung**  
Zuordnungen von Lambda-Ereignisquellen verarbeiten jedes Ereignis mindestens einmal und es kann zu einer doppelten Verarbeitung von Datensätzen kommen. Um mögliche Probleme im Zusammenhang mit doppelten Ereignissen zu vermeiden, empfehlen wir Ihnen dringend, Ihren Funktionscode idempotent zu machen. Weitere Informationen finden Sie im Knowledge Center unter [Wie mache ich meine Lambda-Funktion idempotent](https://repost.aws/knowledge-center/lambda-function-idempotent)? AWS 

Das Amazon-MQ-Ereignisquellen-Zuweisung hat die folgenden Konfigurationseinschränkungen:
+ Parallelität – Lambda-Funktionen, die eine Amazon MQ-Zuordnung von Ereignisquellen verwenden, haben eine Standardeinstellung für maximale [Parallelität](lambda-concurrency.md). Für ActiveMQ begrenzt der Lambda-Service die Anzahl der gleichzeitigen Ausführungsumgebungen auf fünf pro Amazon MQ-Zuordnung von Ereignisquellen. Für RabbitMQ ist die Anzahl der gleichzeitigen Ausführungsumgebungen auf 1 pro Amazon MQ-Zuordnung von Ereignisquellen begrenzt. Selbst wenn Sie die reservierten oder bereitgestellten Parallelitätseinstellungen Ihrer Funktion ändern, stellt der Lambda-Service keine weiteren Ausführungsumgebungen zur Verfügung. Um eine Erhöhung der standardmäßigen maximalen Parallelität für eine einzelne Amazon MQ MQ-Ereignisquellenzuordnung zu beantragen, wenden Sie sich an Support die UUID der Ereignisquellenzuweisung sowie an die Region. Da Erhöhungen auf der Ebene der spezifischen Zuordnung von Ereignisquellen und nicht auf der Ebene des Kontos oder der Region vorgenommen werden, müssen Sie für jede Zuordnung von Ereignisquellen manuell eine Skalierungserhöhung anfordern.
+ Kontoübergreifend – Lambda unterstützt keine kontoübergreifende Verarbeitung. Sie können Lambda nicht zur Verarbeitung von Datensätzen von einem Amazon-MQ-Message Broker verwenden, der sich in einem anderen  AWS-Konto befindet.
+ Authentifizierung — Für ActiveMQ wird nur [SimpleAuthenticationPlugin](https://activemq.apache.org/security#simple-authentication-plugin)ActiveMQ unterstützt. Für RabbitMQ wird nur der [PLAIN](https://www.rabbitmq.com/access-control.html#mechanisms)-Authentifizierungsmechanismus unterstützt. Benutzer müssen es verwenden, AWS Secrets Manager um ihre Anmeldeinformationen zu verwalten. Weitere Informationen zur ActiveMQ-Authentifizierung finden Sie unter [Integrieren von ActiveMQ-Brokern mit LDAP](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/security-authentication-authorization.html) im *Amazon-MQ-Entwicklerhandbuch*.
+ Verbindungskontingent – Broker haben eine maximale Anzahl zulässiger Verbindungen pro Wire-Level-Protokoll. Dieses Kontingent basiert auf dem Instance-Typ des Brokers. Weitere Informationen finden Sie im Abschnitt [Broker](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-limits.html#broker-limits) in **Kontingente in Amazon MQ** im *Amazon-MQ-Entwicklerhandbuch*.
+ Konnektivität – Sie können Broker in einer öffentlichen oder privaten Virtual Private Cloud (VPC) erstellen. Für private Zwecke VPCs benötigt Ihre Lambda-Funktion Zugriff auf die VPC, um Nachrichten zu empfangen. Weitere Informationen finden Sie unter [Konfigurieren Sie die Netzwerksicherheit](process-mq-messages-with-lambda.md#process-mq-messages-with-lambda-networkconfiguration), weiter unten in diesem Abschnitt.
+ Ereignisziele – Es werden nur Warteschlangenziele unterstützt. Sie können jedoch ein virtuelles Thema verwenden, das sich intern wie ein Thema verhält, während es mit Lambda als eine Warteschlange interagiert. Weitere Informationen finden Sie unter [virtuelle Ziele](https://activemq.apache.org/virtual-destinations) auf der Apache-ActiveMQ-Website und [virtuelle Hosts](https://www.rabbitmq.com/vhosts.html) auf der RabbitMQ-Website.
+ Netzwerktopologie – Für ActiveMQ wird nur ein Einzelinstance- oder Standby-Broker pro Ereignisquellen-Zuweisung unterstützt. Für RabbitMQ wird nur eine Einzelinstance-Broker- oder Cluster-Bereitstellung pro Ereignisquellen-Zuweisung unterstützt. Single-Instance-Broker benötigen einen Failover-Endpunkt. Weitere Informationen zu diesen Broker-Bereitstellungsmodi finden Sie unter [Aktive MQ-Broker-Architektur](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-broker-architecture.html) und [Broker-Architektur von Rabbit MQ](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/rabbitmq-broker-architecture.html) im *Entwicklerhandbuch für Amazon MQ*.
+ Protokolle – Die unterstützten Protokolle hängen vom Typ der Amazon-MQ-Integration ab.
  + Für ActiveMQ-Integrationen verwendet Lambda Nachrichten mithilfe des OpenWire/Java Message Service (JMS) -Protokolls. Es werden keine anderen Protokolle unterstützt, um Nachrichten zu verbrauchen. Innerhalb des JMS-Protokolls werden nur [https://activemq.apache.org/components/cms/api_docs/activemqcpp-3.6.0/html/classactivemq_1_1commands_1_1_active_m_q_text_message.html](https://activemq.apache.org/components/cms/api_docs/activemqcpp-3.6.0/html/classactivemq_1_1commands_1_1_active_m_q_text_message.html) und [https://activemq.apache.org/components/cms/api_docs/activemqcpp-3.9.0/html/classactivemq_1_1commands_1_1_active_m_q_bytes_message.html](https://activemq.apache.org/components/cms/api_docs/activemqcpp-3.9.0/html/classactivemq_1_1commands_1_1_active_m_q_bytes_message.html) unterstützt. Lambda unterstützt auch benutzerdefinierte JMS-Eigenschaften. Weitere Informationen zum OpenWire Protokoll finden Sie [OpenWire](https://activemq.apache.org/openwire.html)auf der Apache ActiveMQ-Website.
  + Bei RabbitMQ-Integrationen verbraucht Lambda Nachrichten mit dem AMQP-0-9-1-Protokoll. Es werden keine anderen Protokolle unterstützt, um Nachrichten zu verbrauchen. Weitere Informationen zur Implementierung des AMQP 0-9-1-Protokolls durch RabbitMQ finden Sie im [Kompletten AMQ-0-9-1-Referenzhandbuch](https://www.rabbitmq.com/amqp-0-9-1-reference.html) auf der RabbitMQ-Website.

Lambda unterstützt automatisch die neuesten Versionen von ActiveMQ und RabbitMQ, die Amazon MQ unterstützt. Die neuesten unterstützten Versionen finden Sie in den [ Amazon-MQ-Versionshinweisen](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-release-notes.html) im *Amazon-MQ-Entwicklerhandbuch*.

**Anmerkung**  
Amazon MQ hat standardmäßig ein wöchentliches Wartungsfenster für Broker. Während dieses Zeitfensters sind Broker nicht verfügbar. Für Broker ohne Standby kann Lambda während dieses Fensters keine Nachrichten verarbeiten.

**Topics**
+ [

## Verstehen der Lambda-Verbrauchergruppe für Amazon MQ
](#services-mq-configure)
+ [

# Konfiguration der Amazon MQ-Ereignisquelle für Lambda
](process-mq-messages-with-lambda.md)
+ [

# Parameter für die Zuordnung von Ereignisquellen
](services-mq-params.md)
+ [

# Ereignisse aus einer Amazon MQ-Ereignisquelle filtern
](with-mq-filtering.md)
+ [

# Beheben Sie Fehler Amazon MQ-Zuordnung von Ereignisquellen
](services-mq-errors.md)

## Verstehen der Lambda-Verbrauchergruppe für Amazon MQ
<a name="services-mq-configure"></a>

Um mit Amazon MQ zu interagieren, erstellt Lambda eine Verbrauchergruppe, die aus Ihren Amazon-MQ-Brokern lesen kann. Die Verbrauchergruppe wird mit derselben ID wie die Ereignisquellen-Zuweisung-UUID erstellt.

Für Amazon-MQ-Ereignisquellen batcht Lambda Datensätze und sendet sie in einer einzigen Nutzlast an Ihre Funktion. Um das Verhalten zu steuern, können Sie das Batch-Fenster und die Batch-Größe konfigurieren. Lambda pullt Nachrichten, bis es die Nutzlastgröße von maximal 6 MB verarbeitet, das Batch-Fenster abläuft oder die Anzahl der Datensätze die volle Batch-Größe erreicht. Weitere Informationen finden Sie unter [Batching-Verhalten](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

Die Konsumentengruppe ruft die Nachrichten als ein BLOB von Bytes ab, base64-codiert sie dann in eine einzelne JSON-Nutzlast und ruft dann Ihre Funktion auf. Wenn Ihre Funktion einen Fehler für eine der Nachrichten in einem Batch zurückgibt, wiederholt Lambda den gesamten Nachrichtenbatch, bis die Verarbeitung erfolgreich ist oder die Nachrichten ablaufen.

**Anmerkung**  
Während Lambda-Funktionen in der Regel ein maximales Timeout-Limit von 15 Minuten haben, unterstützen Ereignisquellenzuordnungen für Amazon MSK, selbstverwaltetes Apache Kafka, Amazon DocumentDB, Amazon MQ für ActiveMQ und RabbitMQ nur Funktionen mit einem maximalen Timeout-Limit von 14 Minuten. Diese Einschränkung stellt sicher, dass die Ereignisquellenzuordnung Funktionsfehler und Wiederholungsversuche ordnungsgemäß verarbeiten kann.

Sie können die Parallelitätsnutzung einer bestimmten Funktion mithilfe der `ConcurrentExecutions` Metrik in Amazon CloudWatch überwachen. Weitere Hinweise zur Gleichzeitigkeitsskalierung finden Sie unter [Konfigurieren reservierter Gleichzeitigkeit für eine Funktion](configuration-concurrency.md).

**Example Amazon-MQ-Datensatzereignisse**  

```
{
   "eventSource": "aws:mq",
   "eventSourceArn": "arn:aws:mq:us-east-2:111122223333:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8",
   "messages": [
      { 
        "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1---mq---us-east-2.amazonaws.com.rproxy.goskope.com-37557-1234520418293-4:1:1:1:1", 
        "messageType": "jms/text-message",
        "deliveryMode": 1,
        "replyTo": null,
        "type": null,
        "expiration": "60000",
        "priority": 1,
        "correlationId": "myJMSCoID",
        "redelivered": false,
        "destination": { 
          "physicalName": "testQueue" 
        },
        "data":"QUJDOkFBQUE=",
        "timestamp": 1598827811958,
        "brokerInTime": 1598827811958, 
        "brokerOutTime": 1598827811959, 
        "properties": {
          "index": "1",
          "doAlarm": "false",
          "myCustomProperty": "value"
        }
      },
      { 
        "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1---mq---us-east-2.amazonaws.com.rproxy.goskope.com-37557-1234520418293-4:1:1:1:1",
        "messageType": "jms/bytes-message",
        "deliveryMode": 1,
        "replyTo": null,
        "type": null,
        "expiration": "60000",
        "priority": 2,
        "correlationId": "myJMSCoID1",
        "redelivered": false,
        "destination": { 
          "physicalName": "testQueue" 
        },
        "data":"LQaGQ82S48k=",
        "timestamp": 1598827811958,
        "brokerInTime": 1598827811958, 
        "brokerOutTime": 1598827811959, 
        "properties": {
          "index": "1",
          "doAlarm": "false",
          "myCustomProperty": "value"
        }
      }
   ]
}
```

```
{
  "eventSource": "aws:rmq",
  "eventSourceArn": "arn:aws:mq:us-east-2:111122223333:broker:pizzaBroker:b-9bcfa592-423a-4942-879d-eb284b418fc8",
  "rmqMessagesByQueue": {
    "pizzaQueue::/": [
      {
        "basicProperties": {
          "contentType": "text/plain",
          "contentEncoding": null,
          "headers": {
            "header1": {
              "bytes": [
                118,
                97,
                108,
                117,
                101,
                49
              ]
            },
            "header2": {
              "bytes": [
                118,
                97,
                108,
                117,
                101,
                50
              ]
            },
            "numberInHeader": 10
          },
          "deliveryMode": 1,
          "priority": 34,
          "correlationId": null,
          "replyTo": null,
          "expiration": "60000",
          "messageId": null,
          "timestamp": "Jan 1, 1970, 12:33:41 AM",
          "type": null,
          "userId": "AIDACKCEVSQ6C2EXAMPLE",
          "appId": null,
          "clusterId": null,
          "bodySize": 80
        },
        "redelivered": false,
        "data": "eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ=="
      }
    ]
  }
}
```
Im RabbitMQ-Beispiel ist `pizzaQueue` der Name der RabbitMQ-Warteschlange und `/` der Name des virtuellen Hosts. Beim Empfang von Nachrichten listet die Ereignisquelle Nachrichten unter `pizzaQueue::/` auf.

# Konfiguration der Amazon MQ-Ereignisquelle für Lambda
<a name="process-mq-messages-with-lambda"></a>

**Topics**
+ [

## Konfigurieren Sie die Netzwerksicherheit
](#process-mq-messages-with-lambda-networkconfiguration)
+ [

## Die Zuordnung von Ereignisquellen erstellen
](#services-mq-eventsourcemapping)

## Konfigurieren Sie die Netzwerksicherheit
<a name="process-mq-messages-with-lambda-networkconfiguration"></a>

Um Lambda über die Zuordnung von Ereignisquellen Vollzugriff auf Amazon MQ zu gewähren, muss Ihr Broker entweder einen öffentlichen Endpunkt (öffentliche IP-Adresse) verwenden oder Sie müssen Zugriff auf die Amazon-VPC gewähren, in der Sie den Broker erstellt haben.

Wenn Sie Amazon MQ mit Lambda verwenden, erstellen Sie [AWS PrivateLink VPC-Endpunkte](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html), die Ihrer Funktion Zugriff auf die Ressourcen in Ihrer Amazon VPC bieten.

**Anmerkung**  
AWS PrivateLink VPC-Endpunkte sind für Funktionen mit Ereignisquellenzuordnungen erforderlich, die den Standardmodus (auf Abruf) für Ereignisabfragen verwenden. Wenn Ihre Ereignisquellenzuordnung den [Bereitstellungsmodus](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode) verwendet, müssen Sie keine AWS PrivateLink VPC-Endpunkte konfigurieren.

Erstellen Sie einen Endpunkt, der den Zugriff auf die folgenden Ressourcen ermöglicht:
+  Lambda – Erstellen Sie einen Endpunkt für den Lambda-Serviceprinzipal. 
+  AWS STS — Erstellen Sie einen Endpunkt für den, damit ein Service Principal eine Rolle AWS STS in Ihrem Namen übernehmen kann. 
+  Secrets Manager – Wenn Ihr Broker Secrets Manager zum Speichern von Anmeldeinformationen verwendet, erstellen Sie einen Endpunkt für Secrets Manager. 

Alternativ konfigurieren Sie ein NAT-Gateway auf jedem öffentlichen Subnetz in der Amazon VPC. Weitere Informationen finden Sie unter [Aktivieren Sie den Internetzugang für VPC-verbundene Lambda-Funktionen](configuration-vpc-internet.md).

Wenn Sie eine Ereignisquellenzuordnung für Amazon MQ erstellen, prüft Lambda, ob Elastic Network Interfaces (ENIs) bereits für die für Ihre Amazon VPC konfigurierten Subnetze und Sicherheitsgruppen vorhanden sind. Wenn Lambda feststellt, dass sie vorhanden ENIs sind, versucht es, sie wiederzuverwenden. Andernfalls erstellt Lambda neue, ENIs um eine Verbindung zur Ereignisquelle herzustellen und Ihre Funktion aufzurufen.

**Anmerkung**  
Lambda-Funktionen werden immer intern ausgeführt, die dem Lambda-Dienst VPCs gehören. Die VPC-Konfiguration Ihrer Funktion hat keinen Einfluss auf die Zuordnung von Ereignisquellen. Nur die Netzwerkkonfiguration der Ereignisquelle bestimmt, wie Lambda sich mit Ihrer Ereignisquelle verbindet.

Konfigurieren Sie die Sicherheitsgruppen für die Amazon VPC, die Ihren Broker enthält. Standardmäßig verwendet Amazon MQ die folgenden Ports: `61617` (Amazon MQ für ActiveMQ) und `5671` (Amazon MQ für RabbitMQ).
+ Eingehende Regeln – Erlauben Sie den gesamten Datenverkehr auf dem Standard-Broker-Port für die Sicherheitsgruppe, die mit Ihrer Ereignisquelle verbunden ist. Alternativ können Sie eine selbstreferenzierende Regel für Sicherheitsgruppen verwenden, um den Zugriff von Instances innerhalb derselben Sicherheitsgruppe zuzulassen.
+ Regeln für ausgehenden Datenverkehr — Lassen Sie den gesamten Datenverkehr über den Port `443` für externe Ziele zu, wenn Ihre Funktion mit Diensten kommunizieren muss. AWS Alternativ können Sie auch eine selbstreferenzierende Sicherheitsgruppenregel verwenden, um den Zugriff auf den Broker einzuschränken, wenn Sie nicht mit anderen Diensten kommunizieren müssen. AWS 
+ Amazon VPC-Endpunkt-Eingangsregeln – Wenn Sie einen Amazon VPC-Endpunkt verwenden, muss die Sicherheitsgruppe, die mit Ihrem Amazon VPC-Endpunkt verbunden ist, eingehenden Verkehr auf Port `443` von der Broker-Sicherheitsgruppe zulassen.

Wenn Ihr Broker Authentifizierung verwendet, können Sie auch die Endpunktrichtlinie für den Secrets Manager-Endpunkt einschränken. Für den Aufruf der Secrets Manager-API verwendet Lambda Ihre Funktionsrolle und nicht den Lambda-Serviceprinzipal.

**Example VPC-Endpunktrichtlinie – Secrets Manager-Endpunkt**  

```
{
      "Statement": [
          {
              "Action": "secretsmanager:GetSecretValue",
              "Effect": "Allow",
              "Principal": {
                  "AWS": [
                      "arn:aws::iam::123456789012:role/my-role"
                  ]
              },
              "Resource": "arn:aws::secretsmanager:us-west-2:123456789012:secret:my-secret"
          }
      ]
  }
```

Wenn Sie Amazon VPC-Endpunkte verwenden, AWS leitet Ihre API-Aufrufe zum Aufrufen Ihrer Funktion über das Elastic Network Interface (ENI) des Endpunkts weiter. Der Lambda-Serviceprinzipal muss alle Rollen und Funktionen aufrufen`lambda:InvokeFunction`, die diese ENIs verwenden.

Standardmäßig verfügen Amazon VPC-Endpunkte über offene IAM-Richtlinien, die einen umfassenden Zugriff auf Ressourcen ermöglichen. Es empfiehlt sich, diese Richtlinien auf die Durchführung der erforderlichen Aktionen über diesen Endpunkt zu beschränken. Um sicherzustellen, dass Ihre Zuordnung von Ereignisquellen Ihre Lambda-Funktion aufrufen kann, muss die VPC-Endpunktrichtlinie dem Lambda-Serviceprinzipal erlauben, `sts:AssumeRole` und `lambda:InvokeFunction` aufzurufen. Wenn Sie Ihre VPC-Endpunktrichtlinien so einschränken, dass nur API-Aufrufe zugelassen werden, die aus Ihrem Unternehmen stammen, kann die Zuordnung von Ereignisquellen nicht richtig funktionieren, weshalb in diesen Richtlinien `"Resource": "*"` erforderlich ist.

Die folgenden Beispiel-VPC-Endpunktrichtlinien zeigen, wie der erforderliche Zugriff auf den Lambda-Serviceprinzipal für die AWS STS - und Lambda-Endpunkte gewährt wird.

**Example VPC-Endpunktrichtlinie — AWS STS Endpunkt**  

```
{
      "Statement": [
          {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
    }
```

**Example VPC-Endpunktrichtlinie – Lambda-Endpunkt**  

```
{
      "Statement": [
          {
              "Action": "lambda:InvokeFunction",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
  }
```

## Die Zuordnung von Ereignisquellen erstellen
<a name="services-mq-eventsourcemapping"></a>

Erstellen Sie ein [Ereignisquellen-Zuweisung](invocation-eventsourcemapping.md), um Lambda anzuweisen, Datensätze aus einem Amazon-MQ-Broker an eine Lambda-Funktion zu senden. Sie können mehrere Ereignisquellen-Zuweisungen erstellen, um gleiche Daten mit mehreren Funktionen oder Elemente aus mehreren Streams mit nur einer Funktion zu verarbeiten.

Um Ihre Funktion für das Lesen von Amazon MQ zu konfigurieren, fügen Sie die erforderlichen Berechtigungen hinzu und erstellen einen **MQ**-Auslöser in der Lambda-Konsole.

Um Datensätze von einem Amazon-MQ-Broker zu lesen, benötigt Ihre Lambda-Funktion die folgenden Berechtigungen, die ihrer Ausführungsrolle hinzugefügt werden: Sie gewähren Lambda die Erlaubnis, mit Ihrem Amazon MQ-Broker und den zugrunde liegenden Ressourcen zu interagieren, indem Sie Ihrer Funktions[ausführungsrolle](lambda-intro-execution-role.md) Berechtigungsanweisungen hinzufügen:
+ [mq: DescribeBroker](https://docs.aws.amazon.com/amazon-mq/latest/api-reference/brokers-broker-id.html#brokers-broker-id-http-methods)
+ [Manager für Geheimnisse: GetSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html)
+ [ec2: CreateNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html)
+ [ec2: DeleteNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterface.html)
+ [ec2: DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)
+ [ec2: DescribeSecurityGroups](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)
+ [ec2: DescribeSubnets](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html)
+ [ec2: DescribeVpcs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html)
+ [Protokolle: CreateLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html)
+ [Protokolle: CreateLogStream](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogStream.html)
+ [Protokolle: PutLogEvents](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html)

**Anmerkung**  
Wenn Sie einen verschlüsselten, von Kunden verwalteten Schlüssel verwenden, fügen Sie auch die `[kms:Decrypt](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn-bootstrap-brokers.html#clusters-clusterarn-bootstrap-brokersget)`-Berechtigung hinzu.

**So fügen Sie Berechtigungen hinzu und erstellen einen Auslöser**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie den Namen einer Funktion aus.

1. Wählen Sie die Registerkarte **Konfiguration** und dann **Berechtigungen** aus.

1. Wählen Sie unter **Rollenname** den Link zu Ihrer Ausführungsrolle. Dieser Link öffnet die Rolle in der IAM-Konsole.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/execution-role.png)

1. Wählen Sie **Add permissions** (Berechtigungen hinzufügen) und dann **Create inline policy** (Inline-Richtlinie erstellen) aus.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/inline-policy.png)

1. Wählen Sie im Abschnitt **Richtlinien-Editor** **JSON** aus. Geben Sie die folgende Richtlinie ein: Ihre Funktion benötigt diese Berechtigungen, um von einem Amazon MQ-Broker zu lesen.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
         {
           "Effect": "Allow",
           "Action": [
             "mq:DescribeBroker",
             "secretsmanager:GetSecretValue",
             "ec2:CreateNetworkInterface",
             "ec2:DeleteNetworkInterface",
             "ec2:DescribeNetworkInterfaces", 
             "ec2:DescribeSecurityGroups",
             "ec2:DescribeSubnets",
             "ec2:DescribeVpcs",
             "logs:CreateLogGroup",
             "logs:CreateLogStream", 
             "logs:PutLogEvents"		
           ],
           "Resource": "*"
         }
       ]
     }
   ```

------
**Anmerkung**  
Wenn Sie einen verschlüsselten, vom Kunden verwalteten Schlüssel verwenden, müssen Sie auch die `kms:Decrypt`-Berechtigung hinzufügen.

1. Wählen Sie **Weiter** aus. Geben Sie einen Richtliniennamen ein und wählen Sie anschließend **Create policy** (Richtlinie erstellen) aus.

1. Gehen Sie zurück zu Ihrer Funktion in der Lambda-Konsole. Wählen Sie unter **Function overview (Funktionsübersicht)** die Option **Add trigger (Trigger hinzufügen)**.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/add-trigger.png)

1. Wählen Sie den **MQ**-Auslösertyp.

1. Konfigurieren Sie die erforderlichen Optionen und wählen Sie dann **Add** (Hinzufügen) aus.

Lambda unterstützt die folgenden Optionen für Amazon-MQ-Ereignisquellen.
+ **MQ-Broker** – Wählen Sie einen Amazon-MQ-Broker aus.
+ **Batchgröße** – Legen Sie die maximale Anzahl von Nachrichten fest, die in einem einzelnen Batch abgerufen werden sollen.
+ **Name der Warteschlange** – Geben Sie die zu konsumierende Amazon-MQ-Warteschlange ein.
+ **Konfiguration des Zugriffs** – Geben Sie die Informationen zum virtuellen Host und das Secrets Manager-Geheimnis ein, in dem Ihre Broker-Anmeldeinformationen gespeichert sind.
+ **Auslöser aktivieren** – Deaktivieren Sie den Auslöser, um die Verarbeitung von Datensätzen anzuhalten.

Um den Auslöser zu aktivieren oder zu deaktivieren (oder zu löschen), wählen Sie den **MQ**-Auslöser im Designer aus. Verwenden Sie zum Neukonfigurieren des Auslösers die API-Vorgänge für die Ereignisquellen-Zuweisung.

# Parameter für die Zuordnung von Ereignisquellen
<a name="services-mq-params"></a>

Alle Lambda-Ereignisquellentypen verwenden dieselben API-Operationen [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) und [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html). Allerdings gelten nur einige der Parameter für Amazon MQ und RabbitMQ.


| Parameter | Erforderlich | Standard | Hinweise | 
| --- | --- | --- | --- | 
|  BatchSize  |  N  |  100  |  Höchstwert: 10 000.  | 
|  Enabled  |  N  |  true  | Keine | 
|  FunctionName  |  Y  | N/A  | Keine | 
|  FilterCriteria  |  N  |  N/A   |  [Steuern Sie, welche Ereignisse Lambda an Ihre Funktion sendet](invocation-eventfiltering.md)  | 
|  MaximumBatchingWindowInSeconds  |  N  |  500 ms  |  [Batching-Verhalten](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching)  | 
|  Warteschlangen  |  N  | N/A |  Der Name der zu verwendenden Zielwarteschlange des Amazon-MQ-Brokers.  | 
|  SourceAccessConfigurations  |  N  | N/A  |  Für ActiveMQ BASIC\$1AUTH-Anmeldeinformationen. Für RabbitMQ können sowohl BASIC\$1AUTH Anmeldeinformationen als auch VIRTUAL\$1HOST Informationen enthalten sein.  | 

# Ereignisse aus einer Amazon MQ-Ereignisquelle filtern
<a name="with-mq-filtering"></a>

Sie können die Ereignisfilterung verwenden, um zu steuern, welche Datensätze aus einem Stream oder einer Warteschlange Lambda an Ihre Funktion sendet. Allgemeine Informationen über die Funktionsweise der Ereignisfilterung finden Sie unter [Steuern Sie, welche Ereignisse Lambda an Ihre Funktion sendet](invocation-eventfiltering.md).

Dieser Abschnitt konzentriert sich auf die Ereignisfilterung für Amazon MQ-Ereignisquellen.

**Anmerkung**  
Amazon-MQ-Zuordnungen von Ereignisquellen unterstützen nur das Filtern nach dem `data`-Schlüssel.

**Topics**
+ [

## Grundlagen der Amazon MQ-Ereignisfilterung
](#filtering-AMQ)

## Grundlagen der Amazon MQ-Ereignisfilterung
<a name="filtering-AMQ"></a>

Angenommen, Ihre Amazon-MQ-Nachrichtenwarteschlange enthält Nachrichten entweder im gültigen JSON-Format oder als einfache Zeichenfolgen. Ein Beispieldatensatz würde wie folgt aussehen, wobei die Daten im `data`-Feld in eine Base64-kodierte Zeichenfolge umgewandelt wurden.

------
#### [ ActiveMQ ]

```
{ 
    "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1---mq---us-east-2.amazonaws.com.rproxy.goskope.com-37557-1234520418293-4:1:1:1:1", 
    "messageType": "jms/text-message",
    "deliveryMode": 1,
    "replyTo": null,
    "type": null,
    "expiration": "60000",
    "priority": 1,
    "correlationId": "myJMSCoID",
    "redelivered": false,
    "destination": { 
      "physicalName": "testQueue" 
    },
    "data":"QUJDOkFBQUE=",
    "timestamp": 1598827811958,
    "brokerInTime": 1598827811958, 
    "brokerOutTime": 1598827811959, 
    "properties": {
      "index": "1",
      "doAlarm": "false",
      "myCustomProperty": "value"
    }
}
```

------
#### [ RabbitMQ ]

```
{
    "basicProperties": {
        "contentType": "text/plain",
        "contentEncoding": null,
        "headers": {
            "header1": {
                "bytes": [
                  118,
                  97,
                  108,
                  117,
                  101,
                  49
                ]
            },
            "header2": {
                "bytes": [
                  118,
                  97,
                  108,
                  117,
                  101,
                  50
                ]
            },
            "numberInHeader": 10
        },
        "deliveryMode": 1,
        "priority": 34,
        "correlationId": null,
        "replyTo": null,
        "expiration": "60000",
        "messageId": null,
        "timestamp": "Jan 1, 1970, 12:33:41 AM",
        "type": null,
        "userId": "AIDACKCEVSQ6C2EXAMPLE",
        "appId": null,
        "clusterId": null,
        "bodySize": 80
        },
    "redelivered": false,
    "data": "eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ=="
}
```

------

Sowohl für Active MQ- als auch für Rabbit MQ-Broker können Sie die Ereignisfilterung verwenden, um Datensätze anhand des `data`-Schlüssels zu filtern. Angenommen, Ihre Amazon-MQ-Warteschlange enthält Nachrichten im folgenden JSON-Format.

```
{
    "timeout": 0,
    "IPAddress": "203.0.113.254"
}
```

Um nur die Datensätze zu filtern, bei denen das `timeout`-Feld größer als 0 ist, würde das `FilterCriteria`-Objekt wie folgt aussehen.

```
{
    "Filters": [
        {
            "Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0] } } ] } }"
        }
    ]
}
```

Zur Verdeutlichung sehen Sie hier den Wert des Filter-`Pattern` in reinem JSON.

```
{
    "data": {
        "timeout": [ { "numeric": [ ">", 0 ] } ]
        }
}
```

Sie können Ihren Filter mithilfe der Konsole, AWS CLI oder einer AWS SAM-Vorlage hinzufügen.

------
#### [ Console ]

Um diesen Filter mithilfe der Konsole hinzuzufügen, folgen Sie den Anweisungen unter [Anhängen von Filterkriterien an eine Ereignisquellenzuordnung (Konsole)](invocation-eventfiltering.md#filtering-console) und geben Sie die folgende Zeichenfolge für die **Filterkriterien** ein.

```
{ "data" : { "timeout" : [ { "numeric": [ ">", 0 ] } ] } }
```

------
#### [ AWS CLI ]

Um eine neue Zuordnung von Ereignisquellen mit diesen Filterkriterien über die AWS Command Line Interface (AWS CLI) zu erstellen, führen Sie den folgenden Befehl aus.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:mq:us-east-2:123456789012:broker:my-broker:b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0 ] } ] } }"}]}'
```

Führen Sie den folgenden Befehl aus, um diese Filterkriterien zu einer vorhandenen Zuordnung von Ereignisquellen hinzuzufügen.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0 ] } ] } }"}]}'
```

Führen Sie den folgenden Befehl aus, um diese Filterkriterien zu einer vorhandenen Zuordnung von Ereignisquellen hinzuzufügen.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0 ] } ] } }"}]}'
```

------
#### [ AWS SAM ]

Um diesen Filter mit der AWS SAM hinzuzufügen, fügen Sie das folgende Snippet zur YAML-Vorlage für Ihre Ereignisquelle hinzu.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "data" : { "timeout" : [ { "numeric": [ ">", 0 ] } ] } }'
```

------

Mit Amazon MQ können Sie auch Datensätze filtern, bei denen die Nachricht eine einfache Zeichenfolge ist. Angenommen, Sie möchten nur Datensätze verarbeiten, bei denen die Meldung mit „Ergebnis:“ beginnt. Das `FilterCriteria`-Objekt würde wie folgt aussehen.

```
{
    "Filters": [
        {
            "Pattern": "{ \"data\" : [ { \"prefix\": \"Result: \" } ] }"
        }
    ]
}
```

Zur Verdeutlichung sehen Sie hier den Wert des Filter-`Pattern` in reinem JSON.

```
{
    "data": [
        {
        "prefix": "Result: "
        }
    ]
}
```

Sie können Ihren Filter mithilfe der Konsole, AWS CLI oder einer AWS SAM-Vorlage hinzufügen.

------
#### [ Console ]

Um diesen Filter mithilfe der Konsole hinzuzufügen, folgen Sie den Anweisungen unter [Anhängen von Filterkriterien an eine Ereignisquellenzuordnung (Konsole)](invocation-eventfiltering.md#filtering-console) und geben Sie die folgende Zeichenfolge für die **Filterkriterien** ein.

```
{ "data" : [ { "prefix": "Result: " } ] }
```

------
#### [ AWS CLI ]

Um eine neue Zuordnung von Ereignisquellen mit diesen Filterkriterien über die AWS Command Line Interface (AWS CLI) zu erstellen, führen Sie den folgenden Befehl aus.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:mq:us-east-2:123456789012:broker:my-broker:b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : [ { \"prefix\": \"Result: \" } ] }"}]}'
```

Führen Sie den folgenden Befehl aus, um diese Filterkriterien zu einer vorhandenen Zuordnung von Ereignisquellen hinzuzufügen.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : [ { \"prefix\": \"Result: \" } ] }"}]}'
```

------
#### [ AWS SAM ]

Um diesen Filter mit der AWS SAM hinzuzufügen, fügen Sie das folgende Snippet zur YAML-Vorlage für Ihre Ereignisquelle hinzu.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "data" : [ { "prefix": "Result " } ] }'
```

------

Amazon-MQ-Nachrichten müssen UTF-8-kodierte Zeichenfolgen sein (entweder einfache Zeichenfolgen oder im JSON-Format). Das liegt daran, dass Lambda Byte-Arrays von Amazon MQ vor Anwendung der Filterkriterien in UTF-8 dekodiert. Wenn Ihre Nachrichten eine andere Kodierung nutzen, z. B. UTF-16 oder ASCII, oder das Nachrichtenformat nicht dem `FilterCriteria`-Format entspricht, verarbeitet Lambda nur Metadatenfilter. In der folgenden Tabelle ist das Verhalten zusammengefasst:


| -Format der eingehenden Nachricht | Filtermusterformat für Nachrichteneigenschaften | Resultierende Aktion | 
| --- | --- | --- | 
|  Einfache Zeichenfolge  |  Einfache Zeichenfolge  |  Lambda filtert basierend auf Ihren Filterkriterien.  | 
|  Einfache Zeichenfolge  |  Kein Filtermuster für Dateneigenschaften  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Einfache Zeichenfolge  |  Gültiges JSON  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Gültiges JSON  |  Einfache Zeichenfolge  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Gültiges JSON  |  Kein Filtermuster für Dateneigenschaften  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Gültiges JSON  |  Gültiges JSON  |  Lambda filtert basierend auf Ihren Filterkriterien.  | 
|  Nicht UTF-8-kodierte Zeichenfolge  |  JSON, einfache Zeichenfolge oder kein Muster  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 

# Beheben Sie Fehler Amazon MQ-Zuordnung von Ereignisquellen
<a name="services-mq-errors"></a>

Wenn eine Lambda-Funktion auf einen nicht behebbaren Fehler stößt, stoppt Ihr Amazon-MQ-Konsument die Verarbeitung von Datensätzen. Alle anderen Konsumenten können die Verarbeitung fortsetzen, sofern sie nicht auf denselben Fehler stoßen. Um die potenzielle Ursache für einen gestoppten Konsumenten zu ermitteln, überprüfen Sie das `StateTransitionReason`-Feld in den Rücksendedetails Ihres `EventSourceMapping` auf einen der folgenden Codes:

**`ESM_CONFIG_NOT_VALID`**  
Die Konfiguration der Ereignisquellen-Zuweisung ist ungültig.

**`EVENT_SOURCE_AUTHN_ERROR`**  
Lambda konnte die Ereignisquelle nicht authentifizieren.

**`EVENT_SOURCE_AUTHZ_ERROR`**  
Lambda verfügt nicht über die erforderlichen Berechtigungen für den Zugriff auf die Ereignisquelle.

**`FUNCTION_CONFIG_NOT_VALID`**  
Die Konfiguration der Funktion ist ungültig.

Datensätze bleiben auch unbearbeitet, wenn Lambda sie aufgrund ihrer Größe fallen lässt. Die Größenbeschränkung für Lambda-Datensätze beträgt 6 MB. Um Nachrichten bei Funktionsfehlern erneut zuzustellen, können Sie eine Warteschlange für unzustellbare Nachrichten (DLQ) verwenden. Weitere Informationen finden Sie unter [Erneute Zustellung von Nachrichten und DLQ-Handhabung](https://activemq.apache.org/message-redelivery-and-dlq-handling) auf der Apache-ActiveMQ-Website und [Zuverlässigkeits-Leitfaden](https://www.rabbitmq.com/reliability.html) auf der RabbitMQ-Website.

**Anmerkung**  
Lambda unterstützt keine benutzerdefinierten Richtlinien für die erneute Bereitstellung. Stattdessen verwendet Lambda eine Richtlinie mit den Standardwerten von der Seite [Richtlinie für erneute Zustellung](https://activemq.apache.org/redelivery-policy) auf der Apache-ActiveMQ-Website, wobei `maximumRedeliveries` auf 6 gesetzt ist.

# Verwendung AWS Lambda mit Amazon RDS
<a name="services-rds"></a>

Sie können eine Lambda-Funktion direkt und über einen Amazon-RDS-Proxy mit einer Amazon Relational Database Service (Amazon RDS)-Datenbank verbinden. Direkte Verbindungen sind in einfachen Szenarien nützlich, und Proxys werden für die Produktion empfohlen. Ein Datenbank-Proxy verwaltet einen Pool gemeinsam genutzter Datenbankverbindungen, sodass Ihre Funktion eine hohe Gleichkeitigkeitsstufe erreichen kann, ohne dass die Datenbankverbindungen erschöpft werden.

Wir empfehlen die Verwendung von Amazon-RDS-Proxy für Lambda-Funktionen, die häufig kurze Datenbankverbindungen herstellen oder eine große Anzahl von Datenbankverbindungen öffnen und schließen. Weitere Informationen finden Sie unter [Automatisches Verbinden einer Lambda-Funktion und einer DB-Instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/lambda-rds-connect.html) im Amazon Relational Database Service Developer Guide.

**Tipp**  
Um eine Lambda-Funktion schnell mit einer Amazon-RDS-Datenbank zu verbinden, können Sie den Assistenten verwenden, der in die Konsole integriert ist. Gehen Sie wie folgt vor, um den Assistenten zu öffnen:  
Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.
Wählen Sie die Funktion aus, mit der Sie eine Datenbank verbinden möchten.
Wählen Sie auf der Registerkarte **Konfiguration** die Option **RDS-Datenbanken** aus.
Wählen Sie **Verbindung zur RDS-Datenbank herstellen** aus.
Nachdem Sie Ihre Funktion mit einer Datenbank verbunden haben, können Sie über die Option **Proxy hinzufügen** einen Proxy erstellen.

## Konfiguration Ihrer Funktion für die Verwendung mit RDS-Ressourcen
<a name="rds-configuration"></a>

In der Lambda-Konsole können Sie Amazon-RDS-Datenbankinstanzen und Proxy-Ressourcen bereitstellen und konfigurieren. Sie können dies tun, indem Sie auf der Registerkarte **Konfiguration** zu den **RDS-Datenbanken** navigieren. Alternativ können Sie auch Verbindungen zu Lambda-Funktionen in der Amazon-RDS-Konsole erstellen und konfigurieren. Wenn Sie eine RDS-Datenbank-Instance für die Verwendung mit Lambda konfigurieren, beachten Sie die folgenden Kriterien:
+ Um eine Verbindung zu einer Datenbank herzustellen, muss sich die Funktion in derselben Amazon VPC befinden, in der Ihre Datenbank ausgeführt wird.
+ Sie können Amazon-RDS-Datenbanken mit MySQL-, MariaDB-, PostgreSQL- oder Microsoft-SQL-Server-Engines verwenden.
+ Sie können Aurora-DB-Cluster auch mit MySQL- oder PostgreSQL-Engines verwenden.
+ Sie müssen ein Secrets-Manager-Geheimnis für die Authentifizierung der Datenbank angeben.
+ Eine IAM-Rolle muss die Berechtigung zur Verwendung des Geheimnisses sowie eine Vertrauensrichtlinie bereitstellen, mit der Amazon RDS die Rolle übernehmen kann.
+  Der IAM-Prinzipal, der die Konsole verwendet, um die Amazon-RDS-Ressource zu konfigurieren und sie mit Ihrer Funktion zu verbinden, muss über die folgenden Berechtigungen verfügen:

### Beispiel für eine Berechtigungsrichtlinie
<a name="rds-lambda-permissions"></a>

**Anmerkung**  
 Sie benötigen die Amazon-RDS-Proxy Berechtigungen nur, wenn Sie einen Amazon-RDS-Proxy konfigurieren, um einen Pool Ihrer Datenbankverbindungen zu verwalten. 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateSecurityGroup",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeSubnets",
        "ec2:DescribeVpcs",
        "ec2:AuthorizeSecurityGroupIngress",
        "ec2:AuthorizeSecurityGroupEgress",
        "ec2:RevokeSecurityGroupEgress",
        "ec2:CreateNetworkInterface",
        "ec2:DeleteNetworkInterface",
        "ec2:DescribeNetworkInterfaces"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "rds-db:connect",
        "rds:CreateDBProxy",
        "rds:CreateDBInstance",
        "rds:CreateDBSubnetGroup",
        "rds:DescribeDBClusters",
        "rds:DescribeDBInstances",
        "rds:DescribeDBSubnetGroups",
        "rds:DescribeDBProxies",
        "rds:DescribeDBProxyTargets",
        "rds:DescribeDBProxyTargetGroups",
        "rds:RegisterDBProxyTargets",
        "rds:ModifyDBInstance",
        "rds:ModifyDBProxy"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "lambda:ListFunctions",
        "lambda:UpdateFunctionConfiguration"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iam:AttachRolePolicy",
        "iam:CreateRole",
        "iam:CreatePolicy"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetResourcePolicy",
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret",
        "secretsmanager:ListSecretVersionIds",
        "secretsmanager:CreateSecret"
      ],
      "Resource": "*"
    }
  ]
}
```

------

Amazon RDS berechnet einen Stundensatz für Proxys, der auf der Größe der Datenbank-Instance basiert. Weitere Informationen finden Sie unter [RDS-Proxy-Preise](https://aws.amazon.com/rds/proxy/pricing/). Weitere Informationen zu Proxy-Verbindungen finden Sie unter [Verwendung von Amazon-RDS-Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.html) im Amazon-RDS-Benutzerhandbuch.

### SSL/TLS-Anforderungen für Amazon-RDS-Verbindungen
<a name="rds-lambda-certificates"></a>

Um sichere SSL/TLS Verbindungen zu einer Amazon RDS-Datenbank-Instance herzustellen, muss Ihre Lambda-Funktion die Identität des Datenbankservers mithilfe eines vertrauenswürdigen Zertifikats verifizieren. Lambda verarbeitet diese Zertifikate je nach Art Ihres Bereitstellungspakets unterschiedlich:
+ [ZIP-Dateiarchive](configuration-function-zip.md): Die Zertifikatsverarbeitung variiert je nach Laufzeit:
  + **Node.js 18 und früher**: Lambda schließt automatisch CA-Zertifikate und RDS-Zertifikate ein.
  + **Node.js 20 und höher**: Lambda lädt standardmäßig keine zusätzlichen CA-Zertifikate mehr. Legen Sie die Umgebungsvariable `NODE_EXTRA_CA_CERTS` auf `/var/runtime/ca-cert.pem` fest.

  Es kann bis zu 4 Wochen dauern, bis Amazon RDS-Zertifikate AWS-Regionen zu den verwalteten Lambda-Laufzeiten hinzugefügt werden.
+ [Container-Images](images-create.md): AWS Basis-Images enthalten nur CA-Zertifikate. Wenn Ihre Funktion eine Verbindung zu einer Amazon-RDS-Datenbank-Instance herstellt, müssen Sie die entsprechenden Zertifikate in Ihr Container-Image einbinden. Laden Sie in Ihrem Dockerfile das [Zertifikatspaket herunter, das dem entspricht, AWS-Region wo Sie Ihre Datenbank hosten](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.CertificatesDownload). Beispiel:

  ```
  RUN curl https://truststore.pki.rds.amazonaws.com/us-east-1/us-east-1-bundle.pem -o /us-east-1-bundle.pem
  ```

Mit diesem Befehl wird das Amazon-RDS-Zertifikatspaket heruntergeladen und im absoluten Pfad `/us-east-1-bundle.pem` im Stammverzeichnis Ihres Containers gespeichert. Beim Konfigurieren der Datenbankverbindung in Ihrem Funktionscode müssen Sie genau diesen Pfad angeben. Beispiel:

------
#### [ Node.js ]

Die Funktion „`readFileSync`“ ist erforderlich, da Node.js-Datenbankclients den eigentlichen Zertifikatsinhalt im Speicher benötigen, nicht nur den Pfad zur Zertifikatsdatei. Ohne „`readFileSync`“ interpretiert der Client die Pfadzeichenfolge als Zertifikatsinhalt, was zu dem Fehler „Selbstsigniertes Zertifikat in der Zertifikatskette“ führt.

**Example Node.js-Verbindungskonfiguration für die OCI-Funktion**  

```
import { readFileSync } from 'fs';

// ...

let connectionConfig = {
    host: process.env.ProxyHostName,
    user: process.env.DBUserName,
    password: token,
    database: process.env.DBName,
    ssl: {
        ca: readFileSync('/us-east-1-bundle.pem') // Load RDS certificate content from file into memory
    }
};
```

------
#### [ Python ]

**Example Python-Verbindungskonfiguration für die OCI-Funktion**  

```
connection = pymysql.connect(
    host=proxy_host_name,
    user=db_username,
    password=token,
    db=db_name,
    port=port,
    ssl={'ca': '/us-east-1-bundle.pem'}  #Path to the certificate in container
)
```

------
#### [ Java ]

Für Java-Funktionen mit JDBC-Verbindungen muss die Verbindungszeichenfolge Folgendes enthalten:
+ `useSSL=true`
+ `requireSSL=true`
+ Einen `sslCA`-Parameter, der auf den Speicherort des Amazon-RDS-Zertifikats im Container-Image verweist

**Example Java-Verbindungszeichenfolge für die OCI-Funktion**  

```
// Define connection string
String connectionString = String.format("jdbc:mysql://%s:%s/%s?useSSL=true&requireSSL=true&sslCA=/us-east-1-bundle.pem", // Path to the certificate in container
        System.getenv("ProxyHostName"),
        System.getenv("Port"),
        System.getenv("DBName"));
```

------
#### [ .NET ]

**Example .NET-Verbindungszeichenfolge für MySQL-Verbindung in der OCI-Funktion**  

```
/// Build the Connection String with the Token 
string connectionString = $"Server={Environment.GetEnvironmentVariable("RDS_ENDPOINT")};" +
                         $"Port={Environment.GetEnvironmentVariable("RDS_PORT")};" +
                         $"Uid={Environment.GetEnvironmentVariable("RDS_USERNAME")};" +
                         $"Pwd={authToken};" +
                         "SslMode=Required;" +
                         "SslCa=/us-east-1-bundle.pem";  // Path to the certificate in container
```

------
#### [ Go ]

Für Go-Funktionen mit MySQL-Verbindungen laden Sie das Amazon-RDS-Zertifikat in einen Zertifikatspool und registrieren es beim MySQL-Treiber. Die Verbindungszeichenfolge muss dann mithilfe des `tls`-Parameters auf diese Konfiguration verweisen.

**Example Go-Code für MySQL-Verbindung in der OCI-Funktion**  

```
import (
    "crypto/tls"
    "crypto/x509"
    "os"
    "github.com/go-sql-driver/mysql"
)

...

// Create certificate pool and register TLS config
rootCertPool := x509.NewCertPool()
pem, err := os.ReadFile("/us-east-1-bundle.pem")  // Path to the certificate in container
if err != nil {
    panic("failed to read certificate file: " + err.Error())
}
if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
    panic("failed to append PEM")
}

mysql.RegisterTLSConfig("custom", &tls.Config{
    RootCAs: rootCertPool,
})

dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?allowCleartextPasswords=true&tls=custom",
    dbUser, authenticationToken, dbEndpoint, dbName,
)
```

------
#### [ Ruby ]

**Example Ruby-Verbindungskonfiguration für die OCI-Funktion**  

```
conn = Mysql2::Client.new(
    host: endpoint,
    username: user,
    password: token,
    port: port,
    database: db_name,
    sslca: '/us-east-1-bundle.pem',  # Path to the certificate in container
    sslverify: true
)
```

------

## Herstellen einer Verbindung mit einer Amazon-RDS-Datenbank in einer Lambda-Funktion
<a name="rds-connection"></a>

Die folgenden Codebeispiele veranschaulichen, wie eine Lambda-Funktion implementiert wird, die eine Verbindung zu einer Amazon-RDS-Datenbank herstellt. Die Funktion stellt eine einfache Datenbankanfrage und gibt das Ergebnis zurück.

**Anmerkung**  
Diese Codebeispiele gelten nur für [ZIP-Bereitstellungspakete](configuration-function-zip.md). Wenn Sie Ihre Funktion mithilfe eines [Container-Images](images-create.md) bereitstellen, müssen Sie die Amazon-RDS-Zertifikatsdatei in Ihrem Funktionscode angeben, wie im [vorherigen Abschnitt](#oci-certificate) beschrieben.

------
#### [ .NET ]

**SDK für .NET**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Herstellen einer Verbindung mit einer Amazon-RDS-Datenbank in einer Lambda-Funktion mithilfe von .NET.  

```
using System.Data;
using System.Text.Json;
using Amazon.Lambda.APIGatewayEvents;
using Amazon.Lambda.Core;
using MySql.Data.MySqlClient;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace aws_rds;

public class InputModel
{
    public string key1 { get; set; }
    public string key2 { get; set; }
}

public class Function
{
    /// <summary>
    // Handles the Lambda function execution for connecting to RDS using IAM authentication.
    /// </summary>
    /// <param name="input">The input event data passed to the Lambda function</param>
    /// <param name="context">The Lambda execution context that provides runtime information</param>
    /// <returns>A response object containing the execution result</returns>

    public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
    {
        // Sample Input: {"body": "{\"key1\":\"20\", \"key2\":\"25\"}"}
        var input = JsonSerializer.Deserialize<InputModel>(request.Body);

        /// Obtain authentication token
        var authToken = RDSAuthTokenGenerator.GenerateAuthToken(
            Environment.GetEnvironmentVariable("RDS_ENDPOINT"),
            Convert.ToInt32(Environment.GetEnvironmentVariable("RDS_PORT")),
            Environment.GetEnvironmentVariable("RDS_USERNAME")
        );

        /// Build the Connection String with the Token 
        string connectionString = $"Server={Environment.GetEnvironmentVariable("RDS_ENDPOINT")};" +
                                  $"Port={Environment.GetEnvironmentVariable("RDS_PORT")};" +
                                  $"Uid={Environment.GetEnvironmentVariable("RDS_USERNAME")};" +
                                  $"Pwd={authToken};";


        try
        {
            await using var connection = new MySqlConnection(connectionString);
            await connection.OpenAsync();

            const string sql = "SELECT @param1 + @param2 AS Sum";

            await using var command = new MySqlCommand(sql, connection);
            command.Parameters.AddWithValue("@param1", int.Parse(input.key1 ?? "0"));
            command.Parameters.AddWithValue("@param2", int.Parse(input.key2 ?? "0"));

            await using var reader = await command.ExecuteReaderAsync();
            if (await reader.ReadAsync())
            {
                int result = reader.GetInt32("Sum");

                //Sample Response: {"statusCode":200,"body":"{\"message\":\"The sum is: 45\"}","isBase64Encoded":false}
                return new APIGatewayProxyResponse
                {
                    StatusCode = 200,
                    Body = JsonSerializer.Serialize(new { message = $"The sum is: {result}" })
                };
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }

        return new APIGatewayProxyResponse
        {
            StatusCode = 500,
            Body = JsonSerializer.Serialize(new { error = "Internal server error" })
        };
    }
}
```

------
#### [ Go ]

**SDK für Go V2**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Herstellen einer Verbindung zu einer Amazon-RDS-Datenbank in einer Lambda-Funktion mit Go.  

```
/*
Golang v2 code here.
*/

package main

import (
	"context"
	"database/sql"
	"encoding/json"
	"fmt"
	"os"

	"github.com/aws/aws-lambda-go/lambda"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/feature/rds/auth"
	_ "github.com/go-sql-driver/mysql"
)

type MyEvent struct {
	Name string `json:"name"`
}

func HandleRequest(event *MyEvent) (map[string]interface{}, error) {

	var dbName string = os.Getenv("DatabaseName")
	var dbUser string = os.Getenv("DatabaseUser")
	var dbHost string = os.Getenv("DBHost") // Add hostname without https
	var dbPort int = os.Getenv("Port")      // Add port number
	var dbEndpoint string = fmt.Sprintf("%s:%d", dbHost, dbPort)
	var region string = os.Getenv("AWS_REGION")

	cfg, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
		panic("configuration error: " + err.Error())
	}

	authenticationToken, err := auth.BuildAuthToken(
		context.TODO(), dbEndpoint, region, dbUser, cfg.Credentials)
	if err != nil {
		panic("failed to create authentication token: " + err.Error())
	}

	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?tls=true&allowCleartextPasswords=true",
		dbUser, authenticationToken, dbEndpoint, dbName,
	)

	db, err := sql.Open("mysql", dsn)
	if err != nil {
		panic(err)
	}

	defer db.Close()

	var sum int
	err = db.QueryRow("SELECT ?+? AS sum", 3, 2).Scan(&sum)
	if err != nil {
		panic(err)
	}
	s := fmt.Sprint(sum)
	message := fmt.Sprintf("The selected sum is: %s", s)

	messageBytes, err := json.Marshal(message)
	if err != nil {
		return nil, err
	}

	messageString := string(messageBytes)
	return map[string]interface{}{
		"statusCode": 200,
		"headers":    map[string]string{"Content-Type": "application/json"},
		"body":       messageString,
	}, nil
}

func main() {
	lambda.Start(HandleRequest)
}
```

------
#### [ Java ]

**SDK für Java 2.x**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Herstellen einer Verbindung zu einer Amazon-RDS-Datenbank in einer Lambda-Funktion mit Java.  

```
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rdsdata.RdsDataClient;
import software.amazon.awssdk.services.rdsdata.model.ExecuteStatementRequest;
import software.amazon.awssdk.services.rdsdata.model.ExecuteStatementResponse;
import software.amazon.awssdk.services.rdsdata.model.Field;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class RdsLambdaHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {

    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent event, Context context) {
        APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();

        try {
            // Obtain auth token
            String token = createAuthToken();

            // Define connection configuration
            String connectionString = String.format("jdbc:mysql://%s:%s/%s?useSSL=true&requireSSL=true",
                    System.getenv("ProxyHostName"),
                    System.getenv("Port"),
                    System.getenv("DBName"));

            // Establish a connection to the database
            try (Connection connection = DriverManager.getConnection(connectionString, System.getenv("DBUserName"), token);
                 PreparedStatement statement = connection.prepareStatement("SELECT ? + ? AS sum")) {

                statement.setInt(1, 3);
                statement.setInt(2, 2);

                try (ResultSet resultSet = statement.executeQuery()) {
                    if (resultSet.next()) {
                        int sum = resultSet.getInt("sum");
                        response.setStatusCode(200);
                        response.setBody("The selected sum is: " + sum);
                    }
                }
            }

        } catch (Exception e) {
            response.setStatusCode(500);
            response.setBody("Error: " + e.getMessage());
        }

        return response;
    }

    private String createAuthToken() {
        // Create RDS Data Service client
        RdsDataClient rdsDataClient = RdsDataClient.builder()
                .region(Region.of(System.getenv("AWS_REGION")))
                .credentialsProvider(DefaultCredentialsProvider.create())
                .build();

        // Define authentication request
        ExecuteStatementRequest request = ExecuteStatementRequest.builder()
                .resourceArn(System.getenv("ProxyHostName"))
                .secretArn(System.getenv("DBUserName"))
                .database(System.getenv("DBName"))
                .sql("SELECT 'RDS IAM Authentication'")
                .build();

        // Execute request and obtain authentication token
        ExecuteStatementResponse response = rdsDataClient.executeStatement(request);
        Field tokenField = response.records().get(0).get(0);

        return tokenField.stringValue();
    }
}
```

------
#### [ JavaScript ]

**SDK für JavaScript (v3)**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Herstellen einer Verbindung zu einer Amazon RDS-Datenbank in einer Lambda-Funktion mithilfe von JavaScript.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
/* 
Node.js code here.
*/
// ES6+ example
import { Signer } from "@aws-sdk/rds-signer";
import mysql from 'mysql2/promise';

async function createAuthToken() {
  // Define connection authentication parameters
  const dbinfo = {

    hostname: process.env.ProxyHostName,
    port: process.env.Port,
    username: process.env.DBUserName,
    region: process.env.AWS_REGION,

  }

  // Create RDS Signer object
  const signer = new Signer(dbinfo);

  // Request authorization token from RDS, specifying the username
  const token = await signer.getAuthToken();
  return token;
}

async function dbOps() {

  // Obtain auth token
  const token = await createAuthToken();
  // Define connection configuration
  let connectionConfig = {
    host: process.env.ProxyHostName,
    user: process.env.DBUserName,
    password: token,
    database: process.env.DBName,
    ssl: 'Amazon RDS'
  }
  // Create the connection to the DB
  const conn = await mysql.createConnection(connectionConfig);
  // Obtain the result of the query
  const [res,] = await conn.execute('select ?+? as sum', [3, 2]);
  return res;

}

export const handler = async (event) => {
  // Execute database flow
  const result = await dbOps();
  // Return result
  return {
    statusCode: 200,
    body: JSON.stringify("The selected sum is: " + result[0].sum)
  }
};
```
Herstellen einer Verbindung zu einer Amazon RDS-Datenbank in einer Lambda-Funktion mithilfe von TypeScript.  

```
import { Signer } from "@aws-sdk/rds-signer";
import mysql from 'mysql2/promise';

// RDS settings
// Using '!' (non-null assertion operator) to tell the TypeScript compiler that the DB settings are not null or undefined,
const proxy_host_name = process.env.PROXY_HOST_NAME!
const port = parseInt(process.env.PORT!)
const db_name = process.env.DB_NAME!
const db_user_name = process.env.DB_USER_NAME!
const aws_region = process.env.AWS_REGION!


async function createAuthToken(): Promise<string> {

    // Create RDS Signer object
    const signer = new Signer({
        hostname: proxy_host_name,
        port: port,
        region: aws_region,
        username: db_user_name
    });

    // Request authorization token from RDS, specifying the username
    const token = await signer.getAuthToken();
    return token;
}

async function dbOps(): Promise<mysql.QueryResult | undefined> {
    try {
        // Obtain auth token
        const token = await createAuthToken();
        const conn = await mysql.createConnection({
            host: proxy_host_name,
            user: db_user_name,
            password: token,
            database: db_name,
            ssl: 'Amazon RDS' // Ensure you have the CA bundle for SSL connection
        });
        const [rows, fields] = await conn.execute('SELECT ? + ? AS sum', [3, 2]);
        console.log('result:', rows);
        return rows;
    }
    catch (err) {
        console.log(err);
    }
}

export const lambdaHandler = async (event: any): Promise<{ statusCode: number; body: string }> => {
    // Execute database flow
    const result = await dbOps();

    // Return error is result is undefined
    if (result == undefined)
        return {
            statusCode: 500,
            body: JSON.stringify(`Error with connection to DB host`)
        }

    // Return result
    return {
        statusCode: 200,
        body: JSON.stringify(`The selected sum is: ${result[0].sum}`)
    };
};
```

------
#### [ PHP ]

**SDK für PHP**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Herstellen einer Verbindung zu einer Amazon-RDS-Datenbank in einer Lambda-Funktion mit PHP.  

```
<?php
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\Handler as StdHandler;
use Bref\Logger\StderrLogger;
use Aws\Rds\AuthTokenGenerator;
use Aws\Credentials\CredentialProvider;

require __DIR__ . '/vendor/autoload.php';

class Handler implements StdHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }


    private function getAuthToken(): string {
        // Define connection authentication parameters
        $dbConnection = [
            'hostname' => getenv('DB_HOSTNAME'),
            'port' => getenv('DB_PORT'),
            'username' => getenv('DB_USERNAME'),
            'region' => getenv('AWS_REGION'),
        ];

        // Create RDS AuthTokenGenerator object
        $generator = new AuthTokenGenerator(CredentialProvider::defaultProvider());

        // Request authorization token from RDS, specifying the username
        return $generator->createToken(
            $dbConnection['hostname'] . ':' . $dbConnection['port'],
            $dbConnection['region'],
            $dbConnection['username']
        );
    }

    private function getQueryResults() {
        // Obtain auth token
        $token = $this->getAuthToken();

        // Define connection configuration
        $connectionConfig = [
            'host' => getenv('DB_HOSTNAME'),
            'user' => getenv('DB_USERNAME'),
            'password' => $token,
            'database' => getenv('DB_NAME'),
        ];

        // Create the connection to the DB
        $conn = new PDO(
            "mysql:host={$connectionConfig['host']};dbname={$connectionConfig['database']}",
            $connectionConfig['user'],
            $connectionConfig['password'],
            [
                PDO::MYSQL_ATTR_SSL_CA => '/path/to/rds-ca-2019-root.pem',
                PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
            ]
        );

        // Obtain the result of the query
        $stmt = $conn->prepare('SELECT ?+? AS sum');
        $stmt->execute([3, 2]);

        return $stmt->fetch(PDO::FETCH_ASSOC);
    }

    /**
     * @param mixed $event
     * @param Context $context
     * @return array
     */
    public function handle(mixed $event, Context $context): array
    {
        $this->logger->info("Processing query");

        // Execute database flow
        $result = $this->getQueryResults();

        return [
            'sum' => $result['sum']
        ];
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

------
#### [ Python ]

**SDK für Python (Boto3)**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Herstellen einer Verbindung zu einer Amazon-RDS-Datenbank in einer Lambda-Funktion mit Python.  

```
import json
import os
import boto3
import pymysql

# RDS settings
proxy_host_name = os.environ['PROXY_HOST_NAME']
port = int(os.environ['PORT'])
db_name = os.environ['DB_NAME']
db_user_name = os.environ['DB_USER_NAME']
aws_region = os.environ['AWS_REGION']


# Fetch RDS Auth Token
def get_auth_token():
    client = boto3.client('rds')
    token = client.generate_db_auth_token(
        DBHostname=proxy_host_name,
        Port=port
        DBUsername=db_user_name
        Region=aws_region
    )
    return token

def lambda_handler(event, context):
    token = get_auth_token()
    try:
        connection = pymysql.connect(
            host=proxy_host_name,
            user=db_user_name,
            password=token,
            db=db_name,
            port=port,
            ssl={'ca': 'Amazon RDS'}  # Ensure you have the CA bundle for SSL connection
        )
        
        with connection.cursor() as cursor:
            cursor.execute('SELECT %s + %s AS sum', (3, 2))
            result = cursor.fetchone()

        return result
        
    except Exception as e:
        return (f"Error: {str(e)}")  # Return an error message if an exception occurs
```

------
#### [ Ruby ]

**SDK für Ruby**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Herstellen einer Verbindung zu einer Amazon-RDS-Datenbank in einer Lambda-Funktion mit Ruby.  

```
# Ruby code here.

require 'aws-sdk-rds'
require 'json'
require 'mysql2'

def lambda_handler(event:, context:)
  endpoint = ENV['DBEndpoint'] # Add the endpoint without https"
  port = ENV['Port']           # 3306
  user = ENV['DBUser']
  region = ENV['DBRegion']     # 'us-east-1'
  db_name = ENV['DBName']

  credentials = Aws::Credentials.new(
    ENV['AWS_ACCESS_KEY_ID'],
    ENV['AWS_SECRET_ACCESS_KEY'],
    ENV['AWS_SESSION_TOKEN']
  )
  rds_client = Aws::RDS::AuthTokenGenerator.new(
    region: region, 
    credentials: credentials
  )

  token = rds_client.auth_token(
    endpoint: endpoint+ ':' + port,
    user_name: user,
    region: region
  )

  begin
    conn = Mysql2::Client.new(
      host: endpoint,
      username: user,
      password: token,
      port: port,
      database: db_name,
      sslca: '/var/task/global-bundle.pem', 
      sslverify: true,
      enable_cleartext_plugin: true
    )
    a = 3
    b = 2
    result = conn.query("SELECT #{a} + #{b} AS sum").first['sum']
    puts result
    conn.close
    {
      statusCode: 200,
      body: result.to_json
    }
  rescue => e
    puts "Database connection failed due to #{e}"
  end
end
```

------
#### [ Rust ]

**SDK für Rust**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Herstellen einer Verbindung zu einer Amazon-RDS-Datenbank in einer Lambda-Funktion mit Rust.  

```
use aws_config::BehaviorVersion;
use aws_credential_types::provider::ProvideCredentials;
use aws_sigv4::{
    http_request::{sign, SignableBody, SignableRequest, SigningSettings},
    sign::v4,
};
use lambda_runtime::{run, service_fn, Error, LambdaEvent};
use serde_json::{json, Value};
use sqlx::postgres::PgConnectOptions;
use std::env;
use std::time::{Duration, SystemTime};

const RDS_CERTS: &[u8] = include_bytes!("global-bundle.pem");

async fn generate_rds_iam_token(
    db_hostname: &str,
    port: u16,
    db_username: &str,
) -> Result<String, Error> {
    let config = aws_config::load_defaults(BehaviorVersion::v2024_03_28()).await;

    let credentials = config
        .credentials_provider()
        .expect("no credentials provider found")
        .provide_credentials()
        .await
        .expect("unable to load credentials");
    let identity = credentials.into();
    let region = config.region().unwrap().to_string();

    let mut signing_settings = SigningSettings::default();
    signing_settings.expires_in = Some(Duration::from_secs(900));
    signing_settings.signature_location = aws_sigv4::http_request::SignatureLocation::QueryParams;

    let signing_params = v4::SigningParams::builder()
        .identity(&identity)
        .region(&region)
        .name("rds-db")
        .time(SystemTime::now())
        .settings(signing_settings)
        .build()?;

    let url = format!(
        "https://{db_hostname}:{port}/?Action=connect&DBUser={db_user}",
        db_hostname = db_hostname,
        port = port,
        db_user = db_username
    );

    let signable_request =
        SignableRequest::new("GET", &url, std::iter::empty(), SignableBody::Bytes(&[]))
            .expect("signable request");

    let (signing_instructions, _signature) =
        sign(signable_request, &signing_params.into())?.into_parts();

    let mut url = url::Url::parse(&url).unwrap();
    for (name, value) in signing_instructions.params() {
        url.query_pairs_mut().append_pair(name, &value);
    }

    let response = url.to_string().split_off("https://".len());

    Ok(response)
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    run(service_fn(handler)).await
}

async fn handler(_event: LambdaEvent<Value>) -> Result<Value, Error> {
    let db_host = env::var("DB_HOSTNAME").expect("DB_HOSTNAME must be set");
    let db_port = env::var("DB_PORT")
        .expect("DB_PORT must be set")
        .parse::<u16>()
        .expect("PORT must be a valid number");
    let db_name = env::var("DB_NAME").expect("DB_NAME must be set");
    let db_user_name = env::var("DB_USERNAME").expect("DB_USERNAME must be set");

    let token = generate_rds_iam_token(&db_host, db_port, &db_user_name).await?;

    let opts = PgConnectOptions::new()
        .host(&db_host)
        .port(db_port)
        .username(&db_user_name)
        .password(&token)
        .database(&db_name)
        .ssl_root_cert_from_pem(RDS_CERTS.to_vec())
        .ssl_mode(sqlx::postgres::PgSslMode::Require);

    let pool = sqlx::postgres::PgPoolOptions::new()
        .connect_with(opts)
        .await?;

    let result: i32 = sqlx::query_scalar("SELECT $1 + $2")
        .bind(3)
        .bind(2)
        .fetch_one(&pool)
        .await?;

    println!("Result: {:?}", result);

    Ok(json!({
        "statusCode": 200,
        "content-type": "text/plain",
        "body": format!("The selected sum is: {result}")
    }))
}
```

------

## Verarbeitung von Ereignisbenachrichtigungen von Amazon RDS
<a name="rds-events"></a>

Sie können Lambda verwenden, um Ereignisbenachrichtigungen aus einer Amazon-RDS-Datenbank zu verarbeiten. Amazon RDS sendet Benachrichtigungen an ein Amazon-Simple-Notification-Service-(Amazon-SNS)-Thema, das Sie so konfigurieren können, dass eine Lambda-Funktion aufgerufen wird. Amazon SNS wickelt die Nachricht von Amazon RDS in ein eigenes Ereignisdokument und sendet sie an Ihre Funktion.

Weitere Informationen zum Konfigurieren einer Amazon-RDS-Datenbank zum Senden von Benachrichtigungen finden Sie unter [Verwendung von Amazon-RDS-Ereignisbenachrichtigungen](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Events.html). 

**Example Amazon-RDS-Nachricht in einem Amazon-SNS-Ereignis**  

```
{
        "Records": [
          {
            "EventVersion": "1.0",
            "EventSubscriptionArn": "arn:aws:sns:us-east-2:123456789012:rds-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
            "EventSource": "aws:sns",
            "Sns": {
              "SignatureVersion": "1",
              "Timestamp": "2023-01-02T12:45:07.000Z",
              "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==",
              "SigningCertUrl": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem",
              "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
              "Message": "{\"Event Source\":\"db-instance\",\"Event Time\":\"2023-01-02 12:45:06.000\",\"Identifier Link\":\"https://console.aws.amazon.com/rds/home?region=eu-west-1#dbinstance:id=dbinstanceid\",\"Source ID\":\"dbinstanceid\",\"Event ID\":\"http://docs.amazonwebservices.com/AmazonRDS/latest/UserGuide/USER_Events.html#RDS-EVENT-0002\",\"Event Message\":\"Finished DB Instance backup\"}",
              "MessageAttributes": {},
              "Type": "Notification",
              "UnsubscribeUrl": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&amp;SubscriptionArn=arn:aws:sns:us-east-2:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
              "TopicArn":"arn:aws:sns:us-east-2:123456789012:sns-lambda",
              "Subject": "RDS Notification Message"
            }
          }
        ]
      }
```

## Vollständiges Lambda- und Amazon-RDS-Tutorial
<a name="rds-database-samples"></a>
+ [Verwendung einer Lambda-Funktion für den Zugriff auf eine Amazon-RDS-Datenbank](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-lambda-tutorial.html) – Im Benutzerhandbuch zu Amazon RDS wird beschrieben, wie Sie eine Lambda-Funktion verwenden, um Daten über einen Amazon-RDS-Proxy in eine Amazon-RDS-Datenbank zu schreiben. Ihre Lambda-Funktion liest Datensätze aus einer Amazon-SQS-Warteschlange und schreibt jedes Mal, wenn eine Nachricht hinzugefügt wird, neue Elemente in eine Tabelle in Ihrer Datenbank.

# Wählen Sie einen Datenbankservice für Ihre Lambda-basierten Anwendungen.
<a name="ddb-rds-database-decision"></a>

Viele serverlose Anwendungen müssen Daten speichern und abrufen. AWS bietet mehrere Datenbankoptionen, die mit Lambda-Funktionen funktionieren. Zwei der beliebtesten Optionen sind Amazon DynamoDB, ein NoSQL-Datenbankservice, und Amazon RDS, eine traditionelle relationale Datenbanklösung. In den folgenden Abschnitten werden die wichtigsten Unterschiede zwischen diesen Services bei der Verwendung mit Lambda erläutert und Sie bei der Auswahl des passenden Datenbankservices für Ihre Serverless-Anwendung unterstützt.

Weitere Informationen über die anderen von AWS angebotenen Datenbankdienste und ein allgemeines Verständnis ihrer Anwendungsfälle und Kompromisse finden Sie unter [Auswahl eines AWS](https://docs.aws.amazon.com/decision-guides/latest/databases-on-aws-how-to-choose/databases-on-aws-how-to-choose.html) Datenbankdienstes. Alle AWS -Datenbankservices sind mit Lambda kompatibel, aber nicht alle eignen sich für Ihren speziellen Anwendungsfall.

## Welche Möglichkeiten haben Sie bei der Auswahl eines Datenbankservices für Lambda?
<a name="w2aad101d101c19b9"></a>

AWS bietet mehrere Datenbankdienste an. Für Serverless-Anwendungen sind DynamoDB und Amazon RDS zwei der beliebtesten Optionen.
+ **DynamoDB** ist ein vollständig verwalteter NoSQL-Datenbankservice, der für Serverless-Anwendungen optimiert ist. Er bietet nahtlose Skalierung und eine konsistente Leistung im einstelligen Millisekundenbereich in jeder Größenordnung.
+ **Amazon RDS** ist ein verwalteter relationaler Datenbankservice, der mehrere Datenbank-Engines unterstützt, darunter MySQL und PostgreSQL. Er bietet vertraute SQL-Funktionen mit verwalteter Infrastruktur.

## Empfehlungen, falls Sie Ihre Anforderungen bereits kennen
<a name="w2aad101d101c19c11"></a>

Wenn Sie sich über Ihre Anforderungen bereits im Klaren sind, finden Sie hier unsere grundlegenden Empfehlungen:

Wir empfehlen [DynamoDB](with-ddb.md) für Serverless-Anwendungen, die eine konsistente Leistung mit niedriger Latenz und automatische Skalierung benötigen und keine komplexen Verknüpfungen oder Transaktionen erfordern. Aufgrund seiner Serverless-Architektur eignet er sich besonders gut für Lambda-basierte Anwendungen.

[Amazon RDS](services-rds.md) ist die bessere Wahl, wenn Sie komplexe SQL-Abfragen oder Verknüpfungen benötigen oder bereits Anwendungen mit relationalen Datenbanken verwenden. Beachten Sie jedoch, dass die Verbindung von Lambda-Funktionen mit Amazon RDS zusätzliche Konfigurationen erfordert und die Kaltstartzeiten beeinflussen kann.

## Was Sie bei der Auswahl eines Datenbankservices beachten sollten
<a name="w2aad101d101c19c13"></a>

Bei der Auswahl zwischen DynamoDB und Amazon RDS für Ihre Lambda-Anwendungen sollten Sie die folgenden Faktoren berücksichtigen:
+ Verbindungsmanagement und Kaltstarts
+ Datenzugriffsmuster
+ Abfragekomplexität
+ Anforderungen für Datenkonsistenz.
+ Skalierungsmerkmale
+ Kostenmodell

Wenn Sie diese Faktoren verstehen, können Sie die Option auswählen, die Ihren spezifischen Anwendungsfällen am besten entspricht.

### Verbindungsmanagement und Kaltstarts
<a name="w2aad101d101c19c13b9b1"></a>
+ DynamoDB verwendet eine HTTP-API für alle Operationen. Lambda-Funktionen können Anfragen sofort stellen, ohne Verbindungen aufrechtzuerhalten, was zu einer besseren Kaltstartleistung führt. Jede Anfrage wird mithilfe von AWS Anmeldeinformationen ohne Verbindungsaufwand authentifiziert.
+ Amazon RDS erfordert die Verwaltung von Verbindungspools, da es herkömmliche Datenbankverbindungen verwendet. Dies kann sich auf Kaltstarts auswirken, da neue Lambda-Instances Verbindungen herstellen müssen. Sie müssen Strategien für das Verbindungspooling implementieren und möglicherweise den [Amazon-RDS-Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.html) verwenden, um Verbindungen effektiv zu verwalten. Beachten Sie, dass für die Verwendung des Amazon-RDS-Proxy zusätzliche Kosten anfallen.

### Datenzugriffsmuster
<a name="w2aad101d101c19c13b9b3"></a>
+ DynamoDB eignet sich am besten für bekannte Zugriffsmuster und Einzeltabellendesigns. Es ist ideal für Lambda-Anwendungen, die einen konsistenten Zugriff mit geringer Latenz auf Daten basierend auf Primärschlüsseln oder Sekundärindizes benötigen.
+ Amazon RDS bietet Flexibilität für komplexe Abfragen und sich ändernde Zugriffsmuster. Es ist besser geeignet, wenn Ihre Lambda-Funktionen einzigartige, maßgeschneiderte Abfragen oder komplexe Verknüpfungen über mehrere Tabellen hinweg durchführen müssen.

### Abfragekomplexität
<a name="w2aad101d101c19c13b9b5"></a>
+ DynamoDB zeichnet sich durch einfache, schlüsselbasierte Operationen und vordefinierte Zugriffsmuster aus. Komplexe Abfragen müssen um Indexstrukturen herum entworfen werden, und Verknüpfungen müssen im Anwendungscode behandelt werden.
+ Amazon RDS unterstützt komplexe SQL-Abfragen mit Verknüpfungen, Unterabfragen und Aggregationen. Dies kann Ihren Lambda-Funktionscode vereinfachen, wenn komplexe Datenoperationen erforderlich sind.

### Anforderungen für Datenkonsistenz.
<a name="w2aad101d101c19c13b9b7"></a>
+ DynamoDB bietet sowohl Optionen für letztendliche als auch für starke Konsistenz, wobei starke Konsistenz für Lesevorgänge einzelner Elemente verfügbar ist. Transaktionen werden unterstützt, jedoch mit einigen Einschränkungen.
+ Amazon RDS bietet vollständige ACID-Konformität (Atomizität, Konsistenz, Isolierung und Zuverlässigkeit) sowie Unterstützung für komplexe Transaktionen. Wenn Ihre Lambda-Funktionen komplexe Transaktionen oder starke Konsistenz über mehrere Datensätze hinweg benötigen, ist Amazon RDS möglicherweise besser geeignet.

### Skalierungsmerkmale
<a name="w2aad101d101c19c13b9b9"></a>
+ DynamoDB skaliert automatisch mit Ihrer Workload. Es kann plötzliche Spitzen im Datenverkehr durch Lambda-Funktionen ohne vorherige Bereitstellung bewältigen. Sie können den On-Demand-Kapazitätsmodus verwenden, um nur für das zu bezahlen, was Sie tatsächlich nutzen. Dies entspricht perfekt dem Skalierungsmodell von Lambda.
+ Amazon RDS verfügt über eine feste Kapazität, die auf der von Ihnen ausgewählten Instance-Größe basiert. Wenn mehrere Lambda-Funktionen versuchen, gleichzeitig eine Verbindung herzustellen, überschreiten Sie möglicherweise Ihr Verbindungskontingent. Sie müssen die Verbindungspools sorgfältig verwalten und möglicherweise eine Wiederholungslogik implementieren.

### Kostenmodell
<a name="w2aad101d101c19c13b9c11"></a>
+ Die Preisgestaltung von DynamoDB ist gut auf Serverless-Anwendungen abgestimmt. Mit On-Demand-Kapazität zahlen Sie nur für die tatsächlichen Lese- und Schreibvorgänge Ihrer Lambda-Funktionen. Für Leerlaufzeiten fallen keine Gebühren an.
+ Amazon RDS berechnet Gebühren für die laufende Instance unabhängig von der Nutzung. Dies kann bei sporadischen Workloads, wie sie in Serverless-Anwendungen typisch sind, weniger kosteneffizient sein. Für Workloads mit hohem Durchsatz und konstanter Nutzung kann es jedoch wirtschaftlicher sein.

## Erste Schritte mit dem von Ihnen ausgewählten Datenbankservice
<a name="w2aad101d101c19c15"></a>

Nachdem Sie die Auswahlkriterien für DynamoDB und Amazon RDS sowie die wichtigsten Unterschiede kennengelernt haben, können Sie die Option wählen, die Ihren Bedürfnissen am besten entspricht, und mithilfe der folgenden Ressourcen loslegen.

------
#### [ DynamoDB ]

**Nutzen Sie die folgenden Ressourcen, um mit DynamoDB zu beginnen**
+ Eine Einführung in den DynamoDB-Service finden Sie im *Entwicklerhandbuch für Amazon DynamoDB* unter [Was ist DynamoDB?](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html).
+ Im Tutorial [Verwenden von Lambda mit API Gateway](services-apigateway-tutorial.md) sehen Sie ein Beispiel für die Verwendung einer Lambda-Funktion zum Ausführen von CRUD-Vorgängen in einer DynamoDB-Tabelle als Antwort auf eine API-Anfrage.
+ Lesen Sie [Programming with DynamoDB und die AWS SDKs](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.html) im *Amazon DynamoDB Developer Guide*, um mehr darüber zu erfahren, wie Sie von Ihrer Lambda-Funktion aus auf DynamoDB zugreifen können, indem Sie eine der AWS SDKs

------
#### [ Amazon RDS ]

**Nutzen Sie die folgenden Ressourcen, um mit Amazon RDS zu beginnen**
+ Eine Einführung in den Amazon-RDS-Service finden Sie im Abschnitt [Was ist Amazon Relational Database Service (Amazon RDS)?](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) im *Benutzerhandbuch zu Amazon Relational Database Service*.
+ Folgen Sie dem Tutorial [Verwenden einer Lambda-Funktion für den Zugriff auf eine Amazon-RDS-Datenbank](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-lambda-tutorial.html) im *Benutzerhandbuch zu Amazon Relational Database Service*.
+ Weitere Informationen zur Verwendung von Lambda mit Amazon RDS finden Sie unter [Verwendung AWS Lambda mit Amazon RDS](services-rds.md).

------

# Verarbeitung von Amazon-S3-Ereignisbenachrichtigungen mit Lambda
<a name="with-s3"></a>

Sie können Lambda verwenden, um [Ereignisbenachrichtigungen](https://docs.aws.amazon.com/AmazonS3/latest/userguide/NotificationHowTo.html) von Amazon Simple Storage Service zu verarbeiten. Amazon S3 kann ein Ereignis an eine Lambda-Funktion senden, wenn ein Objekt erstellt oder gelöscht wird. Sie konfigurieren Benachrichtigungseinstellungen für einen Bucket und erteilen die Amazon-S3-Berechtigung zum Aufrufen einer Funktion in der ressourcenbasierten Berechtigungsrichtlinie der Funktion.

**Warnung**  
Wenn Ihre Lambda-Funktion den gleichen Bucket verwendet, der sie auslöst, könnte dies dazu führen, dass die Funktion in einer Schleife ausgeführt wird. Wenn der Bucket z. B. eine Funktion immer dann auslöst, wenn ein Objekt hochgeladen wird, und die Funktion ein Objekt in den Bucket hochlädt, löst die Funktion sich indirekt selbst aus. Um dies zu vermeiden, verwenden Sie zwei Buckets oder konfigurieren Sie den Auslöser so, dass er nur für einen Präfix gilt, der für eingehende Objekte verwendet wird.

Amazon S3 ruft Ihre Funktion [asynchron](invocation-async.md) mit einem Ereignis auf, das Details über das Objekt enthält. Das folgende Beispiel zeigt ein Ereignis, das Amazon S3 gesendet hat, als ein Bereitstellungspaket in Amazon S3 hochgeladen wurde.

**Example Amazon-S3-Benachrichtigungsereignis**  

```
{
  "Records": [
    {
      "eventVersion": "2.1",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-2",
      "eventTime": "2019-09-03T19:37:27.192Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "AWS:AIDAINPONIXQXHT3IKHL2"
      },
      "requestParameters": {
        "sourceIPAddress": "205.255.255.255"
      },
      "responseElements": {
        "x-amz-request-id": "D82B88E5F771F645",
        "x-amz-id-2": "vlR7PnpV2Ce81l0PRw6jlUpck7Jo5ZsQjryTjKlc5aLWGVHPZLj5NeC6qMa0emYBDXOo6QBU0Wo="
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "828aa6fc-f7b5-4305-8584-487c791949c1",
        "bucket": {
          "name": "amzn-s3-demo-bucket",
          "ownerIdentity": {
            "principalId": "A3I5XTEXAMAI3E"
          },
          "arn": "arn:aws:s3:::lambda-artifacts-deafc19498e3f2df"
        },
        "object": {
          "key": "b21b84d653bb07b05b1e6b33684dc11b",
          "size": 1305107,
          "eTag": "b21b84d653bb07b05b1e6b33684dc11b",
          "sequencer": "0C0F6F405D6ED209E1"
        }
      }
    }
  ]
}
```

Um Ihre Funktion aufzurufen, benötigt Amazon S3 die Berechtigung von der [ressourcenbasierten Richtlinie](access-control-resource-based.md) der Funktion. Wenn Sie einen Amazon-S3-Auslöser in der Lambda-Konsole konfigurieren, ändert die Konsole die ressourcenbasierte Richtlinie so, dass Amazon S3 die Funktion aufrufen kann, wenn der Bucket-Name und die Konto-ID übereinstimmen. Wenn Sie die Benachrichtigung in Amazon S3 konfigurieren, verwenden Sie die Lambda-API, um die Richtlinie zu aktualisieren. Sie können auch die Lambda-API verwenden, um einem anderen Konto Berechtigungen zu erteilen oder die Berechtigung auf einen bestimmten Alias zu beschränken.

Wenn Ihre Funktion das AWS SDK zur Verwaltung von Amazon S3 S3-Ressourcen verwendet, benötigt sie in ihrer [Ausführungsrolle](lambda-intro-execution-role.md) auch Amazon S3 S3-Berechtigungen. 

**Topics**
+ [

# Tutorial: Verwenden eines Amazon-S3-Auslösers zum Aufrufen einer Lambda-Funktion
](with-s3-example.md)
+ [

# Tutorial: Verwenden eines Amazon-S3-Auslösers zum Erstellen von Miniaturbildern
](with-s3-tutorial.md)

# Tutorial: Verwenden eines Amazon-S3-Auslösers zum Aufrufen einer Lambda-Funktion
<a name="with-s3-example"></a>

In diesem Tutorial verwenden Sie die Konsole, um eine Lambda-Funktion zu erstellen und einen Auslöser für einen Amazon-Simple-Storage-Service-Bucket (Amazon-S3-Bucket) zu konfigurieren. Jedes Mal, wenn Sie Ihrem Amazon S3 S3-Bucket ein Objekt hinzufügen, wird Ihre Funktion ausgeführt und der Objekttyp wird an Amazon CloudWatch Logs ausgegeben.

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-example/s3_tut_config.png)


Dieses Tutorial zeigt, wie man:

1. Erstellen Sie einen Amazon-S3-Bucket.

1. Erstellen Sie eine Lambda-Funktion, die den Objekttyp von Objekten in einem Amazon-S3-Bucket ausgibt.

1. Konfigurieren Sie einen Lambda-Auslöser, der Ihre Funktion aufruft, wenn Objekte in Ihren Bucket hochgeladen werden.

1. Testen Sie Ihre Funktion, zuerst mit einem Dummy-Ereignis und dann mit dem Auslöser.

Durch das Ausführen dieser Schritte erfahren Sie, wie Sie eine Lambda-Funktion so konfigurieren, dass sie ausgeführt wird, wenn Objekte einem Amazon-S3-Bucket hinzugefügt oder daraus gelöscht werden. Sie können dieses Tutorial abschließen, indem Sie nur die AWS-Managementkonsole verwenden.

## Erstellen Sie einen Amazon S3 S3-Bucket
<a name="with-s3-example-create-bucket"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps1.png)


**So erstellen Sie einen Amazon-S3-Bucket**

1. Öffnen Sie die [Amazon-S3-Konsole](https://console.aws.amazon.com/s3) und wählen Sie die Seite **Allzweck-Buckets** aus.

1. Wählen Sie den aus, der Ihrem geografischen Standort AWS-Region am nächsten liegt. Sie können Ihre Region mithilfe der Dropdown-Liste am oberen Bildschirmrand ändern. Später im Tutorial müssen Sie eine Lambda-Funktion in derselben Region erstellen.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/console_region_select.png)

1. Wählen Sie **Create Bucket** (Bucket erstellen) aus.

1. Führen Sie unter **Allgemeine Konfiguration** die folgenden Schritte aus:

   1. Stellen Sie sicher, dass für **Bucket-Typ** die Option **Allzweck** ausgewählt ist.

   1. Geben Sie für den **Bucket-Namen** einen global eindeutigen Namen ein, der den [Regeln für die Bucket-Benennung](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html) von Amazon S3 entspricht. Bucket-Namen dürfen nur aus Kleinbuchstaben, Zahlen, Punkten (.) und Bindestrichen (-) bestehen.

1. Belassen Sie alle anderen Optionen auf ihren Standardwerten und wählen Sie **Bucket erstellen** aus.

## Hochladen eines Testobjekts in Ihren Bucket
<a name="with-s3-example-upload-test-object"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps2.png)


**Hochladen eines Testobjekts**

1. Öffnen Sie die [Buckets-Seite](https://console.aws.amazon.com/s3/buckets) der Amazon-S3-Konsole und wählen Sie den Bucket aus, den Sie im vorherigen Schritt erstellt haben.

1. Klicken Sie auf **Hochladen**.

1. Wählen Sie **Dateien hinzufügen** aus und wählen Sie das Objekt, das Sie hochladen möchten. Sie können eine beliebige Datei auswählen (z. B. `HappyFace.jpg`).

1. Wählen Sie **Öffnen** und anschließend **Hochladen** aus.

Im weiteren Verlauf des Tutorials werden Sie Ihre Lambda-Funktion mit diesem Objekt testen.

## Erstellen einer Berechtigungsrichtlinie
<a name="with-s3-example-create-policy"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps3.png)


Erstellen Sie eine Berechtigungsrichtlinie, die es Lambda ermöglicht, Objekte aus einem Amazon S3 S3-Bucket abzurufen und in Amazon CloudWatch Logs zu schreiben. 

**So erstellen Sie die Richtlinie**

1. Öffnen Sie die Seite [Richtlinien](https://console.aws.amazon.com/iam/home#/policies) in der IAM-Konsole.

1. Wählen Sie **Richtlinie erstellen** aus.

1. Wählen Sie die Registerkarte **JSON** aus und kopieren Sie dann die folgende benutzerdefinierte JSON-Richtlinie in den JSON-Editor.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents",
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream"
               ],
               "Resource": "arn:aws:logs:*:*:*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": "arn:aws:s3:::*/*"
           }
       ]
   }
   ```

------

1. Wählen Sie **Next: Tags** (Weiter: Tags) aus.

1. Klicken Sie auf **Weiter: Prüfen**.

1. Geben Sie unter **Review policy (Richtlinie prüfen) ** für den Richtlinien-**Namen** **s3-trigger-tutorial** ein.

1. Wählen Sie **Richtlinie erstellen** aus.

## Erstellen einer Ausführungsrolle
<a name="with-s3-example-create-role"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps4.png)


Eine [Ausführungsrolle](lambda-intro-execution-role.md) ist eine AWS Identity and Access Management (IAM-) Rolle, die einer Lambda-Funktion Zugriffsberechtigungen AWS-Services und Ressourcen gewährt. In diesem Schritt erstellen Sie eine Ausführungsrolle unter Verwendung der Berechtigungsrichtlinie, die Sie im vorherigen Schritt erstellt haben.

**So erstellen Sie eine Ausführungsrolle und fügen Ihre benutzerdefinierte Berechtigungsrichtlinie hinzu**

1. Öffnen Sie die Seite [Roles (Rollen)](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie **Rolle erstellen** aus.

1. Wählen Sie als Typ der vertrauenswürdigen Entität **AWS -Service** und dann als Anwendungsfall **Lambda** aus.

1. Wählen Sie **Weiter** aus.

1. Geben Sie im Feld für die Richtliniensuche **s3-trigger-tutorial** ein.

1. Wählen Sie in den Suchergebnissen die von Ihnen erstellte Richtlinie (`s3-trigger-tutorial`) und dann die Option **Next** (Weiter) aus.

1. Geben Sie unter **Role details** (Rollendetails) für den **Role name** (Rollennamen) **lambda-s3-trigger-role** ein und wählen Sie dann **Create role** (Rolle erstellen) aus.

## So erstellen Sie die Lambda-Funktion:
<a name="with-s3-example-create-function"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps5.png)


Erstellen Sie mit der Python 3.14-Laufzeit eine Lambda-Funktion in der Konsole.

**So erstellen Sie die Lambda-Funktion:**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Stellen Sie sicher, dass Sie in demselben Modus arbeiten, in dem AWS-Region Sie Ihren Amazon S3 S3-Bucket erstellt haben. Sie können Ihre Region mithilfe der Dropdown-Liste oben auf dem Bildschirm ändern.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/console_region_select.png)

1. Wählen Sie **Funktion erstellen**.

1. Wählen Sie **Ohne Vorgabe erstellen** aus.

1. Führen Sie unter **Basic information** (Grundlegende Informationen) die folgenden Schritte aus:

   1. Geben Sie unter **Funktionsname** `s3-trigger-tutorial` ein.

   1. Wählen Sie für **Runtime** **Python 3.14**.

   1. Wählen Sie für **Architektur** **x86\$164** aus.

1. Gehen Sie auf der Registerkarte **Standard-Ausführungsrolle ändern** wie folgt vor:

   1. Erweitern Sie die Registerkarte und wählen Sie dann **Verwenden einer vorhandenen Rolle** aus.

   1. Wählen Sie die zuvor erstellte `lambda-s3-trigger-role` aus.

1. Wählen Sie **Funktion erstellen**.

## Bereitstellen des Funktionscodes
<a name="with-s3-example-deploy-code"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps6.png)


Dieses Tutorial verwendet die Python 3.14-Laufzeit, aber wir haben auch Beispielcodedateien für andere Laufzeiten bereitgestellt. Sie können die Registerkarte im folgenden Feld auswählen, um den Code für die gewünschte Laufzeit anzusehen.

Die Lambda-Funktion ruft den Schlüsselnamen des hochgeladenen Objekts und den Namen des Buckets aus dem `event`-Parameter ab, den sie von Amazon S3 erhält. Die Funktion verwendet dann die Methode [get\$1object](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/get_object.html) von, AWS SDK für Python (Boto3) um die Metadaten des Objekts abzurufen, einschließlich des Inhaltstyps (MIME-Typ) des hochgeladenen Objekts.

**So stellen Sie den Funktionscode bereit**

1. Wählen Sie im folgenden Feld die Registerkarte **Python** und kopieren Sie den Code.

------
#### [ .NET ]

**SDK für .NET**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Nutzen eines S3-Ereignisses mit Lambda unter Verwendung von .NET  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   ﻿using System.Threading.Tasks;
   using Amazon.Lambda.Core;
   using Amazon.S3;
   using System;
   using Amazon.Lambda.S3Events;
   using System.Web;
   
   // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
   [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
   
   namespace S3Integration
   {
       public class Function
       {
           private static AmazonS3Client _s3Client;
           public Function() : this(null)
           {
           }
   
           internal Function(AmazonS3Client s3Client)
           {
               _s3Client = s3Client ?? new AmazonS3Client();
           }
   
           public async Task<string> Handler(S3Event evt, ILambdaContext context)
           {
               try
               {
                   if (evt.Records.Count <= 0)
                   {
                       context.Logger.LogLine("Empty S3 Event received");
                       return string.Empty;
                   }
   
                   var bucket = evt.Records[0].S3.Bucket.Name;
                   var key = HttpUtility.UrlDecode(evt.Records[0].S3.Object.Key);
   
                   context.Logger.LogLine($"Request is for {bucket} and {key}");
   
                   var objectResult = await _s3Client.GetObjectAsync(bucket, key);
   
                   context.Logger.LogLine($"Returning {objectResult.Key}");
   
                   return objectResult.Key;
               }
               catch (Exception e)
               {
                   context.Logger.LogLine($"Error processing request - {e.Message}");
   
                   return string.Empty;
               }
           }
       }
   }
   ```

------
#### [ Go ]

**SDK für Go V2**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Nutzen eines S3-Ereignisses mit Lambda unter Verwendung von Go  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   package main
   
   import (
   	"context"
   	"log"
   
   	"github.com/aws/aws-lambda-go/events"
   	"github.com/aws/aws-lambda-go/lambda"
   	"github.com/aws/aws-sdk-go-v2/config"
   	"github.com/aws/aws-sdk-go-v2/service/s3"
   )
   
   func handler(ctx context.Context, s3Event events.S3Event) error {
   	sdkConfig, err := config.LoadDefaultConfig(ctx)
   	if err != nil {
   		log.Printf("failed to load default config: %s", err)
   		return err
   	}
   	s3Client := s3.NewFromConfig(sdkConfig)
   
   	for _, record := range s3Event.Records {
   		bucket := record.S3.Bucket.Name
   		key := record.S3.Object.URLDecodedKey
   		headOutput, err := s3Client.HeadObject(ctx, &s3.HeadObjectInput{
   			Bucket: &bucket,
   			Key:    &key,
   		})
   		if err != nil {
   			log.Printf("error getting head of object %s/%s: %s", bucket, key, err)
   			return err
   		}
   		log.Printf("successfully retrieved %s/%s of type %s", bucket, key, *headOutput.ContentType)
   	}
   
   	return nil
   }
   
   func main() {
   	lambda.Start(handler)
   }
   ```

------
#### [ Java ]

**SDK für Java 2.x**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Nutzen eines S3-Ereignisses mit Lambda unter Verwendung von Java  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   package example;
   
   import software.amazon.awssdk.services.s3.model.HeadObjectRequest;
   import software.amazon.awssdk.services.s3.model.HeadObjectResponse;
   import software.amazon.awssdk.services.s3.S3Client;
   
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   import com.amazonaws.services.lambda.runtime.events.S3Event;
   import com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification.S3EventNotificationRecord;
   
   import org.slf4j.Logger;
   import org.slf4j.LoggerFactory;
   
   public class Handler implements RequestHandler<S3Event, String> {
       private static final Logger logger = LoggerFactory.getLogger(Handler.class);
       @Override
       public String handleRequest(S3Event s3event, Context context) {
           try {
             S3EventNotificationRecord record = s3event.getRecords().get(0);
             String srcBucket = record.getS3().getBucket().getName();
             String srcKey = record.getS3().getObject().getUrlDecodedKey();
   
             S3Client s3Client = S3Client.builder().build();
             HeadObjectResponse headObject = getHeadObject(s3Client, srcBucket, srcKey);
   
             logger.info("Successfully retrieved " + srcBucket + "/" + srcKey + " of type " + headObject.contentType());
   
             return "Ok";
           } catch (Exception e) {
             throw new RuntimeException(e);
           }
       }
   
       private HeadObjectResponse getHeadObject(S3Client s3Client, String bucket, String key) {
           HeadObjectRequest headObjectRequest = HeadObjectRequest.builder()
                   .bucket(bucket)
                   .key(key)
                   .build();
           return s3Client.headObject(headObjectRequest);
       }
   }
   ```

------
#### [ JavaScript ]

**SDK für JavaScript (v3)**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Konsumieren eines S3-Ereignisses mit Lambda unter Verwendung JavaScript.  

   ```
   import { S3Client, HeadObjectCommand } from "@aws-sdk/client-s3";
   
   const client = new S3Client();
   
   export const handler = async (event, context) => {
   
       // Get the object from the event and show its content type
       const bucket = event.Records[0].s3.bucket.name;
       const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
   
       try {
           const { ContentType } = await client.send(new HeadObjectCommand({
               Bucket: bucket,
               Key: key,
           }));
   
           console.log('CONTENT TYPE:', ContentType);
           return ContentType;
   
       } catch (err) {
           console.log(err);
           const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
           console.log(message);
           throw new Error(message);
       }
   };
   ```
Konsumieren eines S3-Ereignisses mit Lambda unter Verwendung TypeScript.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   import { S3Event } from 'aws-lambda';
   import { S3Client, HeadObjectCommand } from '@aws-sdk/client-s3';
   
   const s3 = new S3Client({ region: process.env.AWS_REGION });
   
   export const handler = async (event: S3Event): Promise<string | undefined> => {
     // Get the object from the event and show its content type
     const bucket = event.Records[0].s3.bucket.name;
     const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
     const params = {
       Bucket: bucket,
       Key: key,
     };
     try {
       const { ContentType } = await s3.send(new HeadObjectCommand(params));
       console.log('CONTENT TYPE:', ContentType);
       return ContentType;
     } catch (err) {
       console.log(err);
       const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
       console.log(message);
       throw new Error(message);
     }
   };
   ```

------
#### [ PHP ]

**SDK für PHP**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Nutzen eines S3-Ereignisses mit Lambda unter Verwendung von PHP.  

   ```
   <?php
   
   use Bref\Context\Context;
   use Bref\Event\S3\S3Event;
   use Bref\Event\S3\S3Handler;
   use Bref\Logger\StderrLogger;
   
   require __DIR__ . '/vendor/autoload.php';
   
   
   class Handler extends S3Handler 
   {
       private StderrLogger $logger;
       public function __construct(StderrLogger $logger)
       {
           $this->logger = $logger;
       }
       
       public function handleS3(S3Event $event, Context $context) : void
       {
           $this->logger->info("Processing S3 records");
   
           // Get the object from the event and show its content type
           $records = $event->getRecords();
           
           foreach ($records as $record) 
           {
               $bucket = $record->getBucket()->getName();
               $key = urldecode($record->getObject()->getKey());
   
               try {
                   $fileSize = urldecode($record->getObject()->getSize());
                   echo "File Size: " . $fileSize . "\n";
                   // TODO: Implement your custom processing logic here
               } catch (Exception $e) {
                   echo $e->getMessage() . "\n";
                   echo 'Error getting object ' . $key . ' from bucket ' . $bucket . '. Make sure they exist and your bucket is in the same region as this function.' . "\n";
                   throw $e;
               }
           }
       }
   }
   
   $logger = new StderrLogger();
   return new Handler($logger);
   ```

------
#### [ Python ]

**SDK für Python (Boto3)**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Nutzen eines S3-Ereignisses mit Lambda unter Verwendung von Python  

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   import json
   import urllib.parse
   import boto3
   
   print('Loading function')
   
   s3 = boto3.client('s3')
   
   
   def lambda_handler(event, context):
       #print("Received event: " + json.dumps(event, indent=2))
   
       # Get the object from the event and show its content type
       bucket = event['Records'][0]['s3']['bucket']['name']
       key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
       try:
           response = s3.get_object(Bucket=bucket, Key=key)
           print("CONTENT TYPE: " + response['ContentType'])
           return response['ContentType']
       except Exception as e:
           print(e)
           print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
           raise e
   ```

------
#### [ Ruby ]

**SDK für Ruby**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Nutzen eines S3-Ereignisses mit Lambda unter Verwendung von Ruby.  

   ```
   require 'json'
   require 'uri'
   require 'aws-sdk'
   
   puts 'Loading function'
   
   def lambda_handler(event:, context:)
     s3 = Aws::S3::Client.new(region: 'region') # Your AWS region
     # puts "Received event: #{JSON.dump(event)}"
   
     # Get the object from the event and show its content type
     bucket = event['Records'][0]['s3']['bucket']['name']
     key = URI.decode_www_form_component(event['Records'][0]['s3']['object']['key'], Encoding::UTF_8)
     begin
       response = s3.get_object(bucket: bucket, key: key)
       puts "CONTENT TYPE: #{response.content_type}"
       return response.content_type
     rescue StandardError => e
       puts e.message
       puts "Error getting object #{key} from bucket #{bucket}. Make sure they exist and your bucket is in the same region as this function."
       raise e
     end
   end
   ```

------
#### [ Rust ]

**SDK für Rust**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Nutzen eines S3-Ereignisses mit Lambda unter Verwendung von Rust  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   use aws_lambda_events::event::s3::S3Event;
   use aws_sdk_s3::{Client};
   use lambda_runtime::{run, service_fn, Error, LambdaEvent};
   
   
   /// Main function
   #[tokio::main]
   async fn main() -> Result<(), Error> {
       tracing_subscriber::fmt()
           .with_max_level(tracing::Level::INFO)
           .with_target(false)
           .without_time()
           .init();
   
       // Initialize the AWS SDK for Rust
       let config = aws_config::load_from_env().await;
       let s3_client = Client::new(&config);
   
       let res = run(service_fn(|request: LambdaEvent<S3Event>| {
           function_handler(&s3_client, request)
       })).await;
   
       res
   }
   
   async fn function_handler(
       s3_client: &Client,
       evt: LambdaEvent<S3Event>
   ) -> Result<(), Error> {
       tracing::info!(records = ?evt.payload.records.len(), "Received request from SQS");
   
       if evt.payload.records.len() == 0 {
           tracing::info!("Empty S3 event received");
       }
   
       let bucket = evt.payload.records[0].s3.bucket.name.as_ref().expect("Bucket name to exist");
       let key = evt.payload.records[0].s3.object.key.as_ref().expect("Object key to exist");
   
       tracing::info!("Request is for {} and object {}", bucket, key);
   
       let s3_get_object_result = s3_client
           .get_object()
           .bucket(bucket)
           .key(key)
           .send()
           .await;
   
       match s3_get_object_result {
           Ok(_) => tracing::info!("S3 Get Object success, the s3GetObjectResult contains a 'body' property of type ByteStream"),
           Err(_) => tracing::info!("Failure with S3 Get Object request")
       }
   
       Ok(())
   }
   ```

------

1. Fügen Sie den Code im **Code-Quell**bereich der Lambda-Konsole in den Code-Editor ein und ersetzen Sie dabei den von Lambda erstellten Code.

1. Wählen Sie im Abschnitt **DEPLOY** die Option **Deploy** aus, um den Code Ihrer Funktion zu aktualisieren:  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

## Erstellen des Amazon-S3-Auslösers
<a name="with-s3-example-create-trigger"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps7.png)


**Erstellen des Amazon-S3-Auslösers**

1. Wählen Sie im Bereich **Function overview (Funktionsübersicht)** die Option **Add trigger (Auslöser hinzufügen)**.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/overview-trigger.png)

1. Wählen Sie **S3** aus.

1. Wählen Sie unter **Bucket** den Bucket aus, den Sie zuvor im Tutorial erstellt haben.

1. Vergewissern Sie sich, dass unter **Ereignistypen** die Option **Alle Ereignisse zur Objekterstellung** ausgewählt ist.

1. Aktivieren Sie unter **Rekursiver Aufruf** das Kontrollkästchen, um zu bestätigen, dass die Verwendung desselben Amazon-S3-Buckets für die Ein- und Ausgabe nicht empfohlen wird.

1. Wählen Sie **Hinzufügen** aus.

**Anmerkung**  
Wenn Sie einen Amazon-S3-Trigger für eine Lambda-Funktion mithilfe der Lambda-Konsole erstellen, konfiguriert Amazon S3 eine [Ereignisbenachrichtigung](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventNotifications.html) für den von Ihnen angegebenen Bucket. Bevor diese Ereignisbenachrichtigung konfiguriert wird, führt Amazon S3 eine Reihe von Prüfungen durch, um zu bestätigen, dass das Ereignisziel existiert und die erforderlichen IAM-Richtlinien hat. Amazon S3 führt diese Tests auch bei allen anderen für diesen Bucket konfigurierten Ereignisbenachrichtigungen durch.  
Wenn der Bucket zuvor Ereignisziele für Ressourcen konfiguriert hat, die nicht mehr existieren oder für Ressourcen, die nicht über die erforderlichen Berechtigungsrichtlinien verfügen, kann Amazon S3 aufgrund dieser Prüfung keine neue Ereignisbenachrichtigung erstellen. Es wird die folgende Fehlermeldung angezeigt, die besagt, dass Ihr Auslöser nicht erstellt werden konnte:  

```
An error occurred when creating the trigger: Unable to validate the following destination configurations.
```
Dieser Fehler kann auftreten, wenn Sie zuvor einen Auslöser für eine andere Lambda-Funktion konfiguriert haben, die denselben Bucket verwendet und Sie die Funktion inzwischen gelöscht oder ihre Berechtigungsrichtlinien geändert haben.

## Testen Ihrer Lambda-Funktion mit einem Dummy-Ereignis
<a name="with-s3-example-test-dummy-event"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps8.png)


**So testen Sie die Lambda-Funktion mit einem Dummy-Ereignis**

1. Wählen Sie auf der Konsolenseite für Ihre Funktion die Registerkarte **Test** aus.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/test-tab.png)

1. Geben Sie für **Event name (Ereignisname)** `MyTestEvent` ein.

1. Fügen Sie im **Event-JSON** das folgende Testereignis ein. Achten Sie darauf, diese Werte zu ersetzen:
   + Ersetzen Sie `us-east-1` durch die Region, in der Sie den Amazon-S3-Bucket erstellt haben.
   + Ersetzen Sie beide Vorkommen von `amzn-s3-demo-bucket` durch den Namen Ihres eigenen Amazon-S3-Buckets.
   + Ersetzen Sie `test%2FKey` durch den Namen des Testobjekts, das Sie zuvor in Ihren Bucket hochgeladen haben (z. B.`HappyFace.jpg`).

   ```
   {
     "Records": [
       {
         "eventVersion": "2.0",
         "eventSource": "aws:s3",
         "awsRegion": "us-east-1",
         "eventTime": "1970-01-01T00:00:00.000Z",
         "eventName": "ObjectCreated:Put",
         "userIdentity": {
           "principalId": "EXAMPLE"
         },
         "requestParameters": {
           "sourceIPAddress": "127.0.0.1"
         },
         "responseElements": {
           "x-amz-request-id": "EXAMPLE123456789",
           "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
         },
         "s3": {
           "s3SchemaVersion": "1.0",
           "configurationId": "testConfigRule",
           "bucket": {
             "name": "amzn-s3-demo-bucket",
             "ownerIdentity": {
               "principalId": "EXAMPLE"
             },
             "arn": "arn:aws:s3:::amzn-s3-demo-bucket"
           },
           "object": {
             "key": "test%2Fkey",
             "size": 1024,
             "eTag": "0123456789abcdef0123456789abcdef",
             "sequencer": "0A1B2C3D4E5F678901"
           }
         }
       }
     ]
   }
   ```

1. Wählen Sie **Speichern**.

1. Wählen Sie **Test** aus.

1. Wenn Ihre Funktion erfolgreich ausgeführt wird, wird auf der Registerkarte **Ausführungsergebnisse** eine Ausgabe angezeigt, die der folgenden ähnelt.

   ```
   Response
   "image/jpeg"
   
   Function Logs
   START RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 Version: $LATEST
   2021-02-18T21:40:59.280Z    12b3cae7-5f4e-415e-93e6-416b8f8b66e6    INFO    INPUT BUCKET AND KEY:  { Bucket: 'amzn-s3-demo-bucket', Key: 'HappyFace.jpg' }
   2021-02-18T21:41:00.215Z    12b3cae7-5f4e-415e-93e6-416b8f8b66e6    INFO    CONTENT TYPE: image/jpeg
   END RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6
   REPORT RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6    Duration: 976.25 ms    Billed Duration: 977 ms    Memory Size: 128 MB    Max Memory Used: 90 MB    Init Duration: 430.47 ms        
   
   Request ID
   12b3cae7-5f4e-415e-93e6-416b8f8b66e6
   ```

### Testen der Lambda-Funktion mit dem Amazon-S3-Auslöser
<a name="with-s3-example-test-s3-trigger"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps9.png)


Um Ihre Funktion mit dem konfigurierten Auslöser zu testen, können Sie unter Verwendung der Konsole ein Objekt in Ihren Amazon-S3-Bucket hochladen. Um zu überprüfen, ob Ihre Lambda-Funktion wie erwartet ausgeführt wurde, verwenden Sie CloudWatch Logs, um die Ausgabe Ihrer Funktion einzusehen.

**So laden Sie Objekte in Ihren Amazon-S3-Bucket hoch**

1. Öffnen Sie die [Buckets](https://console.aws.amazon.com/s3/buckets)-Seite der Amazon-S3-Konsole und wählen Sie den Bucket aus, den Sie zuvor erstellt haben.

1. Klicken Sie auf **Upload**.

1. Wählen Sie **Dateien hinzufügen** aus und wählen Sie mit der Dateiauswahl ein Objekt aus, das Sie hochladen möchten. Bei diesem Objekt kann es sich um eine beliebige von Ihnen ausgewählte Datei handeln.

1. Wählen Sie **Öffnen** und anschließend **Hochladen** aus.

**Um den Funktionsaufruf mithilfe von Logs zu überprüfen CloudWatch**

1. Öffnen Sie die [CloudWatch-Konsole](https://console.aws.amazon.com/cloudwatch/home).

1. Stellen Sie sicher, dass Sie in derselben Umgebung arbeiten, in der AWS-Region Sie Ihre Lambda-Funktion erstellt haben. Sie können Ihre Region mithilfe der Dropdown-Liste oben auf dem Bildschirm ändern.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/console_region_select.png)

1. Wählen Sie **Protokolle** und anschließend **Protokollgruppen** aus.

1. Wählen Sie die Protokollgruppe für Ihre Funktion (`/aws/lambda/s3-trigger-tutorial`) aus.

1. Wählen Sie im Bereich **Protokollstreams** den neuesten Protokollstream aus.

1. Wenn Ihre Funktion als Reaktion auf Ihren Amazon-S3-Auslöser korrekt aufgerufen wurde, erhalten Sie eine Ausgabe, die der folgenden ähnelt. Welchen `CONTENT TYPE` Sie sehen, hängt von der Art der Datei ab, die Sie in Ihren Bucket hochgeladen haben.

   ```
   2022-05-09T23:17:28.702Z	0cae7f5a-b0af-4c73-8563-a3430333cc10	INFO	CONTENT TYPE: image/jpeg
   ```

## Bereinigen Ihrer Ressourcen
<a name="cleanup"></a>

Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Durch das Löschen von AWS Ressourcen, die Sie nicht mehr verwenden, vermeiden Sie unnötige Kosten für Ihre AWS-Konto.

**So löschen Sie die Lambda-Funktion:**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion aus, die Sie erstellt haben.

1. Wählen Sie **Aktionen**, **Löschen** aus.

1. Geben Sie **confirm** in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie die Ausführungsrolle**

1. Öffnen Sie die Seite [Roles](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie die von Ihnen erstellte Ausführungsrolle aus.

1. Wählen Sie **Löschen** aus.

1. Geben Sie den Namen der Rolle in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie den S3-Bucket:**

1. Öffnen Sie die [Amazon S3-Konsole](https://console.aws.amazon.com//s3/home#).

1. Wählen Sie den Bucket aus, den Sie erstellt haben.

1. Wählen Sie **Löschen** aus.

1. Geben Sie den Namen des Buckets in das Texteingabefeld ein.

1. Wählen Sie **Bucket löschen** aus.

## Nächste Schritte
<a name="next-steps"></a>

In [Tutorial: Verwenden eines Amazon-S3-Auslösers zum Erstellen von Miniaturbildern](with-s3-tutorial.md) ruft der Amazon-S3-Auslöser eine Funktion auf, die für jede Bilddatei, die in einen Bucket hochgeladen wird, ein Miniaturbild erstellt. Dieses Tutorial erfordert ein gewisses Maß AWS an Wissen über Lambda-Domänen. Es zeigt, wie Ressourcen mithilfe von AWS Command Line Interface (AWS CLI) erstellt werden und wie ein Bereitstellungspaket für das ZIP-Dateiarchiv für die Funktion und ihre Abhängigkeiten erstellt wird.

# Tutorial: Verwenden eines Amazon-S3-Auslösers zum Erstellen von Miniaturbildern
<a name="with-s3-tutorial"></a>

In diesem Tutorial wird eine Lambda-Funktion erstellt und konfiguriert, die die Größe von Bildern anpasst, die einem Amazon Simple Storage Service (Amazon S3)-Bucket hinzugefügt werden. Wenn Sie Ihrem Bucket eine Bilddatei hinzufügen, ruft Amazon S3 Ihre Lambda-Funktion auf. Die Funktion erstellt daraufhin eine Miniaturversion des Bilds und gibt sie an einen anderen Amazon-S3-Bucket aus.

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_resources.png)


Führen Sie für dieses Tutorial die folgenden Schritte aus:

1. Erstellen Sie Quell- und Ziel-Buckets für Amazon S3 und laden Sie ein Beispielbild hoch.

1. Erstellen Sie eine Lambda-Funktion, die die Größe eines Bildes anpasst und eine Miniaturansicht an einen Amazon-S3-Bucket ausgibt.

1. Konfigurieren Sie einen Lambda-Auslöser, der Ihre Funktion aufruft, wenn Objekte in Ihren Quell-Bucket hochgeladen werden.

1. Testen Sie Ihre Funktion zunächst mit einem Dummy-Ereignis und anschließend durch Hochladen eines Bilds in Ihren Quell-Bucket.

Diese Schritte zeigen, wie Sie Lambda verwenden, um eine Dateiverarbeitungsaufgabe für Objekte auszuführen, die einem Amazon-S3-Bucket hinzugefügt werden. Sie können dieses Tutorial mit dem AWS Command Line Interface (AWS CLI) oder dem abschließen AWS-Managementkonsole.

Ein einfacheres Beispiel, das zeigt, wie Sie einen Amazon-S3-Auslöser für Lambda konfigurieren, finden Sie unter [Tutorial: Verwenden eines Amazon-S3-Auslösers zum Aufrufen einer Lambda-Funktion](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html).

**Topics**
+ [

## Voraussetzungen
](#with-s3-example-prereqs)
+ [

## Erstellen von zwei Amazon-S3-Buckets
](#with-s3-tutorial-prepare-create-buckets)
+ [

## Hochladen eines Testbilds in Ihren Quell-Bucket
](#with-s3-tutorial-test-image)
+ [

## Erstellen einer Berechtigungsrichtlinie
](#with-s3-tutorial-create-policy)
+ [

## Erstellen einer Ausführungsrolle
](#with-s3-tutorial-create-execution-role)
+ [

## Erstellen des Bereitstellungspakets für die Funktion
](#with-s3-tutorial-create-function-package)
+ [

## So erstellen Sie die Lambda-Funktion:
](#with-s3-tutorial-create-function-createfunction)
+ [

## Konfigurieren von Amazon S3 zum Aufrufen der Funktion
](#with-s3-tutorial-configure-s3-trigger)
+ [

## Testen Ihrer Lambda-Funktion mit einem Dummy-Ereignis
](#with-s3-tutorial-dummy-test)
+ [

## Testen Ihrer Funktion mit dem Amazon-S3-Auslöser
](#with-s3-tutorial-test-s3)
+ [

## Bereinigen Ihrer Ressourcen
](#s3-tutorial-cleanup)

## Voraussetzungen
<a name="with-s3-example-prereqs"></a>

Wenn Sie den verwenden möchten, AWS CLI um das Tutorial abzuschließen, installieren Sie die [neueste Version von AWS Command Line Interface]().

Für Ihren Lambda-Funktionscode können Sie Python, Node.js oder Java verwenden. Installieren Sie die Tools zur Sprachunterstützung und einen Paketmanager für die gewünschte Sprache. 

### Installieren Sie das AWS Command Line Interface
<a name="install_aws_cli"></a>

Wenn Sie das noch nicht installiert haben AWS Command Line Interface, folgen Sie den Schritten unter [Installieren oder Aktualisieren der neuesten Version von AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), um es zu installieren.

Das Tutorial erfordert zum Ausführen von Befehlen ein Befehlszeilenterminal oder eine Shell. Verwenden Sie unter Linux und macOS Ihre bevorzugte Shell und Ihren bevorzugten Paketmanager.

**Anmerkung**  
In Windows werden einige Bash-CLI-Befehle, die Sie häufig mit Lambda verwenden (z. B. `zip`), von den integrierten Terminals des Betriebssystems nicht unterstützt. Um eine in Windows integrierte Version von Ubuntu und Bash zu erhalten, [installieren Sie das Windows-Subsystem für Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). 

## Erstellen von zwei Amazon-S3-Buckets
<a name="with-s3-tutorial-prepare-create-buckets"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps1.png)


Erstellen Sie zunächst zwei Amazon-S3-Buckets. Der erste Bucket ist der Quell-Bucket, in den Sie Ihre Bilder hochladen. Der zweite Bucket wird von Lambda verwendet, um das verkleinerte Miniaturbild zu speichern, wenn Sie Ihre Funktion aufrufen.

------
#### [ AWS-Managementkonsole ]

**So erstellen Sie die Amazon-S3-Buckets (Konsole)**

1. Öffnen Sie die [Amazon-S3-Konsole](https://console.aws.amazon.com/s3) und wählen Sie die Seite **Allzweck-Buckets** aus.

1. Wählen Sie den Ort aus, der Ihrem geografischen Standort AWS-Region am nächsten liegt. Sie können Ihre Region mithilfe der Dropdown-Liste am oberen Bildschirmrand ändern. Später im Tutorial müssen Sie eine Lambda-Funktion in derselben Region erstellen.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/console_region_select.png)

1. Wählen Sie **Create Bucket** (Bucket erstellen) aus.

1. Führen Sie unter **Allgemeine Konfiguration** die folgenden Schritte aus:

   1. Stellen Sie sicher, dass für **Bucket-Typ** die Option **Allzweck** ausgewählt ist.

   1. Geben Sie für den **Bucket-Namen** einen global eindeutigen Namen ein, der den [Regeln für die Bucket-Benennung](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html) von Amazon S3 entspricht. Bucket-Namen dürfen nur aus Kleinbuchstaben, Zahlen, Punkten (.) und Bindestrichen (-) bestehen.

1. Belassen Sie alle anderen Optionen auf ihren Standardwerten und wählen Sie **Bucket erstellen** aus.

1. Wiederholen Sie die Schritte 1 bis 5, um Ihren Ziel-Bucket zu erstellen. Geben Sie unter **Bucket-Name** den Namen `amzn-s3-demo-source-bucket-resized` ein. `amzn-s3-demo-source-bucket` ist hierbei der Name des Quell-Buckets, den Sie soeben erstellt haben.

------
#### [ AWS CLI ]

**So erstellen Sie die Amazon-S3-Buckets (AWS CLI)**

1. Führen Sie den folgenden CLI-Befehl aus, um Ihren Quell-Bucket zu erstellen. Der gewählte Name für Ihren Bucket muss global eindeutig sein und den [Regeln für die Benennung von Buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html) für Amazon S3 entsprechen. Namen dürfen nur Kleinbuchstaben, Zahlen, Punkte (.) und Bindestriche (-) enthalten. Wählen Sie für `region` und `LocationConstraint` die [AWS-Region](https://docs.aws.amazon.com/general/latest/gr/lambda-service.html) aus, die Ihrem geografischen Standort am nächsten ist.

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-source-bucket --region us-east-1 \
   --create-bucket-configuration LocationConstraint=us-east-1
   ```

   Später im Tutorial müssen Sie Ihre Lambda-Funktion im selben Verzeichnis AWS-Region wie in Ihrem Quell-Bucket erstellen. Notieren Sie sich also die Region, die Sie ausgewählt haben.

1. Führen Sie den folgenden Befehl aus, um Ihren Ziel-Bucket zu erstellen. Verwenden Sie für den Bucket-Namen `amzn-s3-demo-source-bucket-resized`. `amzn-s3-demo-source-bucket` ist hierbei der Name des Quell-Buckets, den Sie in Schritt 1 erstellt haben. Wählen Sie für `region` und dasselbe aus`LocationConstraint`, das AWS-Region Sie zur Erstellung Ihres Quell-Buckets verwendet haben.

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-source-bucket-resized --region us-east-1 \
   --create-bucket-configuration LocationConstraint=us-east-1
   ```

------

## Hochladen eines Testbilds in Ihren Quell-Bucket
<a name="with-s3-tutorial-test-image"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps2.png)


Später im Tutorial testen Sie Ihre Lambda-Funktion, indem Sie sie mit der AWS CLI oder der Lambda-Konsole aufrufen. Damit Sie sich vergewissern können, dass Ihre Funktion ordnungsgemäß funktioniert, muss Ihr Quell-Bucket ein Testbild enthalten. Bei diesem Bild kann es sich um eine beliebige JPG- oder PNG-Datei handeln.

------
#### [ AWS-Managementkonsole ]

**So laden Sie ein Testbild in Ihren Quell-Bucket hoch (Konsole)**

1. Öffnen Sie die Seite [Buckets](https://console.aws.amazon.com/s3/buckets) der Amazon-S3-Konsole.

1. Wählen Sie den Quell-Bucket aus, den Sie im vorherigen Schritt erstellt haben.

1. Klicken Sie auf **Hochladen**.

1. Wählen Sie **Dateien hinzufügen** aus und wählen Sie mit der Dateiauswahl das Objekt aus, das Sie hochladen möchten.

1. Wählen Sie **Öffnen** und anschließend **Hochladen** aus.

------
#### [ AWS CLI ]

**So laden Sie ein Testbild in Ihren Quell-Bucket hoch (AWS CLI)**
+ Führen Sie in dem Verzeichnis, das das hochzuladende Bild enthält, den folgenden CLI-Befehl aus. Ersetzen Sie dabei den Parameter `--bucket` durch den Namen Ihres Quell-Buckets. Verwenden Sie für die Parameter `--key` und `--body` den Dateinamen Ihres Testbilds.

  ```
  aws s3api put-object --bucket amzn-s3-demo-source-bucket --key HappyFace.jpg --body ./HappyFace.jpg
  ```

------

## Erstellen einer Berechtigungsrichtlinie
<a name="with-s3-tutorial-create-policy"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps3.png)


Im ersten Schritt der Erstellung Ihrer Lambda-Funktion wird eine Berechtigungsrichtlinie erstellt. Diese Richtlinie gibt Ihrer Funktion die Berechtigungen, die sie für den Zugriff auf andere Ressourcen benötigt. AWS In diesem Tutorial gewährt die Richtlinie Lambda Lese- und Schreibberechtigungen für Amazon S3 S3-Buckets und ermöglicht es ihm, in Amazon CloudWatch Logs zu schreiben.

------
#### [ AWS-Managementkonsole ]

**So erstellen Sie die Richtlinie (Konsole)**

1. Öffnen Sie die Seite [Richtlinien](https://console.aws.amazon.com/iamv2/home#policies) der AWS Identity and Access Management (IAM-) Konsole.

1. Wählen Sie **Richtlinie erstellen** aus.

1. Wählen Sie die Registerkarte **JSON** aus und kopieren Sie dann die folgende benutzerdefinierte JSON-Richtlinie in den JSON-Editor.  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents",
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream"
               ],
               "Resource": "arn:aws:logs:*:*:*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": "arn:aws:s3:::*/*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject"
               ],
               "Resource": "arn:aws:s3:::*/*"
           }
       ]
   }
   ```

1. Wählen Sie **Weiter** aus.

1. Geben Sie unter **Richtliniendetails** für den **Richtliniennamen** `LambdaS3Policy` ein.

1. Wählen Sie **Richtlinie erstellen** aus.

------
#### [ AWS CLI ]

**So erstellen Sie die Richtlinie (AWS CLI)**

1. Speichern Sie den folgenden JSON-Code in einer Datei mit dem Namen `policy.json`:  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents",
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream"
               ],
               "Resource": "arn:aws:logs:*:*:*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": "arn:aws:s3:::*/*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject"
               ],
               "Resource": "arn:aws:s3:::*/*"
           }
       ]
   }
   ```

1. Führen Sie in dem Verzeichnis, in dem Sie das JSON-Richtliniendokument gespeichert haben, den folgenden CLI-Befehl aus:

   ```
   aws iam create-policy --policy-name LambdaS3Policy --policy-document file://policy.json
   ```

------

## Erstellen einer Ausführungsrolle
<a name="with-s3-tutorial-create-execution-role"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps4.png)


Eine Ausführungsrolle ist eine IAM-Rolle, die einer Lambda-Funktion Zugriff AWS-Services und Ressourcen gewährt. Um Ihrer Funktion Lese- und Schreibzugriff auf einen Amazon-S3-Bucket zu erteilen, fügen Sie die Berechtigungsrichtlinie an, die Sie im vorherigen Schritt erstellt haben.

------
#### [ AWS-Managementkonsole ]

**So erstellen Sie eine Ausführungsrolle und fügen Ihre Berechtigungsrichtlinie hinzu (Konsole)**

1. Öffnen Sie die Seite [Rollen](https://console.aws.amazon.com/iamv2/home#roles) der (IAM-)Konsole.

1. Wählen Sie **Rolle erstellen** aus.

1. Wählen Sie unter **Vertrauenswürdiger Entitätstyp** die Option **AWS-Service** und unter **Anwendungsfall** die Option **Lambda** aus.

1. Wählen Sie **Weiter** aus.

1. Fügen Sie die Berechtigungsrichtlinie hinzu, die Sie im vorherigen Schritt erstellt haben:

   1. Geben Sie im Feld für die Richtliniensuche `LambdaS3Policy` ein.

   1. Aktivieren Sie in den Suchergebnissen das Kontrollkästchen für `LambdaS3Policy`.

   1. Wählen Sie **Weiter** aus.

1. Geben Sie unter **Rollendetails** im Feld **Rollenname** den Namen `LambdaS3Role` ein.

1. Wählen Sie **Rolle erstellen** aus.

------
#### [ AWS CLI ]

**So erstellen Sie eine Ausführungsrolle und fügen Ihre Berechtigungsrichtlinie an (AWS CLI)**

1. Speichern Sie den folgenden JSON-Code in einer Datei mit dem Namen `trust-policy.json`: Diese Vertrauensrichtlinie ermöglicht es Lambda, die Berechtigungen der Rolle zu verwenden, indem dem Dienstprinzipal die `lambda.amazonaws.com` Erlaubnis erteilt wird, die `AssumeRole` Aktion AWS -Security-Token-Service (AWS STS) aufzurufen.  
****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "lambda.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

1. Führen Sie in dem Verzeichnis, in dem Sie das JSON-Vertrauensrichtliniendokument gespeichert haben, den folgenden CLI-Befehl aus, um die Ausführungsrolle zu erstellen:

   ```
   aws iam create-role --role-name LambdaS3Role --assume-role-policy-document file://trust-policy.json
   ```

1. Führen Sie den folgenden CLI-Befehl aus, um die im vorherigen Schritt erstellte Berechtigungsrolle anzufügen. Ersetzen Sie die AWS-Konto Nummer im ARN der Police durch Ihre eigene Kontonummer.

   ```
   aws iam attach-role-policy --role-name LambdaS3Role --policy-arn arn:aws:iam::123456789012:policy/LambdaS3Policy
   ```

------

## Erstellen des Bereitstellungspakets für die Funktion
<a name="with-s3-tutorial-create-function-package"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps5.png)


Um Ihre Funktion zu erstellen, erstellen Sie ein *Bereitstellungspaket*, das Ihren Funktionscode und die zugehörigen Abhängigkeiten enthält. Bei der hier verwendeten Funktion `CreateThumbnail` verwendet Ihr Funktionscode eine separate Bibliothek für die Anpassung der Bildgröße. Folgen Sie den Anweisungen für die von Ihnen gewählte Sprache, um ein Bereitstellungspaket zu erstellen, das die erforderliche Bibliothek enthält.

------
#### [ Node.js ]

**So erstellen Sie das Bereitstellungspaket (Node.js)**

1. Erstellen Sie ein Verzeichnis namens `lambda-s3` für Ihren Funktionscode und die Abhängigkeiten und navigieren Sie dorthin.

   ```
   mkdir lambda-s3
   cd lambda-s3
   ```

1. Erstellen Sie ein neues Node.js-Projekt mit `npm`. Um die im interaktiven Erlebnis bereitgestellten Standardoptionen zu akzeptieren, drücken Sie `Enter`.

   ```
   npm init
   ```

1. Speichern Sie den folgenden Funktionscode in einer lokalen Datei namens `index.mjs`: Stellen Sie sicher, dass Sie `us-east-1` durch das AWS-Region ersetzen, in dem Sie Ihre eigenen Quell- und Ziel-Buckets erstellt haben.

   ```
   // dependencies
   import { S3Client, GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3';
   
   import { Readable } from 'stream';
   
   import sharp from 'sharp';
   import util from 'util';
   
   
   // create S3 client
   const s3 = new S3Client({region: 'us-east-1'});
   
   // define the handler function
   export const handler = async (event, context) => {
   
   // Read options from the event parameter and get the source bucket
   console.log("Reading options from event:\n", util.inspect(event, {depth: 5}));
     const srcBucket = event.Records[0].s3.bucket.name;
     
   // Object key may have spaces or unicode non-ASCII characters
   const srcKey    = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
   const dstBucket = srcBucket + "-resized";
   const dstKey    = "resized-" + srcKey;
   
   // Infer the image type from the file suffix
   const typeMatch = srcKey.match(/\.([^.]*)$/);
   if (!typeMatch) {
     console.log("Could not determine the image type.");
     return;
   }
   
   // Check that the image type is supported
   const imageType = typeMatch[1].toLowerCase();
   if (imageType != "jpg" && imageType != "png") {
     console.log(`Unsupported image type: ${imageType}`);
     return;
   }
   
   // Get the image from the source bucket. GetObjectCommand returns a stream.
   try {
     const params = {
       Bucket: srcBucket,
       Key: srcKey
     };
     var response = await s3.send(new GetObjectCommand(params));
     var stream = response.Body;
     
   // Convert stream to buffer to pass to sharp resize function.
     if (stream instanceof Readable) {
       var content_buffer = Buffer.concat(await stream.toArray());
       
     } else {
       throw new Error('Unknown object stream type');
     }
   
   
   } catch (error) {
     console.log(error);
     return;
   }
   
     
   // set thumbnail width. Resize will set the height automatically to maintain aspect ratio.
   const width  = 200;
   
   // Use the sharp module to resize the image and save in a buffer.
   try {    
     var output_buffer = await sharp(content_buffer).resize(width).toBuffer();
   
   } catch (error) {
     console.log(error);
     return;
   }
   
   // Upload the thumbnail image to the destination bucket
   try {
     const destparams = {
       Bucket: dstBucket,
       Key: dstKey,
       Body: output_buffer,
       ContentType: "image"
     };
   
     const putResult = await s3.send(new PutObjectCommand(destparams));
   
     } catch (error) {
       console.log(error);
       return;
     }
   
     console.log('Successfully resized ' + srcBucket + '/' + srcKey +
       ' and uploaded to ' + dstBucket + '/' + dstKey);
     };
   ```

1. Installieren Sie die Sharp-Bibliothek mithilfe von npm im Verzeichnis `lambda-s3`. Beachten Sie, dass die neueste Version von Sharp (0.33) nicht mit Lambda kompatibel ist. Installieren Sie für dieses Tutorial daher Version 0.32.6.

   ```
   npm install sharp@0.32.6
   ```

   Der npm-Befehl `install` erstellt ein Verzeichnis namens `node_modules` für Ihre Module. Nach diesem Schritt sollte Ihre Verzeichnisstruktur wie folgt aussehen:

   ```
   lambda-s3
   |- index.mjs
   |- node_modules
   |  |- base64js
   |  |- bl
   |  |- buffer
   ...
   |- package-lock.json
   |- package.json
   ```

1. Erstellen Sie ein ZIP-Bereitstellungspaket, das Ihren Funktionscode und die zugehörigen Abhängigkeiten enthält. Führen Sie unter macOS oder Linux den folgenden Befehl aus:

   ```
   zip -r function.zip .
   ```

   Verwenden Sie unter Windows Ihr bevorzugtes ZIP-Programm, um eine ZIP-Datei zu erstellen. Achten Sie darauf, dass sich die Dateien `index.mjs`, `package.json` und `package-lock.json` und das Verzeichnis `node_modules` im Stammverzeichnis der ZIP-Datei befinden.

------
#### [ Python ]

**So erstellen Sie das Bereitstellungspaket (Python)**

1. Speichern Sie den Beispielcode als Datei mit dem Namen `lambda_function.py`.

   ```
   import boto3
   import os
   import sys
   import uuid
   from urllib.parse import unquote_plus
   from PIL import Image
   import PIL.Image
               
   s3_client = boto3.client('s3')
               
   def resize_image(image_path, resized_path):
     with Image.open(image_path) as image:
       image.thumbnail(tuple(x / 2 for x in image.size))
       image.save(resized_path)
               
   def lambda_handler(event, context):
     for record in event['Records']:
       bucket = record['s3']['bucket']['name']
       key = unquote_plus(record['s3']['object']['key'])
       tmpkey = key.replace('/', '')
       download_path = '/tmp/{}{}'.format(uuid.uuid4(), tmpkey)
       upload_path = '/tmp/resized-{}'.format(tmpkey)
       s3_client.download_file(bucket, key, download_path)
       resize_image(download_path, upload_path)
       s3_client.upload_file(upload_path, '{}-resized'.format(bucket), 'resized-{}'.format(key))
   ```

1. Erstellen Sie in dem Verzeichnis, in dem Sie auch Ihre `lambda_function.py`-Datei erstellt haben, ein neues Verzeichnis mit dem Namen `package` und installieren Sie die Bibliothek [Pillow (PIL)](https://pypi.org/project/Pillow/) sowie das AWS SDK für Python (Boto3). Die Lambda-Python-Laufzeit enthält zwar eine Version des Boto3 SDK, es empfiehlt sich jedoch, dem Bereitstellungspaket alle Abhängigkeiten Ihrer Funktion hinzuzufügen, auch wenn sie in der Laufzeit enthalten sind. Weitere Informationen finden Sie in der [Laufzeitabhängigkeiten in Python](https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies).

   ```
   mkdir package
   pip install \
   --platform manylinux2014_x86_64 \
   --target=package \
   --implementation cp \
   --python-version 3.12 \
   --only-binary=:all: --upgrade \
   pillow boto3
   ```

   Die Pillow-Bibliothek enthält Code in C/C\$1\$1. Mithilfe der Optionen `--platform manylinux_2014_x86_64` und `--only-binary=:all:` lädt pip eine Version von Pillow herunter und installiert sie, die vorkompilierte Binärdateien enthält, die mit dem Betriebssystem Amazon Linux 2 kompatibel sind. Dadurch wird sichergestellt, dass Ihr Bereitstellungspaket in der Lambda-Ausführungsumgebung funktioniert, unabhängig vom Betriebssystem und der Architektur Ihrer lokalen Build-Maschine.

1. Erstellen Sie eine ZIP-Datei, die Ihren Anwendungscode sowie die Pillow- und die Boto3-Bibliothek enthält. Führen Sie unter Linux oder MacOS die folgenden Befehle über Ihre Befehlszeilenschnittstelle aus:

   ```
   cd package
   zip -r ../lambda_function.zip .
   cd ..
   zip lambda_function.zip lambda_function.py
   ```

    Verwenden Sie unter Windows Ihr bevorzugtes ZIP-Tool, um die `lambda_function.zip`-Datei zu erstellen. Achten Sie darauf, dass sich die Datei `lambda_function.py` und die Ordner, die Ihre Abhängigkeiten enthalten, im Stammverzeichnis der ZIP-Datei befinden.

Sie können Ihr Bereitstellungspaket auch in einer virtuellen Python-Umgebung erstellen. Siehe [Arbeiten mit ZIP-Dateiarchiven und Python-Lambda-Funktionen](python-package.md)

------

## So erstellen Sie die Lambda-Funktion:
<a name="with-s3-tutorial-create-function-createfunction"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps6.png)


Sie können Ihre Lambda-Funktion entweder mit der AWS CLI oder der Lambda-Konsole erstellen. Folgen Sie den Anweisungen für die von Ihnen gewählte Sprache, um die Funktion zu erstellen.

------
#### [ AWS-Managementkonsole ]

**So erstellen Sie die Funktion (Konsole)**

Wenn Sie Ihre Lambda-Funktion über die Konsole erstellen möchten, erstellen Sie zunächst eine Basisfunktion, die etwas Hello-World-Code enthält. Anschließend ersetzen Sie diesen Code durch Ihren eigenen Funktionscode, indem Sie die im vorherigen Schritt erstellte ZIP- oder JAR-Datei hochladen.

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Stellen Sie sicher, dass Sie in demselben Modus arbeiten, in dem AWS-Region Sie Ihren Amazon S3 S3-Bucket erstellt haben. Sie können Ihre Region mithilfe der Dropdown-Liste am oberen Bildschirmrand ändern.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/console_region_select.png)

1. Wählen Sie **Funktion erstellen**.

1. Wählen Sie **Author from scratch** aus.

1. Führen Sie unter **Basic information** (Grundlegende Informationen) die folgenden Schritte aus:

   1. Geben Sie für **Function name** (Funktionsname) `CreateThumbnail` ein.

   1. Wählen Sie für **Laufzeit** entweder **Node.js 22.x** oder **Python 3.12**, je nachdem, welche Sprache Sie für Ihre Funktion gewählt haben.

   1. Wählen Sie für **Architektur** **x86\$164** aus.

1. Gehen Sie auf der Registerkarte **Standard-Ausführungsrolle ändern** wie folgt vor:

   1. Erweitern Sie die Registerkarte und wählen Sie dann **Verwenden einer vorhandenen Rolle** aus.

   1. Wählen Sie die zuvor erstellte `LambdaS3Role` aus.

1. Wählen Sie **Funktion erstellen**.

**So laden Sie den Funktionscode hoch (Konsole)**

1. Wählen Sie im Bereich **Codequelle** die Option **Hochladen von** aus.

1. Wählen Sie die **ZIP-Datei** aus. 

1. Klicken Sie auf **Upload**.

1. Wählen Sie in der Dateiauswahl Ihre ZIP-Datei und anschließend **Öffnen** aus.

1. Wählen Sie **Speichern**.

------
#### [ AWS CLI ]

**So erstellen Sie die Funktion (AWS CLI)**
+ Führen Sie den CLI-Befehl für die von Ihnen gewählte Sprache aus. Stellen Sie sicher, dass Sie den `role` Parameter durch Ihre eigene AWS-Konto ID `123456789012` ersetzen. Ersetzen Sie für den Parameter `region` den Wert `us-east-1` durch die Region, in der Sie Ihre Amazon-S3-Buckets erstellt haben.
  + Führen Sie für **Node.js** den folgenden Befehl in dem Verzeichnis aus, das die Datei `function.zip` enthält:

    ```
    aws lambda create-function --function-name CreateThumbnail \
    --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
    --timeout 10 --memory-size 1024 \
    --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-east-1
    ```
  + Führen Sie für **Python** den folgenden Befehl in dem Verzeichnis aus, das die Datei `lambda_function.zip` enthält:

    ```
    aws lambda create-function --function-name CreateThumbnail \
    --zip-file fileb://lambda_function.zip --handler lambda_function.lambda_handler \
    --runtime python3.14 --timeout 10 --memory-size 1024 \
    --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-east-1
    ```

------

## Konfigurieren von Amazon S3 zum Aufrufen der Funktion
<a name="with-s3-tutorial-configure-s3-trigger"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps7.png)


Damit Ihre Lambda-Funktion ausgeführt wird, wenn Sie ein Bild in Ihren Quell-Bucket hochladen, müssen Sie einen Auslöser für Ihre Funktion konfigurieren. Sie können den Amazon-S3-Auslöser entweder über die Konsole oder mithilfe der AWS CLI konfigurieren.

**Wichtig**  
Mit diesem Verfahren wird der Amazon-S3-Bucket so konfiguriert, dass die Funktion jedes Mal aufgerufen wird, wenn ein Objekt im Bucket erstellt wird. Konfigurieren Sie dieses Verhalten nur für den Quell-Bucket. Wenn Ihre Lambda-Funktion Objekte in dem Bucket erstellt, der sie aufruft, kann es passieren, dass Ihre Funktion [kontinuierlich in einer Schleife aufgerufen](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway) wird. Dies kann dazu führen, dass Ihnen AWS-Konto unerwartete Gebühren in Rechnung gestellt werden.

------
#### [ AWS-Managementkonsole ]

**So konfigurieren Sie den Amazon-S3-Auslöser (Konsole)**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole und wählen Sie Ihre Funktion (`CreateThumbnail`) aus.

1. Wählen Sie **Add trigger**.

1. Wählen Sie **S3** aus.

1. Wählen Sie unter **Bucket** Ihren Quell-Bucket aus.

1. Wählen Sie unter **Ereignistypen** die Option **Alle Objekterstellungsereignisse** aus.

1. Aktivieren Sie unter **Rekursiver Aufruf** das Kontrollkästchen, um zu bestätigen, dass die Verwendung desselben Amazon-S3-Buckets für die Ein- und Ausgabe nicht empfohlen wird. Weitere Informationen zu rekursiven Aufrufmustern in Lambda finden Sie bei Serverless Land unter [Recursive patterns that cause run-away Lambda functions](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway).

1. Wählen Sie **Hinzufügen** aus.

   Wenn Sie einen Auslöser über die Lambda-Konsole erstellen, erstellt Lambda automatisch eine [ressourcenbasierte Richtlinie](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html), um dem von Ihnen ausgewählten Dienst die Berechtigung zum Aufrufen Ihrer Funktion zu erteilen. 

------
#### [ AWS CLI ]

**So konfigurieren Sie den Amazon-S3-Auslöser (AWS CLI)**

1. Damit Ihr Amazon-S3-Quell-Bucket Ihre Funktion aufruft, wenn Sie eine Bilddatei hinzufügen, müssen Sie zunächst mithilfe einer [ressourcenbasierten Richtlinie](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html) Berechtigungen für Ihre Funktion konfigurieren. Eine ressourcenbasierte Grundsatzerklärung erteilt anderen Personen die AWS-Services Erlaubnis, Ihre Funktion aufzurufen. Führen Sie den folgenden CLI-Befehl aus, um Amazon S3 die Berechtigung zum Aufrufen Ihrer Funktion zu erteilen. Achten Sie darauf, den `source-account` Parameter durch Ihre eigene AWS-Konto ID zu ersetzen und Ihren eigenen Quell-Bucket-Namen zu verwenden.

   ```
   aws lambda add-permission --function-name CreateThumbnail \
   --principal s3.amazonaws.com --statement-id s3invoke --action "lambda:InvokeFunction" \
   --source-arn arn:aws:s3:::amzn-s3-demo-source-bucket \
   --source-account 123456789012
   ```

   Die mit diesem Befehl definierte Richtlinie ermöglicht es Amazon S3 nur, Ihre Funktion aufzurufen, wenn eine Aktion in Ihrem Quell-Bucket ausgeführt wird.
**Anmerkung**  
Namen von Amazon-S3-Buckets sind zwar global eindeutig, trotzdem empfiehlt es sich, bei der Verwendung ressourcenbasierter Richtlinien anzugeben, dass der Bucket zu Ihrem Konto gehören muss. Denn wenn Sie einen Bucket löschen, kann ein anderer AWS-Konto Bucket einen Bucket mit demselben Amazon-Ressourcennamen (ARN) erstellen.

1. Speichern Sie den folgenden JSON-Code in einer Datei mit dem Namen `notification.json`: Wenn dieser JSON-Code auf Ihren Quell-Bucket angewendet wird, wird der Bucket so konfiguriert, dass er jedes Mal, wenn ein neues Objekt hinzugefügt wird, eine Benachrichtigung an Ihre Lambda-Funktion sendet. Ersetzen Sie die AWS-Konto Nummer und AWS-Region in der Lambda-Funktion ARN durch Ihre eigene Kontonummer und Region.

   ```
   {
   "LambdaFunctionConfigurations": [
       {
         "Id": "CreateThumbnailEventConfiguration",
         "LambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:CreateThumbnail",
         "Events": [ "s3:ObjectCreated:Put" ]
       }
     ]
   }
   ```

1. Führen Sie den folgenden CLI-Befehl aus, um die Benachrichtigungseinstellungen in der von Ihnen erstellten JSON-Datei auf Ihren Quell-Bucket anzuwenden. Ersetzen Sie dabei `amzn-s3-demo-source-bucket` durch den Namen Ihres Quell-Buckets.

   ```
   aws s3api put-bucket-notification-configuration --bucket amzn-s3-demo-source-bucket \
   --notification-configuration file://notification.json
   ```

   Weitere Informationen zu dem `put-bucket-notification-configuration` Befehl und der `notification-configuration` Option finden Sie [put-bucket-notification-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-notification-configuration.html)in der *AWS CLI-Befehlsreferenz*.

------

## Testen Ihrer Lambda-Funktion mit einem Dummy-Ereignis
<a name="with-s3-tutorial-dummy-test"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps8.png)


Bevor Sie Ihr gesamtes Setup testen, indem Sie Ihrem Amazon-S3-Quell-Bucket eine Bilddatei hinzufügen, testen Sie, ob Ihre Lambda-Funktion ordnungsgemäß funktioniert, indem Sie sie mit einem Dummy-Ereignis aufrufen. In Lambda ist ein Ereignis ein Dokument im JSON-Format, das Daten enthält, die von Ihrer Lambda-Funktion verarbeitet werden sollen. Wenn Ihre Funktion von Amazon S3 aufgerufen wird, enthält das an Ihre Funktion gesendete Ereignis Informationen wie den Bucket-Namen, den Bucket-ARN und den Objektschlüssel.

------
#### [ AWS-Managementkonsole ]

**So testen Sie Ihre Lambda-Funktion mit einem Dummy-Ereignis (Konsole)**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole und wählen Sie Ihre Funktion (`CreateThumbnail`) aus.

1. Wählen Sie die Registerkarte **Test**.

1. Gehen Sie im Bereich **Testereignis** wie folgt vor, um Ihr Testereignis zu erstellen:

   1. Wählen Sie unter **Testereignisaktion** die Option **Neues Ereignis erstellen** aus.

   1. Geben Sie für **Event name (Ereignisname)** **myTestEvent** ein.

   1. Wählen Sie unter **Vorlage** die Option **S3 Put** aus.

   1. Ersetzen Sie die Werte für die folgenden Parameter durch Ihre eigenen Werte:
      + Ersetzen Sie für durch den`awsRegion`, in `us-east-1` dem AWS-Region Sie Ihre Amazon S3 S3-Buckets erstellt haben.
      + Ersetzen Sie für `name` den Wert `amzn-s3-demo-bucket` durch den Namen Ihres eigenen Amazon-S3-Quell-Buckets.
      + Ersetzen Sie für `key` den Wert `test%2Fkey` durch den Dateinamen des Testobjekts, das Sie im Schritt [Hochladen eines Testbilds in Ihren Quell-Bucket](#with-s3-tutorial-test-image) in Ihren Quell-Bucket hochgeladen haben.

      ```
      {
        "Records": [
          {
            "eventVersion": "2.0",
            "eventSource": "aws:s3",
            "awsRegion": "us-east-1",
            "eventTime": "1970-01-01T00:00:00.000Z",
            "eventName": "ObjectCreated:Put",
            "userIdentity": {
              "principalId": "EXAMPLE"
            },
            "requestParameters": {
              "sourceIPAddress": "127.0.0.1"
            },
            "responseElements": {
              "x-amz-request-id": "EXAMPLE123456789",
              "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
            },
            "s3": {
              "s3SchemaVersion": "1.0",
              "configurationId": "testConfigRule",
              "bucket": {
                "name": "amzn-s3-demo-bucket",
                "ownerIdentity": {
                  "principalId": "EXAMPLE"
                },
                "arn": "arn:aws:s3:::amzn-s3-demo-bucket"
              },
              "object": {
                "key": "test%2Fkey",
                "size": 1024,
                "eTag": "0123456789abcdef0123456789abcdef",
                "sequencer": "0A1B2C3D4E5F678901"
              }
            }
          }
        ]
      }
      ```

   1. Wählen Sie **Speichern**.

1. Wählen Sie im Bereich **Testereignis** die Option **Testen** aus.

1. Gehen Sie wie folgt vor, um zu überprüfen, ob Ihre Funktion eine verkleinerte Version Ihres Bilds erstellt und in Ihrem Amazon-S3-Ziel-Bucket gespeichert hat:

   1. Öffnen Sie die Seite [Buckets](https://console.aws.amazon.com/s3/buckets) der Amazon-S3-Konsole.

   1. Wählen Sie Ihren Ziel-Bucket aus und vergewissern Sie sich, dass die Datei, deren Größe angepasst wurde, im Bereich **Objekte** vorhanden ist.

------
#### [ AWS CLI ]

**So testen Sie Ihre Lambda-Funktion mit einem Dummy-Ereignis (AWS CLI)**

1. Speichern Sie den folgenden JSON-Code in einer Datei mit dem Namen `dummyS3Event.json`: Ersetzen Sie die Werte für die folgenden Parameter durch Ihre eigenen Werte:
   + Ersetzen Sie für durch den`awsRegion`, in `us-east-1` dem AWS-Region Sie Ihre Amazon S3 S3-Buckets erstellt haben.
   + Ersetzen Sie für `name` den Wert `amzn-s3-demo-bucket` durch den Namen Ihres eigenen Amazon-S3-Quell-Buckets.
   + Ersetzen Sie für `key` den Wert `test%2Fkey` durch den Dateinamen des Testobjekts, das Sie im Schritt [Hochladen eines Testbilds in Ihren Quell-Bucket](#with-s3-tutorial-test-image) in Ihren Quell-Bucket hochgeladen haben.

   ```
   {
     "Records": [
       {
         "eventVersion": "2.0",
         "eventSource": "aws:s3",
         "awsRegion": "us-east-1",
         "eventTime": "1970-01-01T00:00:00.000Z",
         "eventName": "ObjectCreated:Put",
         "userIdentity": {
           "principalId": "EXAMPLE"
         },
         "requestParameters": {
           "sourceIPAddress": "127.0.0.1"
         },
         "responseElements": {
           "x-amz-request-id": "EXAMPLE123456789",
           "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
         },
         "s3": {
           "s3SchemaVersion": "1.0",
           "configurationId": "testConfigRule",
           "bucket": {
             "name": "amzn-s3-demo-bucket",
             "ownerIdentity": {
               "principalId": "EXAMPLE"
             },
             "arn": "arn:aws:s3:::amzn-s3-demo-bucket"
           },
           "object": {
             "key": "test%2Fkey",
             "size": 1024,
             "eTag": "0123456789abcdef0123456789abcdef",
             "sequencer": "0A1B2C3D4E5F678901"
           }
         }
       }
     ]
   }
   ```

1. Rufen Sie die Funktion in dem Verzeichnis auf, in dem Sie die Datei `dummyS3Event.json` gespeichert haben, indem Sie den folgenden CLI-Befehl ausführen. Dieser Befehl ruft Ihre Lambda-Funktion synchron auf, indem `RequestResponse` als Wert des Parameters „invocation-type“ angegeben wird. Weitere Informationen zu synchronen und asynchronen Aufrufen finden Sie unter [Aufrufen von Lambda-Funktionen](https://docs.aws.amazon.com/lambda/latest/dg/lambda-invocation.html).

   ```
   aws lambda invoke --function-name CreateThumbnail \
   --invocation-type RequestResponse --cli-binary-format raw-in-base64-out \
   --payload file://dummyS3Event.json outputfile.txt
   ```

   Die cli-binary-format Option ist erforderlich, wenn Sie Version 2 von verwenden. AWS CLI Um dies zur Standardeinstellung zu machen, führen Sie `aws configure set cli-binary-format raw-in-base64-out` aus. Weitere Informationen finden Sie unter [AWS CLI -unterstützte globale Befehlszeilenoptionen](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list).

1. Vergewissern Sie sich, dass Ihre Funktion eine Miniaturversion Ihres Bilds erstellt und in Ihrem Amazon-S3-Ziel-Bucket gespeichert hat. Führen Sie den folgenden CLI-Befehl aus und ersetzen Sie dabei `amzn-s3-demo-source-bucket-resized` durch den Namen Ihres eigenen Ziel-Buckets:

   ```
   aws s3api list-objects-v2 --bucket amzn-s3-demo-source-bucket-resized
   ```

   Die Ausgabe sollte in etwa wie folgt aussehen: Der Parameter `Key` zeigt den Dateinamen Ihrer verkleinerten Bilddatei an.

   ```
   {
       "Contents": [
           {
               "Key": "resized-HappyFace.jpg",
               "LastModified": "2023-06-06T21:40:07+00:00",
               "ETag": "\"d8ca652ffe83ba6b721ffc20d9d7174a\"",
               "Size": 2633,
               "StorageClass": "STANDARD"
           }
       ]
   }
   ```

------

## Testen Ihrer Funktion mit dem Amazon-S3-Auslöser
<a name="with-s3-tutorial-test-s3"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps9.png)


Nachdem Sie sich vergewissert haben, dass Ihre Lambda-Funktion ordnungsgemäß funktioniert, können Sie Ihr gesamtes Setup testen, indem Sie Ihrem Amazon-S3-Quell-Bucket eine Bilddatei hinzufügen. Wenn Sie Ihr Bild dem Quell-Bucket hinzufügen, sollte Ihre Lambda-Funktion automatisch aufgerufen werden. Ihre Funktion erstellt eine verkleinerte Version der Datei und speichert sie in Ihrem Ziel-Bucket.

------
#### [ AWS-Managementkonsole ]

**So testen Sie Ihre Lambda-Funktion unter Verwendung des Amazon-S3-Auslösers (Konsole)**

1. Gehen Sie wie folgt vor, um ein Bild in Ihren Amazon-S3-Bucket hochzuladen:

   1. Öffnen Sie die Seite [Buckets](https://console.aws.amazon.com/s3/buckets) der Amazon-S3-Konsole und wählen Sie Ihren Quell-Bucket aus.

   1. Klicken Sie auf **Upload**.

   1. Wählen Sie **Dateien hinzufügen** und anschließend über die Dateiauswahl die Bilddatei aus, die Sie hochladen möchten. Ihr Bildobjekt kann eine beliebige JPG- oder PNG-Datei sein.

   1. Wählen Sie **Öffnen** und anschließend **Hochladen** aus.

1. Vergewissern Sie sich, dass Lambda eine verkleinerte Version Ihrer Bilddatei in Ihrem Ziel-Bucket gespeichert hat:

   1. Navigieren Sie wieder zur Seite [Buckets](https://console.aws.amazon.com/s3/buckets) der Amazon-S3-Konsole und wählen Sie Ihren Ziel-Bucket aus.

   1. Im Bereich **Objekte** sollten jetzt zwei verkleinerte Bilddateien angezeigt werden (jeweils eine aus den beiden Tests Ihrer Lambda-Funktion). Wählen Sie zum Herunterladen Ihres verkleinerten Bilds die Datei und anschließend **Herunterladen** aus.

------
#### [ AWS CLI ]

**So testen Sie Ihre Lambda-Funktion unter Verwendung des Amazon-S3-Auslösers (AWS CLI)**

1. Führen Sie in dem Verzeichnis, das das hochzuladende Bild enthält, den folgenden CLI-Befehl aus. Ersetzen Sie dabei den Parameter `--bucket` durch den Namen Ihres Quell-Buckets. Verwenden Sie für die Parameter `--key` und `--body` den Dateinamen Ihres Testbilds. Ihr Testbild kann eine beliebige JPG- oder PNG-Datei sein.

   ```
   aws s3api put-object --bucket amzn-s3-demo-source-bucket --key SmileyFace.jpg --body ./SmileyFace.jpg
   ```

1. Vergewissern Sie sich, dass Ihre Funktion eine Miniaturversion Ihres Bilds erstellt und in Ihrem Amazon-S3-Ziel-Bucket gespeichert hat. Führen Sie den folgenden CLI-Befehl aus und ersetzen Sie dabei `amzn-s3-demo-source-bucket-resized` durch den Namen Ihres eigenen Ziel-Buckets:

   ```
   aws s3api list-objects-v2 --bucket amzn-s3-demo-source-bucket-resized
   ```

   Wenn Ihre Funktion erfolgreich ausgeführt wird, erhalten Sie eine Ausgabe wie die folgende. Ihr Ziel-Bucket sollte jetzt zwei verkleinerte Dateien enthalten.

   ```
   {
       "Contents": [
           {
               "Key": "resized-HappyFace.jpg",
               "LastModified": "2023-06-07T00:15:50+00:00",
               "ETag": "\"7781a43e765a8301713f533d70968a1e\"",
               "Size": 2763,
               "StorageClass": "STANDARD"
           },
           {
               "Key": "resized-SmileyFace.jpg",
               "LastModified": "2023-06-07T00:13:18+00:00",
               "ETag": "\"ca536e5a1b9e32b22cd549e18792cdbc\"",
               "Size": 1245,
               "StorageClass": "STANDARD"
           }
       ]
   }
   ```

------

## Bereinigen Ihrer Ressourcen
<a name="s3-tutorial-cleanup"></a>

Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Durch das Löschen von AWS Ressourcen, die Sie nicht mehr verwenden, vermeiden Sie unnötige Kosten für Ihre AWS-Konto.

**So löschen Sie die Lambda-Funktion:**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion aus, die Sie erstellt haben.

1. Wählen Sie **Aktionen**, **Löschen** aus.

1. Geben Sie **confirm** in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie die von Ihnen erstellte Richtlinie**

1. Öffnen Sie die Seite [Richtlinien](https://console.aws.amazon.com/iam/home#/policies) in der IAM-Konsole.

1. Wählen Sie die Richtlinie aus, die Sie erstellt haben (**AWSLambdaS3Policy**).

1. Wählen Sie **Policy actions (Richtlinienaktionen)** und anschließend **Delete (Löschen)** aus.

1. Wählen Sie **Löschen** aus.

**So löschen Sie die Ausführungsrolle**

1. Öffnen Sie die Seite [Roles](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie die von Ihnen erstellte Ausführungsrolle aus.

1. Wählen Sie **Löschen** aus.

1. Geben Sie den Namen der Rolle in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie den S3-Bucket:**

1. Öffnen Sie die [Amazon S3-Konsole](https://console.aws.amazon.com//s3/home#).

1. Wählen Sie den Bucket aus, den Sie erstellt haben.

1. Wählen Sie **Löschen** aus.

1. Geben Sie den Namen des Buckets in das Texteingabefeld ein.

1. Wählen Sie **Bucket löschen** aus.

# Verwenden von Secrets-Manager-Secrets in Lambda-Funktionen
<a name="with-secrets-manager"></a>

AWS Secrets Manager hilft Ihnen bei der Verwaltung von Anmeldeinformationen, API-Schlüsseln und anderen Geheimnissen, die Ihre Lambda-Funktionen benötigen. Sie haben zwei Hauptansätze für das Abrufen von Geheimnissen in Ihren Lambda-Funktionen, die beide eine bessere Leistung und geringere Kosten bieten als das direkte Abrufen von Geheimnissen mithilfe des SDK: AWS 
+ **AWS Lambda-Erweiterung für Parameter und Geheimnisse** — Eine laufzeitunabhängige Lösung, die eine einfache HTTP-Schnittstelle zum Abrufen von Geheimnissen bietet
+ **Powertools for AWS Lambda Parameters Utility** — Eine codeintegrierte Lösung, die mehrere Anbieter (Secrets Manager, Parameter Store AppConfig) mit integrierten Transformationen unterstützt

Beide Ansätze verwenden lokale Caches für Secrets, sodass Ihre Funktion nicht bei jedem Aufruf den Secrets Manager aufrufen muss. Wenn Ihre Funktion ein Secret anfordert, wird zuerst der Cache überprüft. Ist das Secret verfügbar und nicht abgelaufen, wird es sofort zurückgegeben. Andernfalls wird es aus dem Secrets Manager abgerufen, zwischengespeichert und zurückgegeben. Dieser Caching-Mechanismus führt zu schnelleren Antwortzeiten und geringeren Kosten durch die Minimierung von API-Aufrufen.

## Auswahl des Ansatzes
<a name="lambda-secrets-manager-choosing-approach"></a>

Berücksichtigen Sie diese Faktoren, wenn Sie zwischen der Erweiterung und folgenden Optionen wählen: PowerTools

Verwenden Sie die Lambda-Erweiterung AWS Parameters and Secrets, wenn:  
+ Sie eine laufzeitunabhängige Lösung benötigen, die mit jeder Lambda-Laufzeit funktioniert.
+ Sie keine Codeabhängigkeiten zu Ihrer Funktion hinzufügen möchten.
+ Sie nur Secrets aus Secrets Manager oder Parameter Store abrufen müssen.

Verwenden Sie Powertools for AWS Lambda Parameters Utility, wenn:  
+ Sie eine integrierte Entwicklungserfahrung mit Ihrem Anwendungscode wünschen.
+ Sie benötigen Unterstützung für mehrere Anbieter (Secrets Manager, Parameter Store, AppConfig)
+ Sie integrierte Datentransformationen (JSON-Parsing, Base64-Decodierung) benötigen.
+ Sie verwenden Python- TypeScript, Java- oder .NET-Laufzeiten

## Wann Sie den Secrets Manager mit Lambda verwenden sollten
<a name="lambda-secrets-manager-when-to-use"></a>

Zu den häufigsten Anwendungsfällen für den Secrets Manager mit Lambda gehören:
+ Speichern von Datenbank-Anmeldeinformationen, die Ihre Funktion für die Verbindung zu Amazon RDS oder anderen Datenbanken verwendet.
+ Verwalten von API-Schlüsseln für externe Dienste, die Ihre Funktion aufruft.
+ Speichern von Verschlüsselungsschlüsseln oder anderen sensiblen Konfigurationsdaten.
+ Automatische Rotation der Anmeldeinformationen, ohne dass Sie Ihren Funktionscode aktualisieren müssen.

## Verwenden der Lambda-Erweiterung AWS Parameter und Geheimnisse
<a name="lambda-secrets-manager-extension-approach"></a>

Die Lambda-Erweiterung AWS Parameters and Secrets verwendet eine einfache HTTP-Schnittstelle, die mit jeder Lambda-Laufzeit kompatibel ist. Standardmäßig werden Secrets 300 Sekunden (5 Minuten) lang zwischengespeichert und es können bis zu 1 000 Secrets gespeichert werden. Sie können [diese Einstellungen mit Umgebungsvariablen anpassen](#lambda-secrets-manager-env-vars).

### Verwendung des Secrets Manager in einer Lambda-Funktion
<a name="lambda-secrets-manager-setup"></a>

In diesem Abschnitt wird davon ausgegangen, dass Sie bereits ein Secret im Secrets Manager besitzen. Informationen zum Erstellen eines Secrets finden Sie unter [Create an AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) Secret.

#### Erstellen des Bereitstellungspakets
<a name="lambda-secrets-manager-function-code"></a>

Wählen Sie Ihre bevorzugte Laufzeit und folgen Sie den Schritten, um eine Funktion zu erstellen, die Secrets aus dem Secrets Manager abruft. Die Beispielfunktion ruft ein Secrets aus dem Secrets Manager ab und kann verwendet werden, um auf Datenbank-Anmeldeinformationen, API-Schlüssel oder andere sensible Konfigurationsdaten in Ihren Anwendungen zuzugreifen.

------
#### [ Python ]

**So erstellen Sie eine Python-Funktion**

1. Erstellen Sie ein neues Projektverzeichnis und navigieren Sie dorthin. Beispiel:

   ```
   mkdir my_function
   cd my_function
   ```

1. Erstellen Sie eine Datei mit dem Namen `lambda_function.py` und dem folgenden Code. Verwenden Sie für `secret_name` den Namen oder den Amazon-Ressourcennamen (ARN) Ihres Secrets.

   ```
   import json
   import os
   import requests
   
   def lambda_handler(event, context):
       try:
           # Replace with the name or ARN of your secret
           secret_name = "arn:aws:secretsmanager:us-east-1:111122223333:secret:SECRET_NAME"
           
           secrets_extension_endpoint = f"http://localhost:2773/secretsmanager/get?secretId={secret_name}"
           headers = {"X-Aws-Parameters-Secrets-Token": os.environ.get('AWS_SESSION_TOKEN')}
           
           response = requests.get(secrets_extension_endpoint, headers=headers)
           print(f"Response status code: {response.status_code}")
           
           secret = json.loads(response.text)["SecretString"]
           print(f"Retrieved secret: {secret}")
           
           return {
               'statusCode': response.status_code,
               'body': json.dumps({
                   'message': 'Successfully retrieved secret',
                   'secretRetrieved': True
               })
           }
       
       except Exception as e:
           print(f"Error: {str(e)}")
           return {
               'statusCode': 500,
               'body': json.dumps({
                   'message': 'Error retrieving secret',
                   'error': str(e)
               })
           }
   ```

1. Erstellen Sie eine Datei namens „`requirements.txt`“ mit folgendem Inhalt:

   ```
   requests
   ```

1. Installieren Sie die Abhängigkeiten:

   ```
   pip install -r requirements.txt -t .
   ```

1. Erstellen Sie eine ZIP-Datei, die alle Dateien enthält:

   ```
   zip -r function.zip .
   ```

------
#### [ Node.js ]

**Erstellen einer Funktion Node.js.**

1. Erstellen Sie ein neues Projektverzeichnis und navigieren Sie dorthin. Beispiel:

   ```
   mkdir my_function
   cd my_function
   ```

1. Erstellen Sie eine Datei mit dem Namen `index.mjs` und dem folgenden Code. Verwenden Sie für `secret_name` den Namen oder den Amazon-Ressourcennamen (ARN) Ihres Secrets.

   ```
   import http from 'http';
   
   export const handler = async (event) => {
       try {
           // Replace with the name or ARN of your secret
           const secretName = "arn:aws:secretsmanager:us-east-1:111122223333:secret:SECRET_NAME";
           const options = {
               hostname: 'localhost',
               port: 2773,
               path: `/secretsmanager/get?secretId=${secretName}`,
               headers: {
                   'X-Aws-Parameters-Secrets-Token': process.env.AWS_SESSION_TOKEN
               }
           };
   
           const response = await new Promise((resolve, reject) => {
               http.get(options, (res) => {
                   let data = '';
                   res.on('data', (chunk) => { data += chunk; });
                   res.on('end', () => {
                       resolve({ 
                           statusCode: res.statusCode, 
                           body: data 
                       });
                   });
               }).on('error', reject);
           });
   
           const secret = JSON.parse(response.body).SecretString;
           console.log('Retrieved secret:', secret);
   
           return {
               statusCode: response.statusCode,
               body: JSON.stringify({
                   message: 'Successfully retrieved secret',
                   secretRetrieved: true
               })
           };
       } catch (error) {
           console.error('Error:', error);
           return {
               statusCode: 500,
               body: JSON.stringify({
                   message: 'Error retrieving secret',
                   error: error.message
               })
           };
       }
   };
   ```

1. Erstellen Sie eine ZIP-Datei, die die Datei „`index.mjs`“ enthält:

   ```
   zip -r function.zip index.mjs
   ```

------
#### [ Java ]

**So erstellen Sie eine Java-Funktion**

1. Erstellen Sie ein Maven-Projekt:

   ```
   mvn archetype:generate \
       -DgroupId=example \
       -DartifactId=lambda-secrets-demo \
       -DarchetypeArtifactId=maven-archetype-quickstart \
       -DarchetypeVersion=1.4 \
       -DinteractiveMode=false
   ```

1. Navigieren Sie zum Projektverzeichnis:

   ```
   cd lambda-secrets-demo
   ```

1. Öffnen Sie die Datei „`pom.xml`“ und ersetzen Sie deren Inhalt durch Folgendes:

   ```
   <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
   
       <groupId>example</groupId>
       <artifactId>lambda-secrets-demo</artifactId>
       <version>1.0-SNAPSHOT</version>
   
       <properties>
           <maven.compiler.source>11</maven.compiler.source>
           <maven.compiler.target>11</maven.compiler.target>
       </properties>
   
       <dependencies>
           <dependency>
               <groupId>com.amazonaws</groupId>
               <artifactId>aws-lambda-java-core</artifactId>
               <version>1.2.1</version>
           </dependency>
       </dependencies>
   
       <build>
           <plugins>
               <plugin>
                   <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-shade-plugin</artifactId>
                   <version>3.2.4</version>
                   <executions>
                       <execution>
                           <phase>package</phase>
                           <goals>
                               <goal>shade</goal>
                           </goals>
                           <configuration>
                               <createDependencyReducedPom>false</createDependencyReducedPom>
                               <finalName>function</finalName>
                           </configuration>
                       </execution>
                   </executions>
               </plugin>
           </plugins>
       </build>
   </project>
   ```

1. Benennen Sie die Datei „`/lambda-secrets-demo/src/main/java/example/App.java`“ in „`Hello.java`“ um, um sie an den Standardnamen des Java-Handlers von Lambda (`example.Hello::handleRequest`) anzupassen:

   ```
   mv src/main/java/example/App.java src/main/java/example/Hello.java
   ```

1. Öffnen Sie die Datei `Hello.java` und ersetzen Sie den Inhalt durch Folgendes. Verwenden Sie für `secretName` den Namen oder den Amazon-Ressourcennamen (ARN) Ihres Secrets. 

   ```
   package example;
   
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   import java.net.URI;
   import java.net.http.HttpClient;
   import java.net.http.HttpRequest;
   import java.net.http.HttpResponse;
   
   public class Hello implements RequestHandler<Object, String> {
       private final HttpClient client = HttpClient.newHttpClient();
   
       @Override
       public String handleRequest(Object input, Context context) {
           try {
               // Replace with the name or ARN of your secret
               String secretName = "arn:aws:secretsmanager:us-east-1:111122223333:secret:SECRET_NAME";
               String endpoint = "http://localhost:2773/secretsmanager/get?secretId=" + secretName;
   
               HttpRequest request = HttpRequest.newBuilder()
                   .uri(URI.create(endpoint))
                   .header("X-Aws-Parameters-Secrets-Token", System.getenv("AWS_SESSION_TOKEN"))
                   .GET()
                   .build();
   
               HttpResponse<String> response = client.send(request, 
                   HttpResponse.BodyHandlers.ofString());
   
               String secret = response.body();
               secret = secret.substring(secret.indexOf("SecretString") + 15);
               secret = secret.substring(0, secret.indexOf("\""));
   
               System.out.println("Retrieved secret: " + secret);
               return String.format(
                   "{\"statusCode\": %d, \"body\": \"%s\"}",
                   response.statusCode(), "Successfully retrieved secret"
               );
   
           } catch (Exception e) {
               e.printStackTrace();
               return String.format(
                   "{\"body\": \"Error retrieving secret: %s\"}", 
                   e.getMessage()
               );
           }
       }
   }
   ```

1. Entfernen Sie das Testverzeichnis. Maven erstellt dies standardmäßig, aber wir benötigen es für dieses Beispiel nicht.

   ```
   rm -rf src/test
   ```

1. Erstellen Sie das Projekt:

   ```
   mvn package
   ```

1. Laden Sie die JAR-Datei (`target/function.jar`) zur späteren Verwendung herunter.

------

#### Erstellen der Funktion
<a name="lambda-secrets-manager-create"></a>

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie **Funktion erstellen**.

1. Wählen Sie **Verfassen von Grund auf** aus.

1. Geben Sie für **Function name** (Funktionsname) **secret-retrieval-demo** ein.

1. Wählen Sie Ihre bevorzugte **Laufzeit**.

1. Wählen Sie **Funktion erstellen**.

**So laden Sie das Bereitstellungspaket hoch**

1. Wählen Sie auf der Registerkarte **Code** der Funktion die Option **Hochladen von** und dann **ZIP-Datei** (für Python und Node.js) oder **JAR-Datei** (für Java) aus.

1. Laden Sie das Bereitstellungspaket hoch, das Sie zuvor erstellt haben.

1. Wählen Sie **Speichern**.

#### Hinzufügen der Erweiterung
<a name="lambda-secrets-manager-extension"></a>

**Um die Lambda-Erweiterung AWS Parameters and Secrets als Ebene hinzuzufügen**

1. Scrollen Sie auf der Registerkarte **Code** der Funktion nach unten zu **Ebenen**.

1. Wählen Sie **Add a layer (Layer hinzufügen)** aus.

1. Wählen Sie **AWS -Ebenen** aus.

1. Wählen Sie **AWS-Parameters-and-Secrets-Lambda-Extension** aus.

1. Wählen Sie die neueste Version aus.

1. Wählen Sie **Hinzufügen** aus.

#### Berechtigungen hinzufügen
<a name="lambda-secrets-manager-permissions"></a>

**So fügen Sie Ihrer Ausführungsrolle Berechtigungen für den Secrets Manager hinzu**

1. Wählen Sie die Registerkarte **Konfiguration** und dann **Berechtigungen** aus.

1. Wählen Sie unter **Rollenname** den Link zu Ihrer Ausführungsrolle. Dieser Link öffnet die Rolle in der IAM-Konsole.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/execution-role-console.png)

1. Wählen Sie **Add permissions** (Berechtigungen hinzufügen) und dann **Create inline policy** (Inline-Richtlinie erstellen) aus.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/create-inline-policy.png)

1. Wählen Sie die Registerkarte **JSON** aus und fügen Sie die folgende Richtlinie hinzu. Geben Sie für `Resource` den ARN Ihres Secrets ein.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "secretsmanager:GetSecretValue",
               "Resource": "arn:aws:secretsmanager:us-east-1:111122223333:secret:SECRET_NAME"
           }
       ]
   }
   ```

------

1. Wählen Sie **Weiter** aus.

1. Geben Sie einen Namen für die Richtlinie ein.

1. Wählen Sie **Richtlinie erstellen** aus.

#### Testen der Funktion
<a name="lambda-secrets-manager-test"></a>

**So testen Sie die -Funktion**

1. Kehren Sie zur Lambda-Konsole zurück.

1. Wählen Sie die Registerkarte **Test**.

1. Wählen Sie **Test** aus. Sie sollten die folgende Antwort sehen:  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/execution-results-secret.png)

### Umgebungsvariablen
<a name="lambda-secrets-manager-env-vars"></a>

Die Lambda-Erweiterung AWS Parameters and Secrets verwendet die folgenden Standardeinstellungen. Sie können diese Einstellungen überschreiben, indem Sie die entsprechenden [Umgebungsvariablen](configuration-envvars.md#create-environment-variables) erstellen. Setzen Sie `PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL` auf `DEBUG`, um die aktuellen Einstellungen für eine Funktion anzuzeigen. Die Erweiterung CloudWatch protokolliert ihre Konfigurationsinformationen zu Beginn jedes Funktionsaufrufs in Logs.


| Einstellung | Standardwert | Zulässige Werte | Umgebungsvariable | Details | 
| --- | --- | --- | --- | --- | 
| HTTP-Port | 2773 | 1–65 535 | PARAMETERS\$1SECRETS\$1EXTENSION\$1HTTP\$1PORT | Port für den lokalen HTTP-Server | 
| Cache aktiviert | TRUE | TRUE \$1 FALSE | PARAMETERS\$1SECRETS\$1EXTENSION\$1CACHE\$1ENABLED | Aktivieren oder Deaktivieren des Cache | 
| Cache-Größe | 1000 | 0–1 000 | PARAMETERS\$1SECRETS\$1EXTENSION\$1CACHE\$1SIZE | Auf 0 setzen, um das Caching zu deaktivieren | 
| Secrets Manager TTL | 300 Sekunden | 0–300 Sekunden | SECRETS\$1MANAGER\$1TTL | Time-to-live für zwischengespeicherte Geheimnisse. Auf 0 setzen, um das Caching zu deaktivieren. Diese Variable wird ignoriert, wenn der Wert für PARAMETERS\$1SECRETS\$1EXTENSION\$1CACHE\$1SIZE 0 ist. | 
| Parameter Store TTL | 300 Sekunden | 0–300 Sekunden | SSM\$1PARAMETER\$1STORE\$1TTL | Time-to-live für zwischengespeicherte Parameter. Auf 0 setzen, um das Caching zu deaktivieren. Diese Variable wird ignoriert, wenn der Wert für PARAMETERS\$1SECRETS\$1EXTENSION\$1CACHE\$1SIZE 0 ist. | 
| Protokollebene | INFO | DEBUG \$1 INFO \$1 WARN \$1 ERROR \$1 NONE | PARAMETERS\$1SECRETS\$1EXTENSION\$1LOG\$1LEVEL | Der Detaillierungsgrad, der in Protokollen für die Erweiterung gemeldet wird | 
| Maximale Verbindungen | 3 | 1 oder höher | PARAMETERS\$1SECRETS\$1EXTENSION\$1MAX\$1CONNECTIONS | Maximale Anzahl von HTTP-Verbindungen für Anforderungen an den Parameter Store oder Secrets Manager | 
| Timeout für Secrets Manager | 0 (kein Timeout) | Alle ganzen Zahlen | SECRETS\$1MANAGER\$1TIMEOUT\$1MILLIS | Timeout für Anfragen an Secrets Manager (in Millisekunden) | 
| Timeout für Parameter Store | 0 (kein Timeout) | Alle ganzen Zahlen | SSM\$1PARAMETER\$1STORE\$1TIMEOUT\$1MILLIS | Timeout für Anfragen an den Parameter Store (in Millisekunden) | 

### Arbeiten mit Secret-Rotation
<a name="lambda-secrets-manager-rotation"></a>

Wenn Sie Secrets häufig rotieren, kann die standardmäßige Cachedauer von 300 Sekunden dazu führen, dass Ihre Funktion veraltete Secrets verwendet. Sie haben zwei Möglichkeiten, um sicherzustellen, dass Ihre Funktion den neuesten Secret-Wert verwendet:
+ Reduzieren Sie die Cache-TTL, indem Sie die `SECRETS_MANAGER_TTL`-Umgebungsvariable auf einen niedrigeren Wert (in Sekunden) setzen. Wenn Sie sie beispielsweise auf `60` einstellen, wird sichergestellt, dass Ihre Funktion niemals ein Secret verwendet, das älter als eine Minute ist.
+ Verwenden Sie die Staging-Bezeichnungen `AWSCURRENT` oder `AWSPREVIOUS` in Ihrer Secret-Anfrage, um sicherzustellen, dass Sie die gewünschte Version erhalten:

  ```
  secretsmanager/get?secretId=YOUR_SECRET_NAME&versionStage=AWSCURRENT
  ```

Wählen Sie den Ansatz, der Ihren Anforderungen an Leistung und Aktualität am besten gerecht wird. Eine niedrigere TTL bedeutet häufigere Aufrufe von Secrets Manager, stellt jedoch sicher, dass Sie mit den aktuellsten Secret-Werten arbeiten.

## Verwenden Sie das Parameter-Hilfsprogramm von Powertools für AWS Lambda
<a name="lambda-secrets-manager-powertools-approach"></a>

Das Parameter-Hilfsprogramm von Powertools for AWS Lambda bietet eine einheitliche Oberfläche zum Abrufen von Geheimnissen von mehreren Anbietern, darunter Secrets Manager, Parameterspeicher und. AppConfig Es übernimmt Caching und Transformationen und bietet im Vergleich zum Erweiterungsansatz eine integriertere Entwicklungserfahrung.

### Vorteile des Parameter-Dienstprogramms
<a name="lambda-secrets-manager-powertools-benefits"></a>
+ **Mehrere Anbieter** — Rufen Sie Parameter aus Secrets Manager und Parameter Store ab und AppConfig verwenden Sie dieselbe Schnittstelle
+ **Integrierte Transformationen** – Automatisches JSON-Parsing, Base64-Decodierung und weitere Datentransformationen
+ **Integriertes Caching** – Konfigurierbares Caching mit TTL-Unterstützung zur Reduzierung von API-Aufrufen
+ **Typsicherheit** — Starke Tippunterstützung in TypeScript und anderen unterstützten Laufzeiten
+ **Fehlerbehandlung** – Integrierte Wiederholungslogik und Fehlerbehandlung

### Codebeispiele
<a name="lambda-secrets-manager-powertools-examples"></a>

Die folgenden Beispiele zeigen, wie Secrets mit dem Parameter-Dienstprogramm in verschiedenen Laufzeiten abgerufen werden:

**Python**  
Vollständige Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Parameter-Dienstprogramm](https://docs.powertools.aws.dev/lambda/python/latest/utilities/parameters/).
Abrufen von Geheimnissen aus Secrets Manager mit dem Hilfsprogramm Powertools for AWS Lambda Parameters.  

```
from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities import parameters

logger = Logger()

def lambda_handler(event, context):
    try:
        # Get secret with caching (default TTL: 5 seconds)
        secret_value = parameters.get_secret("my-secret-name")
        
        # Get secret with custom TTL
        secret_with_ttl = parameters.get_secret("my-secret-name", max_age=300)
        
        # Get secret and transform JSON
        secret_json = parameters.get_secret("my-json-secret", transform="json")
        
        logger.info("Successfully retrieved secrets")
        
        return {
            'statusCode': 200,
            'body': 'Successfully retrieved secrets'
        }
        
    except Exception as e:
        logger.error(f"Error retrieving secret: {str(e)}")
        return {
            'statusCode': 500,
            'body': f'Error: {str(e)}'
        }
```

**TypeScript**  
Vollständige Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Parameter-Dienstprogramm](https://docs.aws.amazon.com/powertools/typescript/2.1.1/utilities/parameters/).
Abrufen von Geheimnissen aus Secrets Manager mit dem Hilfsprogramm Powertools for AWS Lambda Parameters.  

```
import { Logger } from '@aws-lambda-powertools/logger';
import { getSecret } from '@aws-lambda-powertools/parameters/secrets';
import type { Context } from 'aws-lambda';

const logger = new Logger();

export const handler = async (event: any, context: Context) => {
    try {
        // Get secret with caching (default TTL: 5 seconds)
        const secretValue = await getSecret('my-secret-name');
        
        // Get secret with custom TTL
        const secretWithTtl = await getSecret('my-secret-name', { maxAge: 300 });
        
        // Get secret and transform JSON
        const secretJson = await getSecret('my-json-secret', { transform: 'json' });
        
        logger.info('Successfully retrieved secrets');
        
        return {
            statusCode: 200,
            body: 'Successfully retrieved secrets'
        };
        
    } catch (error) {
        logger.error('Error retrieving secret', { error });
        return {
            statusCode: 500,
            body: `Error: ${error}`
        };
    }
};
```

**Java**  
Vollständige Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Parameter-Dienstprogramm](https://docs.powertools.aws.dev/lambda/java/latest/utilities/parameters/).
Abrufen von Geheimnissen aus Secrets Manager mit dem Hilfsprogramm Powertools for AWS Lambda Parameters.  

```
import software.amazon.lambda.powertools.logging.Logging;
import software.amazon.lambda.powertools.parameters.SecretsProvider;
import software.amazon.lambda.powertools.parameters.ParamManager;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class SecretHandler implements RequestHandler<Object, String> {
    
    private final SecretsProvider secretsProvider = ParamManager.getSecretsProvider();
    
    @Logging
    @Override
    public String handleRequest(Object input, Context context) {
        try {
            // Get secret with caching (default TTL: 5 seconds)
            String secretValue = secretsProvider.get("my-secret-name");
            
            // Get secret with custom TTL (300 seconds)
            String secretWithTtl = secretsProvider.withMaxAge(300).get("my-secret-name");
            
            // Get secret and transform JSON
            MySecret secretJson = secretsProvider.get("my-json-secret", MySecret.class);
            
            return "Successfully retrieved secrets";
            
        } catch (Exception e) {
            return "Error retrieving secret: " + e.getMessage();
        }
    }
    
    public static class MySecret {
        // Define your secret structure here
    }
}
```

**.NET**  
Vollständige Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Parameter-Dienstprogramm](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/).
Abrufen von Geheimnissen aus Secrets Manager mit dem Hilfsprogramm Powertools for AWS Lambda Parameters.  

```
using AWS.Lambda.Powertools.Logging;
using AWS.Lambda.Powertools.Parameters;
using Amazon.Lambda.Core;

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

public class Function
{
    private readonly ISecretsProvider _secretsProvider;
    
    public Function()
    {
        _secretsProvider = ParametersManager.SecretsProvider;
    }
    
    [Logging]
    public async Task<string> FunctionHandler(object input, ILambdaContext context)
    {
        try
        {
            // Get secret with caching (default TTL: 5 seconds)
            var secretValue = await _secretsProvider.GetAsync("my-secret-name");
            
            // Get secret with custom TTL
            var secretWithTtl = await _secretsProvider.WithMaxAge(TimeSpan.FromMinutes(5))
                .GetAsync("my-secret-name");
            
            // Get secret and transform JSON
            var secretJson = await _secretsProvider.GetAsync<MySecret>("my-json-secret");
            
            return "Successfully retrieved secrets";
        }
        catch (Exception e)
        {
            return $"Error retrieving secret: {e.Message}";
        }
    }
    
    public class MySecret
    {
        // Define your secret structure here
    }
}
```

### Einrichtung und Berechtigungen
<a name="lambda-secrets-manager-powertools-setup"></a>

Um das Parameter-Dienstprogramm zu verwenden, müssen Sie Folgendes tun:

1. Installieren Sie Powertools für AWS Lambda für Ihre Runtime. Details hierzu finden Sie unter [Powertools for AWS Lambda](powertools-for-lambda.md).

1. Fügen Sie der Ausführungsrolle Ihrer Funktion die erforderlichen IAM-Berechtigungen hinzu. Weitere Einzelheiten finden Sie unter [Verwaltung von Berechtigungen in AWS Lambda](lambda-permissions.md).

1. Konfigurieren Sie optionale Einstellungen über [Umgebungsvariablen](configuration-envvars.md).

Die erforderlichen IAM-Berechtigungen sind dieselben wie beim Erweiterungsansatz. Das Dienstprogramm übernimmt automatisch das Caching und die API-Aufrufe an den Secrets Manager basierend auf Ihrer Konfiguration.

# Verwenden von Lambda mit Amazon SQS
<a name="with-sqs"></a>

**Anmerkung**  
Wenn Sie Daten an ein anderes Ziel als eine Lambda-Funktion senden oder die Daten vor dem Senden anreichern möchten, finden Sie weitere Informationen unter [Amazon EventBridge Pipes](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html).

Mit einer Lambda-Funktion können Sie Nachrichten in einer Amazon-SQS-Warteschlange (Amazon Simple Queue Service) verarbeiten. Lambda unterstützt sowohl [Standard-Warteschlangen](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/standard-queues.html) als auch [First-In-First-Out-Warteschlangen](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html) (FIFO) für [Zuordnungen von Ereignisquellen](invocation-eventsourcemapping.md). Sie können den Bereitstellungsmodus auch verwenden, um spezielle Abfrageressourcen für Ihre Amazon SQS SQS-Ereignisquellenzuordnungen zuzuweisen. [Die Lambda-Funktion und die Amazon SQS SQS-Warteschlange müssen sich in derselben befinden AWS-Region, obwohl sie sich unterscheiden können. AWS-Konten](with-sqs-cross-account-example.md)

Bei der Verarbeitung von Amazon-SQS-Nachrichten müssen Sie eine Logik für teilweise Batch-Antworten implementieren, um zu verhindern, dass versucht wird, erfolgreich verarbeitete Nachrichten erneut zu verarbeiten, wenn einige Nachrichten in einem Batch fehlschlagen. Das [Batch Processor Utility](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) von Powertools for AWS Lambda vereinfacht diese Implementierung, indem es automatisch die Logik der partiellen Batch-Antwort verarbeitet, wodurch die Entwicklungszeit reduziert und die Zuverlässigkeit verbessert wird.

**Topics**
+ [

## Verständnis des Polling- und Batching-Verhaltens für Amazon-SQS-Zuordnungen von Ereignisquellen
](#sqs-polling-behavior)
+ [

## Verwenden des Bereitstellungsmodus mit Amazon SQS SQS-Ereignisquellenzuordnungen
](#sqs-provisioned-mode)
+ [

## Konfiguration des Bereitstellungsmodus für die Zuordnung von Amazon SQS SQS-Ereignisquellen
](#sqs-configuring-provisioned-mode)
+ [

## Beispiel für ein Standard-Warteschlangen-Nachrichtenereignis
](#example-standard-queue-message-event)
+ [

## Beispiel für ein FIFO-Warteschlangen-Nachrichtenereignis
](#sample-fifo-queues-message-event)
+ [

# Erstellen und Konfigurieren einer Amazon SQS-Zuordnung von Ereignisquellen
](services-sqs-configure.md)
+ [

# Konfiguration des Skalierungsverhaltens für SQS-Zuordnungen von Ereignisquellen
](services-sqs-scaling.md)
+ [

# Behandlung von Fehlern für eine SQS-Ereignisquelle in Lambda
](services-sqs-errorhandling.md)
+ [

# Lambdaparameter für Amazon-SQS-Zuordnungen von Ereignisquellen
](services-sqs-parameters.md)
+ [

# Verwendung der Ereignisfilterung mit einer Amazon-SQS-Ereignisquelle
](with-sqs-filtering.md)
+ [

# Tutorial: Verwenden von Lambda mit Amazon SQS
](with-sqs-example.md)
+ [

# Tutorial: Verwenden einer kontoübergreifenden Amazon SQS SQS-Warteschlange als Ereignisquelle
](with-sqs-cross-account-example.md)

## Verständnis des Polling- und Batching-Verhaltens für Amazon-SQS-Zuordnungen von Ereignisquellen
<a name="sqs-polling-behavior"></a>

Mit Amazon-SQS-Zuordnungen von Ereignisquellen fragt Lambda die Warteschlange ab und ruft Ihre Funktion [synchron](invocation-sync.md) mit einem Ereignis auf. Jedes Ereignis kann einen Batch von mehreren Nachrichten aus der Warteschlange enthalten. Lambda empfängt diese Ereignisse jeweils stapelweise und ruft Ihre Funktion für jeden Stapel einmal auf. Wenn Ihre Funktion einen Batch erfolgreich verarbeitet, löscht Lambda deren Nachrichten aus der Warteschlange.

Wenn Lambda einen Batch empfängt, bleiben die Nachrichten in der Warteschlange, werden aber für die Dauer der [Zeitbeschränkung für die Sichtbarkeit](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) der Warteschlange ausgeblendet. Wenn Ihre Funktion alle Nachrichten im Batch erfolgreich verarbeitet hat, löscht Lambda die Nachrichten aus der Warteschlange. Wenn Ihre Funktion bei der Verarbeitung eines Batches auf einen Fehler stößt, werden standardmäßig alle Nachrichten in diesem Batch nach Ablauf des Zeitlimits für die Sichtbarkeit wieder in der Warteschlange sichtbar. Deshalb muss der Funktionscode in der Lage sein, dieselbe Nachricht mehrmals ohne unbeabsichtigte Begleiterscheinungen zu verarbeiten.

**Warnung**  
Zuordnung von Lambda-Ereignisquellen verarbeiten jedes Ereignis mindestens einmal und es kann zu einer doppelten Verarbeitung von Datensätzen kommen. Um mögliche Probleme im Zusammenhang mit doppelten Ereignissen zu vermeiden, empfehlen wir Ihnen dringend, Ihren Funktionscode idempotent zu machen. Weitere Informationen finden Sie im Knowledge Center unter [Wie mache ich meine Lambda-Funktion idempotent](https://repost.aws/knowledge-center/lambda-function-idempotent)?. AWS 

Um zu verhindern, dass Lambda eine Nachricht mehrfach verarbeitet, können Sie entweder Ihre Ereignisquellenzuordnung so konfigurieren, dass [Batch-Elementfehler](services-sqs-errorhandling.md#services-sqs-batchfailurereporting) in Ihre Funktionsantwort aufgenommen werden, oder Sie können die [DeleteMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessage.html)API verwenden, um Nachrichten aus der Warteschlange zu entfernen, wenn Ihre Lambda-Funktion sie erfolgreich verarbeitet.

Weitere Informationen zu Konfigurationsparametern, die Lambda für SQS-Zuordnungen von Ereignisquellen unterstützt, finden Sie unter [Erstellen einer SQS-Zuordnung von Ereignisquellen](services-sqs-configure.md#events-sqs-eventsource).

## Verwenden des Bereitstellungsmodus mit Amazon SQS SQS-Ereignisquellenzuordnungen
<a name="sqs-provisioned-mode"></a>

Für Workloads, bei denen Sie den Durchsatz Ihrer Zuordnung von Ereignisquellen optimieren müssen, können Sie den Bereitstellungsmodus verwenden. Im Bereitstellungsmodus definieren Sie Mindest- und Höchstgrenzen für die Anzahl der bereitgestellten Ereignis-Poller. Diese bereitgestellten Event-Poller sind auf Ihre Zuordnung von Ereignisquellen ausgerichtet und können unerwartete Nachrichtenspitzen durch reaktionsschnelle Autoskalierung bewältigen. Die mit dem Bereitstellungsmodus konfigurierte Amazon SQS SQS-Ereignisquellenzuweisung skaliert dreimal schneller (bis zu 1.000 gleichzeitige Aufrufe pro Minute) und unterstützt eine 16-mal höhere Parallelität (bis zu 20.000 gleichzeitige Aufrufe) als die standardmäßige Amazon SQS SQS-Funktion zur Zuordnung von Ereignisquellen. Wir empfehlen, den Bereitstellungsmodus für ereignisgesteuerte Amazon SQS SQS-Workloads zu verwenden, für die strenge Leistungsanforderungen gelten, z. B. Finanzdienstleister, die Marktdatenfeeds verarbeiten, E-Commerce-Plattformen, die personalisierte Empfehlungen in Echtzeit bereitstellen, und Spieleunternehmen, die Live-Spielerinteraktionen verwalten. Die Verwendung des Bereitstellungsmodus verursacht zusätzliche Kosten. [Eine detaillierte Preisgestaltung finden Sie unter Preise.AWS Lambda](https://aws.amazon.com/lambda/pricing/)

Jeder Event Poller im Bereitstellungsmodus kann bis zu 1 MB/s Durchsatz, bis zu 10 gleichzeitige Aufrufe oder bis zu 10 Amazon SQS-Polling-API-Aufrufe pro Sekunde verarbeiten. Der Bereich der akzeptierten Werte für die Mindestanzahl von Event-Pollern (MinimumPollers) liegt zwischen 2 und 200, der Standardwert ist 2. Der Bereich der akzeptierten Werte für die maximale Anzahl von Event-Pollern (MaximumPollers) liegt zwischen 2 und 2.000, der Standardwert ist 200. MaximumPollers muss größer oder gleich sein MinimumPollers.

### Ermittlung der erforderlichen Event-Poller
<a name="sqs-determining-event-pollers"></a>

Um die Anzahl der Ereignisabfragen zu schätzen, die erforderlich sind, um eine optimale Nachrichtenverarbeitungsleistung sicherzustellen, wenn Sie den Bereitstellungsmodus für SQS ESM verwenden, erfassen Sie die folgenden Metriken für Ihre Anwendung: maximale SQS-Ereignisse pro Sekunde, die eine Verarbeitung mit niedriger Latenz erfordern, durchschnittliche Größe der SQS-Ereignisnutzlast, durchschnittliche Lambda-Funktionsdauer und konfigurierte Batchgröße.

Zunächst können Sie anhand der folgenden Formel die Anzahl der SQS-Ereignisse pro Sekunde (EPS) schätzen, die von einem Event Poller für Ihren Workload unterstützt werden:

```
EPS per event poller = 
        minimum(
            ceiling(1024 / average event size in KB),
            ceiling(10 / average function duration in seconds) * batch size, 
            min(100, 10 * batch size)
                )
```

Anschließend können Sie anhand der folgenden Formel die Anzahl der mindestens erforderlichen Poller berechnen. Diese Berechnung stellt sicher, dass Sie ausreichend Kapazität bereitstellen, um Ihren Spitzenverkehrsanforderungen gerecht zu werden.

```
Required event pollers = (Peak number of events per second in Queue) / EPS per event poller
```

Stellen Sie sich einen Workload mit einer Standard-Batchgröße von 10, einer durchschnittlichen Ereignisgröße von 3 KB, einer durchschnittlichen Funktionsdauer von 100 ms und der Anforderung, 1.000 Ereignisse pro Sekunde zu verarbeiten, vor. In diesem Szenario unterstützt jeder Event Poller ungefähr 100 Ereignisse pro Sekunde (EPS). Daher sollten Sie die Mindestanzahl an Pollern auf 10 festlegen, um Ihren Anforderungen an den Spitzenverkehr angemessen gerecht zu werden. Wenn Ihr Workload dieselben Eigenschaften hat, aber eine durchschnittliche Funktionsdauer von 1 Sekunde hat, unterstützt jeder Poller nur 10 EPS. Sie müssen also mindestens 100 Poller konfigurieren, um 1.000 Ereignisse pro Sekunde bei niedriger Latenz zu unterstützen.

Wir empfehlen die Verwendung einer Standard-Batchgröße von 10 oder höher, um die Effizienz von Event-Pollern im Bereitstellungsmodus zu maximieren. Höhere Batchgrößen ermöglichen es jedem Poller, mehr Ereignisse pro Aufruf zu verarbeiten, was den Durchsatz und die Kosteneffizienz verbessert. Berücksichtigen Sie bei der Planung Ihrer Event-Poller-Kapazität potenzielle Verkehrsspitzen und ziehen Sie in Betracht, den MinimumPollers-Wert etwas höher als das berechnete Minimum festzulegen, um einen Puffer bereitzustellen. Überwachen Sie außerdem Ihre Workload-Merkmale im Zeitverlauf, da Änderungen der Nachrichtengröße, der Funktionsdauer oder der Verkehrsmuster möglicherweise Anpassungen an Ihrer Event-Poller-Konfiguration erforderlich machen, um eine optimale Leistung und Kosteneffizienz zu gewährleisten. Für eine genaue Kapazitätsplanung empfehlen wir, Ihre spezifische Arbeitslast zu testen, um den tatsächlichen Gewinn pro Leistung zu ermitteln, den jeder Event Poller erzielen kann.

## Konfiguration des Bereitstellungsmodus für die Zuordnung von Amazon SQS SQS-Ereignisquellen
<a name="sqs-configuring-provisioned-mode"></a>

Sie können den Bereitstellungsmodus für Ihre Amazon SQS SQS-Ereignisquellenzuordnung mithilfe der Konsole oder der Lambda-API konfigurieren.

**So konfigurieren Sie den Bereitstellungsmodus für eine bestehende Amazon SQS SQS-Ereignisquellenzuordnung (Konsole)**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion mit der Amazon SQS SQS-Ereignisquellenzuordnung aus, für die Sie den Bereitstellungsmodus konfigurieren möchten.

1. Wählen Sie **Konfiguration** und anschließend **Auslöser** aus.

1. **Wählen Sie die Amazon SQS SQS-Ereignisquellenzuordnung aus, für die Sie den Bereitstellungsmodus konfigurieren möchten, und klicken Sie dann auf Bearbeiten.**

1. Wählen Sie unter **Konfiguration der Zuordnung von Ereignisquellen** die Option **Bereitstellungsmodus konfigurieren** aus.
   + Geben Sie für **Minimum Event Pollers** einen Wert zwischen 2 und 200 ein. Wenn Sie keinen Wert angeben, wählt Lambda den Standardwert 2.
   + Geben Sie für **Maximum Event Pollers** einen Wert zwischen 2 und 2.000 ein. Dieser Wert muss größer oder gleich Ihrem Wert für **Minimum Event Pollers** sein. Wenn Sie keinen Wert angeben, wählt Lambda einen Standardwert von 200.

1. Wählen Sie **Speichern**.

Sie können den Bereitstellungsmodus programmgesteuert mithilfe des `ProvisionedPollerConfig` Objekts in Ihrem konfigurieren. `EventSourceMappingConfiguration` Der folgende `UpdateEventSourceMapping` CLI-Befehl konfiguriert beispielsweise einen `MinimumPollers` Wert von 5 und einen `MaximumPollers` Wert von 100.

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --provisioned-poller-config '{"MinimumPollers": 5, "MaximumPollers": 100}'
```

Nachdem Sie den Bereitstellungsmodus konfiguriert haben, können Sie die Verwendung von Event-Pollern für Ihren Workload beobachten, indem Sie die `ProvisionedPollers`-Metrik überwachen. Weitere Informationen finden Sie unter Metriken zur Zuordnung von Ereignisquellen.

Um den Bereitstellungsmodus zu deaktivieren und zum Standardmodus (auf Abruf) zurückzukehren, können Sie den folgenden `UpdateEventSourceMapping` CLI-Befehl verwenden:

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --provisioned-poller-config '{}'
```

**Anmerkung**  
Der Bereitstellungsmodus kann nicht in Verbindung mit der Einstellung für maximale Parallelität verwendet werden. Wenn Sie den Bereitstellungsmodus verwenden, steuern Sie die maximale Parallelität durch die maximale Anzahl von Event-Pollern.

Weitere Informationen zur Konfiguration des Bereitstellungsmodus finden Sie unter. [Erstellen und Konfigurieren einer Amazon SQS-Zuordnung von Ereignisquellen](services-sqs-configure.md)

## Beispiel für ein Standard-Warteschlangen-Nachrichtenereignis
<a name="example-standard-queue-message-event"></a>

**Example Amazon-SQS-Nachrichtenereignis (Standardwarteschlange)**  

```
{
    "Records": [
        {
            "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
            "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1545082649183",
                "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                "ApproximateFirstReceiveTimestamp": "1545082649185"
            },
            "messageAttributes": {
                "myAttribute": {
                    "stringValue": "myValue", 
                    "stringListValues": [], 
                    "binaryListValues": [], 
                    "dataType": "String"
                }
            },
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
            "awsRegion": "us-east-2"
        },
        {
            "messageId": "2e1424d4-f796-459a-8184-9c92662be6da",
            "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1545082650636",
                "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                "ApproximateFirstReceiveTimestamp": "1545082650649"
            },
            "messageAttributes": {},
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
            "awsRegion": "us-east-2"
        }
    ]
}
```

Lambda fragt standardmäßig bis zu 10 Nachrichten in Ihrer Warteschlange sofort ab und sendet diesen Batch an die Funktion. Damit die Funktion nicht mit einer kleinen Anzahl von Datensätzen aufgerufen wird, können Sie die Ereignisquelle so konfigurieren, dass die Datensätze bis zu 5 Minuten lang gepuffert werden, indem Sie ein Batch-Fenster konfigurieren. Vor dem Aufrufen der Funktion fragt Lambda weiter Nachrichten aus der Standardwarteschlange ab, bis das Batch-Fenster abläuft, das [Nutzlastkontingent pro Aufruf](gettingstarted-limits.md) erreicht ist oder die konfigurierte maximale Batch-Größe erreicht ist.

Wenn Sie ein Batch-Fenster verwenden und Ihre SQS-Warteschlange sehr wenig Datenverkehr enthält, wartet Lambda möglicherweise bis zu 20 Sekunden, bevor Sie Ihre Funktion aufruft. Dies gilt auch, wenn Sie ein Batch-Fenster unter 20 Sekunden festlegen. 

**Anmerkung**  
In Java können beim Deserialisieren von JSON Nullzeigerfehler auftreten. Dies könnte daran liegen, dass die Groß- und Kleinschreibung von „Records“ und „eventSourceARN“ vom JSON-Objektmapper konvertiert wird.

## Beispiel für ein FIFO-Warteschlangen-Nachrichtenereignis
<a name="sample-fifo-queues-message-event"></a>

Bei FIFO-Warteschlangen enthalten Datensätze zusätzliche Attribute, die mit der Deduplizierung und Sequenzierung zusammenhängen.

**Example Amazon-SQS-Nachrichtenereignis (FIFO-Warteschlange)**  

```
{
    "Records": [
        {
            "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5",
            "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1573251510774",
                "SequenceNumber": "18849496460467696128",
                "MessageGroupId": "1",
                "SenderId": "AIDAIO23YVJENQZJOL4VO",
                "MessageDeduplicationId": "1",
                "ApproximateFirstReceiveTimestamp": "1573251510774"
            },
            "messageAttributes": {},
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo",
            "awsRegion": "us-east-2"
        }
    ]
}
```

# Erstellen und Konfigurieren einer Amazon SQS-Zuordnung von Ereignisquellen
<a name="services-sqs-configure"></a>

Um Amazon-SQS-Nachrichten mit Lambda zu verarbeiten, konfigurieren Sie Ihre Warteschlange mit den entsprechenden Einstellungen und erstellen Sie dann eine Lambda-Zuordnung von Ereignisquellen.

**Topics**
+ [

## Konfigurieren einer Warteschlange zur Verwendung mit Lambda
](#events-sqs-queueconfig)
+ [

## Einrichten von Lambda-Ausführungsrollenberechtigungen
](#events-sqs-permissions)
+ [

## Erstellen einer SQS-Zuordnung von Ereignisquellen
](#events-sqs-eventsource)

## Konfigurieren einer Warteschlange zur Verwendung mit Lambda
<a name="events-sqs-queueconfig"></a>

Wenn Sie noch nicht über eine Amazon-SQS-Warteschlange verfügen, [erstellen Sie eine](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-create-queue.html) als Ereignisquelle für Ihre Lambda-Funktion. [Die Lambda-Funktion und die Amazon SQS SQS-Warteschlange müssen sich in derselben befinden AWS-Region, obwohl sie sich unterscheiden können. AWS-Konten](with-sqs-cross-account-example.md)

Damit Ihre Funktion genügend Zeit hat, um jeden Stapel von Datensätzen zu verarbeiten, setzen Sie die Zeitüberschreitung für die [Sichtbarkeit der Ausgangswarteschlange](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) auf mindestens das Sechsfache der [Konfigurationszeitüberschreitung](configuration-timeout.md) Ihrer Funktion. Diese zusätzliche Zeit ermöglicht es für Lambda, einen erneuten Versuch zu machen, wenn die Funktion gedrosselt wird, während ein früherer Batch verarbeitet wird.

**Anmerkung**  
Das Timeout Ihrer Funktion muss kleiner oder gleich dem Sichtbarkeits-Timeout der Warteschlange sein. Lambda validiert diese Anforderung, wenn Sie eine Zuordnung von Ereignisquellen erstellen oder aktualisieren, und gibt einen Fehler zurück, wenn das Funktions-Timeout das Sichtbarkeits-Timeout der Warteschlange überschreitet.

Wenn Lambda bei der Verarbeitung eines Stapels auf einen Fehler stößt, kehren standardmäßig alle Nachrichten in diesem Stapel in die Warteschlange zurück. Nach dem [Sichtbarkeits-Timeout](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) werden die Nachrichten wieder für Lambda sichtbar. Sie können Ihre Zuordnung von Ereignisquellen so konfigurieren, dass Sie [partielle Batch-Antworten](services-sqs-errorhandling.md#services-sqs-batchfailurereporting) verwenden, um nur die fehlgeschlagenen Nachrichten an die Warteschlange zurückzugeben. Wenn Ihre Funktion eine Nachricht mehrmals nicht verarbeiten kann, kann Amazon SQS sie außerdem an eine [Warteschlange für unzustellbare Nachrichten](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) senden. Wir empfehlen, das `maxReceiveCount` in der [Redrive-Richtlinie](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html#policies-for-dead-letter-queues) Ihrer Quellwarteschlange auf mindestens 5 zu setzen. Dadurch erhält Lambda einige Chancen, es erneut zu versuchen, bevor fehlgeschlagene Nachrichten direkt an die Warteschlange für unzustellbare Nachrichten gesendet werden.

## Einrichten von Lambda-Ausführungsrollenberechtigungen
<a name="events-sqs-permissions"></a>

Die [ AWSLambdaSQSQueueExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html) AWS verwaltete Richtlinie umfasst die Berechtigungen, die Lambda benötigt, um aus Ihrer Amazon SQS SQS-Warteschlange zu lesen. Sie können diese verwaltete Richtlinie der [Ausführungsrolle](lambda-intro-execution-role.md) Ihrer Funktion hinzufügen.

Wenn Sie optional eine verschlüsselte Warteschlange verwenden, müssen Sie Ihrer Ausführungsrolle auch die folgende Berechtigung hinzufügen:
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)

## Erstellen einer SQS-Zuordnung von Ereignisquellen
<a name="events-sqs-eventsource"></a>

Erstellen Sie ein Ereignisquellen-Mapping, um Lambda anzuweisen, Elemente aus Ihrer Warteschlange an eine Lambda-Funktion zu senden. Sie können mehrere Ereignisquellen-Zuweisungen zum Verarbeiten von Elementen aus mehreren Warteschlangen mit nur einer Funktion erstellen. Wenn Lambda die Zielfunktion aufruft, kann das Ereignis mehrere Elemente bis zu einer konfigurierbaren maximalen *Batch-Größe* enthalten.

Um Ihre Funktion so zu konfigurieren, dass sie aus Amazon SQS liest, fügen Sie die [ AWSLambdaSQSQueueExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html) AWS verwaltete Richtlinie Ihrer Ausführungsrolle hinzu. Erstellen Sie anschließend mithilfe der folgenden Schritte eine Zuordnung der **SQS**-Ereignisquellen von der Konsole aus.

**So fügen Sie Berechtigungen hinzu und erstellen einen Auslöser**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie den Namen einer Funktion aus.

1. Wählen Sie die Registerkarte **Konfiguration** und dann **Berechtigungen** aus.

1. Wählen Sie unter **Rollenname** den Link zu Ihrer Ausführungsrolle. Dieser Link öffnet die Rolle in der IAM-Konsole.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/execution-role.png)

1. Wählen Sie **Berechtigungen hinzufügen** aus und wählen Sie dann **Richtlinien direkt anhängen** aus.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/attach-policies.png)

1. Geben Sie im Suchfeld `AWSLambdaSQSQueueExecutionRole` ein. Fügen Sie diese Richtlinie zu Ihrer Ausführungsrolle hinzu. Dies ist eine AWS verwaltete Richtlinie, die die Berechtigungen enthält, die Ihre Funktion zum Lesen aus einer Amazon SQS SQS-Warteschlange benötigt. Weitere Informationen zu dieser Richtlinie finden Sie [ AWSLambdaSQSQueueExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html)in der *Referenz zu AWS verwalteten Richtlinien.*

1. Gehen Sie zurück zu Ihrer Funktion in der Lambda-Konsole. Wählen Sie unter **Function overview (Funktionsübersicht)** die Option **Add trigger (Trigger hinzufügen)**.  
![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/add-trigger.png)

1. Wählen Sie einen Auslösertyp aus.

1. Konfigurieren Sie die erforderlichen Optionen und wählen Sie dann **Add** (Hinzufügen) aus.

Lambda unterstützt die folgenden Konfigurationsoptionen für Amazon-SQS-Ereignisquellen:

**SQS Queue**  
Die Amazon-SQS-Warteschlange, aus der Datensätze gelesen werden sollen. [Die Lambda-Funktion und die Amazon SQS SQS-Warteschlange müssen sich in derselben befinden AWS-Region, obwohl sie sich unterscheiden können. AWS-Konten](with-sqs-cross-account-example.md)

**Aktivieren von Auslösern**  
Der Status der Zuordnung von Ereignisquellen. **Enable trigger** (Auslöser aktivieren) ist standardmäßig ausgewählt.

**Batch-Größe**  
Die maximale Anzahl der Datensätze, die in jedem Stapel an die Funktion gesendet werden sollen. Bei einer Standardwarteschlange können dies bis zu 10.000 Datensätze sein. Bei einer FIFO-Warteschlange liegt der Höchstwert bei 10. Bei einer Stapelgröße über 10 müssen Sie das Stapelfenster (`MaximumBatchingWindowInSeconds`) zusätzlich auf mindestens 1 Sekunde festlegen.  
Konfigurieren Sie Ihr [Funktions-Timeout](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/configurations#timeouts) so, dass genügend Zeit bleibt, um einen ganzen Stapel von Elementen zu verarbeiten. Wenn die Verarbeitung bestimmter Elemente lange Zeit in Anspruch nimmt, wählen Sie eine kleinere Batch-Größe. Eine große Batchgröße kann die Effizienz für Workloads erhöhen, die sehr schnell sind oder viel Overhead aufweisen. Wenn Sie [reservierte Nebenläufigkeit](configuration-concurrency.md) für Ihre Funktion konfigurieren, legen Sie mindestens fünf gleichzeitige Ausführungen fest, um das Risiko von Drosselungsfehlern zu senken, wenn Lambda die Funktion aufruft.  
Lambda übergibt alle Datensätze im Batch in einem einzigen Aufruf an die Funktion, solange die Gesamtgröße der Ereignisse nicht das [Nutzlastkontingent pro Aufruf](gettingstarted-limits.md) für synchrone Aufrufe überschreitet (6 MB). Sowohl Lambda als auch Amazon SQS generieren Metadaten für jeden Datensatz. Diese zusätzlichen Metadaten werden auf die Gesamtnutzlastgröße angerechnet und können dazu führen, dass die Gesamtzahl der in einem Batch gesendeten Datensätze niedriger ist als die konfigurierte Batch-Größe. Die Metadatenfelder, die Amazon SQS sendet, können in der Länge variabel sein. Weitere Informationen zu den Amazon SQS-Metadatenfeldern finden Sie in der Dokumentation zum [ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)API-Betrieb in der *Amazon Simple Queue Service API-Referenz.*

**Batchfenster**  
Die maximale Zeitspanne zur Erfassung von Datensätzen vor dem Aufruf der Funktion in Sekunden. Dies gilt nur für Standardwarteschlangen.  
Wenn Sie ein Stapelfenster von mehr als 0 Sekunden verwenden, müssen Sie die erhöhte Verarbeitungszeit im [Sichtbarkeits-Timeout](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) Ihrer Warteschlange berücksichtigen. Wir empfehlen, das Sichtbarkeits-Timeout Ihrer Warteschlange auf das Sechsfache Ihres [Funktions-Timeouts](configuration-timeout.md) plus den Wert von `MaximumBatchingWindowInSeconds` festzulegen. Dies gibt Ihrer Lambda-Funktion Zeit, jeden Ereignis-Batch zu verarbeiten und es im Falle eines Drosselungsfehlers erneut zu versuchen.  
Wenn Nachrichten verfügbar werden, beginnt Lambda, Nachrichten stapelweise zu verarbeiten. Lambda beginnt mit der gleichzeitigen Verarbeitung von fünf Stapeln mit fünf gleichzeitigen Aufrufen Ihrer Funktion. Wenn Nachrichten noch verfügbar sind, addiert Lambda bis zu 300 gleichzeitige Aufrufe Ihrer Funktion pro Minute, bis zu einem Maximum von 1.250 gleichzeitigen Aufrufen. Im Bereitstellungsmodus kann jeder Event Poller bis zu 1 MB/s Durchsatz, bis zu 10 gleichzeitige Aufrufe oder bis zu 10 Amazon SQS-Polling-API-Aufrufe pro Sekunde verarbeiten. Lambda skaliert die Anzahl der Event-Poller zwischen Ihrem konfigurierten Minimum und Maximum und fügt schnell bis zu 1.000 gleichzeitige Aufrufe pro Minute hinzu, um eine Verarbeitung Ihrer Amazon SQS SQS-Ereignisse mit geringer Latenz zu gewährleisten. Sie steuern Skalierung und Parallelität über diese minimalen und maximalen Event-Poller-Einstellungen. Weitere Informationen über Funktionsskalierung und Parallelität finden Sie unter. [Verstehen der Skalierung von Lambda-Funktionen](lambda-concurrency.md)  
Um mehr Nachrichten zu verarbeiten, können Sie Ihre Lambda-Funktion für einen höheren Durchsatz optimieren. Weitere Informationen finden Sie unter [Grundlegendes zur AWS Lambda Skalierung mit Amazon SQS SQS-Standardwarteschlangen](https://aws.amazon.com/blogs/compute/understanding-how-aws-lambda-scales-when-subscribed-to-amazon-sqs-queues/#:~:text=If there are more messages,messages from the SQS queue.).

**Filterkriterien**  
Verwenden Sie Filterkriterien, um zu steuern, welche Ereignisse Lambda zur Verarbeitung an Ihre Funktion sendet. Weitere Informationen finden Sie unter [Steuern Sie, welche Ereignisse Lambda an Ihre Funktion sendet](invocation-eventfiltering.md).

**Maximale Parallelität**  
Die maximale Anzahl der gleichzeitigen Funktionen, die die Ereignisquelle aufrufen kann. Kann nicht verwendet werden, wenn der Bereitstellungsmodus aktiviert ist. Weitere Informationen finden Sie unter [Konfigurieren der maximalen Gleichzeitigkeit für Amazon-SQS-Ereignisquellen](services-sqs-scaling.md#events-sqs-max-concurrency).

**Modus bereitgestellter Kapazität**  
Wenn diese Option aktiviert ist, werden spezielle Abfrageressourcen für Ihre Ereignisquellenzuordnung zugewiesen. Sie können die minimale (2-200) und die maximale (2-2000) Anzahl von Event-Pollern konfigurieren. Jeder Event Poller kann bis zu 1 MB/sec Durchsatz, bis zu 10 gleichzeitige Aufrufe oder bis zu 10 Amazon SQS-Polling-API-Aufrufe pro Sekunde verarbeiten.  
Hinweis: Sie können den Bereitstellungsmodus und die Option Maximale Parallelität nicht zusammen verwenden. Wenn der Bereitstellungsmodus aktiviert ist, verwenden Sie die Einstellung für maximale Polleranzahl, um die Parallelität zu steuern.

# Konfiguration des Skalierungsverhaltens für SQS-Zuordnungen von Ereignisquellen
<a name="services-sqs-scaling"></a>

Sie können das Skalierungsverhalten Ihrer Amazon SQS SQS-Ereignisquellenzuordnungen entweder über die Einstellungen für maximale Parallelität oder durch die Aktivierung des Bereitstellungsmodus steuern. Diese Optionen schließen sich gegenseitig aus.

Standardmäßig skaliert Lambda Event-Poller automatisch auf der Grundlage des Nachrichtenvolumens. Wenn Sie den Bereitstellungsmodus aktivieren, weisen Sie eine Mindest- und Höchstzahl an dedizierten Abfrageressourcen zu, die bereit sind, die erwarteten Datenverkehrsmuster zu verarbeiten. Auf diese Weise können Sie die Leistung Ihrer Ereignisquellenzuordnung auf zwei Arten optimieren:
+ Standardmodus (Standard): Lambda verwaltet die Skalierung automatisch, wobei mit einer kleinen Anzahl von Pollern begonnen und je nach Arbeitslast nach oben oder unten skaliert wird.
+ Bereitgestellter Modus: Sie konfigurieren dedizierte Abfrageressourcen mit Mindest- und Höchstgrenzen, was eine dreimal schnellere Skalierung und eine bis zu 16-mal höhere Verarbeitungskapazität ermöglicht.

Bei Standardwarteschlangen verwendet Lambda [Langabfrage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html#sqs-long-polling), um eine Warteschlange so lange abzufragen, bis sie aktiv wird. Wenn Nachrichten verfügbar sind, beginnt Lambda mit der gleichzeitigen Verarbeitung von fünf Stapeln mit fünf gleichzeitigen Aufrufen Ihrer Funktion. Wenn Nachrichten weiterhin verfügbar sind, erhöht Lambda die Anzahl der Prozesse, die Batches lesen, um bis zu 300 gleichzeitige Aufrufe pro Minute. Die maximale Anzahl von Aufrufen, die eine Ereignisquellenzuordnung gleichzeitig verarbeiten kann, beträgt 1.250. Wenn der Verkehr gering ist, reduziert Lambda die Verarbeitung auf fünf gleichzeitige Aufrufe und kann auf bis zu zwei gleichzeitige Aufrufe optimiert werden, um die Amazon SQS SQS-Aufrufe und die entsprechenden Kosten zu reduzieren. Diese Optimierung ist jedoch nicht verfügbar, wenn Sie die Einstellung für maximale Gleichzeitigkeit aktivieren.

Bei FIFO-Warteschlangen sendet Lambda Nachrichten in der Reihenfolge, in der sie empfangen wurden, an Ihre Funktion. Wenn Sie eine Nachricht an eine FIFO-Warteschlange senden, geben Sie eine [Nachrichtengruppen-ID](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html) an. Amazon SQS stellt sicher, dass Nachrichten in derselben Gruppe in der Reihenfolge an Lambda übermittelt werden. Wenn Lambda Ihre Nachrichten in Batches liest, kann jeder Batch Nachrichten aus mehr als einer Nachrichtengruppe enthalten, aber die Reihenfolge der Nachrichten bleibt erhalten. Wenn die Funktion einen Fehler zurückgibt, führt sie alle Wiederholungsversuche für die betroffenen Nachrichten aus, bevor Lambda weitere Nachrichten von derselben Gruppe erhält.

Im Bereitstellungsmodus kann jeder Event Poller bis zu 1 MB/sec Durchsatz, bis zu 10 gleichzeitige Aufrufe oder bis zu 10 Amazon SQS-Polling-API-Aufrufe pro Sekunde verarbeiten. Lambda skaliert die Anzahl der Event-Poller zwischen Ihrem konfigurierten Minimum und Maximum und fügt schnell bis zu 1.000 Parallelität pro Minute hinzu, um eine konsistente Verarbeitung Ihrer Amazon SQS SQS-Ereignisse mit niedriger Latenz zu gewährleisten. Die Verwendung des Bereitstellungsmodus verursacht zusätzliche Kosten. [Eine detaillierte Preisgestaltung finden Sie unter Preise.AWS Lambda](https://aws.amazon.com/lambda/pricing/) Jeder Event Poller verwendet [lange Abfragen](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html) in Ihrer SQS-Warteschlange mit bis zu 10 Abfragen pro Sekunde, wodurch Kosten für SQS-API-Anfragen anfallen. Weitere Informationen finden Sie unter [Amazon SQS SQS-Preise](https://aws.amazon.com/sqs/pricing/ ). Sie steuern Skalierung und Parallelität über diese minimalen und maximalen Event-Poller-Einstellungen, anstatt die Einstellung für maximale Parallelität zu verwenden, da diese Optionen nicht zusammen verwendet werden können.

**Anmerkung**  
Sie können die Einstellung für maximale Parallelität und den Bereitstellungsmodus nicht gleichzeitig verwenden. Wenn der Bereitstellungsmodus aktiviert ist, steuern Sie die Skalierung und Parallelität Ihrer Amazon SQS SQS-Ereignisquellenzuordnung durch die minimale und maximale Anzahl von Event-Pollern.

## Konfigurieren der maximalen Gleichzeitigkeit für Amazon-SQS-Ereignisquellen
<a name="events-sqs-max-concurrency"></a>

Sie können die Einstellung für die maximale Gleichzeitigkeit verwenden, um das Skalierungsverhalten für Ihre SQS-Ereignisquellen zu steuern. Beachten Sie, dass die maximale Parallelität nicht verwendet werden kann, wenn der Bereitstellungsmodus aktiviert ist. Die Einstellung für die maximale Gleichzeitigkeit begrenzt die Anzahl der gleichzeitigen Instances der Funktion, die eine Amazon-SQS-Ereignisquelle aufrufen kann. Die maximale Gleichzeitigkeit ist eine Einstellung auf der Ebene der Ereignisquelle. Wenn Sie einer Funktion mehrere Amazon-SQS-Ereignisquellen zugeordnet haben, kann jede Ereignisquelle eine separate Einstellung für die maximale Gleichzeitigkeit haben. Sie können die maximale Parallelität verwenden, um zu verhindern, dass eine Warteschlange die gesamte [reservierte Gleichzeitigkeit](configuration-concurrency.md) der Funktion oder den Rest des [Gleichzeitigkeitskontingents des Kontos](gettingstarted-limits.md) verwendet. Für die Konfiguration der maximalen Gleichzeitigkeit auf einer Amazon-SQS-Ereignisquelle fallen keine Gebühren an.

Wichtig ist, dass maximale und reservierte Parallelität zwei unabhängige Einstellungen sind. Setzen Sie die maximale Parallelität nicht höher als die reservierte Parallelität der Funktion. Wenn Sie maximale Parallelität konfigurieren, stellen Sie sicher, dass die reservierte Parallelität Ihrer Funktion größer oder gleich der gesamten maximalen Parallelität für alle Amazon SQS-Ereignisquellen auf der Funktion ist. Andernfalls könnte Lambda Ihre Nachrichten drosseln.

Wenn die Gleichzeitigkeitsquote Ihres Kontos auf den Standardwert von 1 000 eingestellt ist, kann eine Amazon-SQS-Zuordnung von Ereignisquellen skaliert werden, um Funktionsinstanzen bis zu diesem Wert aufzurufen, es sei denn, Sie geben eine maximale Gleichzeitigkeit an.

Wenn Sie eine Erhöhung der standardmäßigen Gleichzeitigkeitsquote Ihres Kontos erhalten, kann Lambda möglicherweise keine gleichzeitigen Funktionsinstanzen bis zur neuen Kontingente aufrufen. Standardmäßig kann Lambda so skaliert werden, dass bis zu 1.250 gleichzeitige Funktionsinstanzen für eine Amazon-SQS-Zuordnung von Ereignisquellen aufgerufen werden. Wenn dies für Ihren Anwendungsfall nicht ausreicht, wenden Sie sich an den AWS Support, um eine Erhöhung der Parallelität der Amazon SQS SQS-Ereignisquellenzuordnungen für Ihr Konto zu besprechen.

**Anmerkung**  
Bei FIFO-Warteschlangen werden gleichzeitige Aufrufe entweder durch die Anzahl der [Nachrichtengruppen IDs](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html) (`messageGroupId`) oder durch die Einstellung für maximale Parallelität begrenzt — je nachdem, welcher Wert niedriger ist. Wenn Sie beispielsweise über sechs Nachrichtengruppen verfügen IDs und die maximale Parallelität auf 10 festgelegt ist, kann Ihre Funktion maximal sechs gleichzeitige Aufrufe haben.

Sie können die maximale Gleichzeitigkeit für neue und vorhandene Zuordnung von Ereignisquellen in Amazon SQS konfigurieren.

**Konfigurieren der maximalen Gleichzeitigkeit mithilfe der Lambda-Konsole**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie den Namen einer Funktion aus.

1. Wählen Sie unter **Function overview** (Funktionsübersicht) die Option **SQS** aus. Dadurch wird die Registerkarte **Configuration** (Konfiguration) geöffnet.

1. Wählen Sie den Amazon-SQS-Auslöser aus und klicken Sie auf **Edit** (Bearbeiten).

1. Geben Sie für **Maximum concurrency** (Maximale Gleichzeitigkeit) eine Zahl zwischen 2 und 1 000 ein. Um die maximale Gleichzeitigkeit zu deaktivieren, lassen Sie das Feld leer.

1. Wählen Sie **Speichern**.

**Konfigurieren Sie die maximale Parallelität mit der () AWS Command Line Interface AWS CLI**  
Verwenden Sie den Befehl [update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html) mit der Option `--scaling-config` . Beispiel:

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --scaling-config '{"MaximumConcurrency":5}'
```

Um die maximale Gleichzeitigkeit zu deaktivieren, geben Sie einen leeren Wert für `--scaling-config` ein:

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --scaling-config "{}"
```

**Konfigurieren der maximalen Gleichzeitigkeit mithilfe der Lambda-API**  
Verwenden Sie die [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)Aktion [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)oder mit einem [ScalingConfig](https://docs.aws.amazon.com/lambda/latest/api/API_ScalingConfig.html)Objekt.

# Behandlung von Fehlern für eine SQS-Ereignisquelle in Lambda
<a name="services-sqs-errorhandling"></a>

Um Fehler im Zusammenhang mit einer SQS-Ereignisquelle zu behandeln, verwendet Lambda automatisch eine Wiederholungsstrategie mit einer Backoff-Strategie. Sie können das Verhalten bei der Fehlerbehandlung auch anpassen, indem Sie Ihre SQS-Zuordnung von Ereignisquellen so konfigurieren, dass sie [partielle Batch-Antworten](#services-sqs-batchfailurereporting) zurückgibt.

## Backoff-Strategie für fehlgeschlagene Aufrufe
<a name="services-sqs-backoff-strategy"></a>

Wenn ein Aufruf fehlschlägt, versucht Lambda, den Aufruf zu wiederholen, während eine Backoff-Strategie implementiert wird. Die Backoff-Strategie unterscheidet sich geringfügig, je nachdem, ob Lambda den Fehler aufgrund eines Fehlers in Ihrem Funktionscode oder aufgrund einer Drosselung festgestellt hat.
+  Wenn Ihr **Funktionscode** den Fehler verursacht hat, stoppt Lambda die Verarbeitung und versucht erneut, den Aufruf zu starten. In der Zwischenzeit zieht sich Lambda allmählich zurück und reduziert die Menge der Gleichzeitigkeit, die Ihrer Amazon SQS-Zuordnung von Ereignisquellen zugewiesen wird. Nachdem die Zeitspanne für die Sichtbarkeit Ihrer Warteschlange abgelaufen ist, wird die Nachricht wieder in der Warteschlange erscheinen. 
+ Wenn der Aufruf aufgrund von **Drosselung** fehlschlägt, setzt Lambda schrittweise Wiederholungsversuche zurück, indem es die Menge der Gleichzeitigkeit reduziert, die Ihrer Zuordnung von Ereignisquellen in Amazon SQS zugewiesen ist. Lambda fährt fort, die Nachricht erneut zu versuchen, bis der Zeitstempel der Nachricht das Sichtbarkeits-Timeout Ihrer Warteschlange überschreitet, an welchem Punkt Lambda die Nachricht verwirft.

## Implementierung von partiellen Batch-Antworten
<a name="services-sqs-batchfailurereporting"></a>

Wenn die Lamda-Funktion während der Verarbeitung eines Batches auf einen Fehler stößt, werden standardmäßig alle Nachrichten in diesem Batch wieder in der Warteschlange sichtbar, einschließlich Nachrichten, die Lambda erfolgreich verarbeitet hat. Infolgedessen kann es passieren, dass die Funktion dieselbe Nachricht mehrmals verarbeitet.

Damit nicht erfolgreich bearbeiten Nachrichten in einem fehlgeschlagenen Batch erneut verarbeitet werden, können Sie die Zuordnung von Ereignisquellen so konfigurieren, dass nur die fehlgeschlagenen Nachrichten wieder sichtbar werden. Dies wird als partielle Batch-Antwort bezeichnet. Um partielle Batch-Antworten zu aktivieren, geben Sie `ReportBatchItemFailures` bei der Konfiguration Ihrer Ereignisquellenzuordnung die entsprechende [FunctionResponseTypes](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html#lambda-UpdateEventSourceMapping-request-FunctionResponseTypes)Aktion an. Dadurch kann die Funktion einen Teilerfolg zurückgeben, was die Anzahl unnötiger Wiederholungsversuche für Datensätze reduzieren kann.

**Anmerkung**  
Das [Batch Processor Utility](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) von Powertools for AWS Lambda verarbeitet die gesamte partielle Batch-Antwortlogik automatisch. Dieses Tool vereinfacht die Implementierung von Batch-Verarbeitungsmustern und reduziert den Bedarf an benutzerdefiniertem Code, der für die korrekte Behandlung von Fehlern bei Batch-Elementen erforderlich ist. Es ist für Python, Java, Typescript und .NET verfügbar.

Wenn `ReportBatchItemFailures` aktiviert ist, [skaliert Lambda die Nachrichtenabfrage nicht herunter,](#services-sqs-backoff-strategy) wenn Funktionsaufrufe fehlschlagen. Wenn Sie erwarten, dass einige Nachrichten ausfallen – und Sie nicht möchten, dass sich diese Fehler auf die Nachrichtenverarbeitungsrate auswirken – verwenden Sie `ReportBatchItemFailures`.

**Anmerkung**  
Berücksichtigen Sie bei Verwendung von partiellen Batch-Antworten Folgendes:  
Wenn die Funktion eine Ausnahme ausgibt, gilt der gesamte Batch als fehlgeschlagen.
Wenn Sie dieses Feature mit einer FIFO-Warteschlange verwenden, sollte Ihre Funktion die Verarbeitung von Nachrichten nach dem ersten Fehler beenden und alle fehlgeschlagenen und nicht verarbeiteten Nachrichten in `batchItemFailures` zurückgeben. Das hilft, die Reihenfolge der Nachrichten in der Warteschlange beizubehalten.

**So aktivieren Sie partielle Batchberichterstattung**

1. Sehen Sie sich die [bewährten Methoden für die Implementierung von partiellen Batch-Antworten](https://docs.aws.amazon.com/prescriptive-guidance/latest/lambda-event-filtering-partial-batch-responses-for-sqs/best-practices-partial-batch-responses.html) an.

1. Führen Sie den folgenden Befehl aus, um `ReportBatchItemFailures` für Ihre Funktion zu aktivieren. Führen Sie den Befehl aus, um die UUID Ihrer Ereignisquellenzuordnung abzurufen. [list-event-source-mappings](https://docs.aws.amazon.com/cli/latest/reference/lambda/list-event-source-mappings.html) AWS CLI 

   ```
   aws lambda update-event-source-mapping \
   --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
   --function-response-types "ReportBatchItemFailures"
   ```

1. Aktualisieren Sie Ihren Funktionscode, um alle Ausnahmen abzufangen und fehlgeschlagene Nachrichten in einer `batchItemFailures`-JSON-Antwort zurückzugeben. Die `batchItemFailures` Antwort muss eine Liste von Nachrichten als IDs `itemIdentifier` JSON-Werte enthalten.

   Nehmen wir beispielsweise an, Sie haben einen Stapel von fünf Nachrichten mit Nachricht IDs `id1``id2`,`id3`,`id4`, und`id5`. Die Funktion verarbeitet erfolgreich `id1`, `id3` und `id5`. Damit die Nachrichten `id2` und `id4` in der Warteschlange wieder sichtbar werden, sollte Ihre Funktion folgende Antwort zurückgeben: 

   ```
   { 
     "batchItemFailures": [ 
           {
               "itemIdentifier": "id2"
           },
           {
               "itemIdentifier": "id4"
           }
       ]
   }
   ```

   Hier sind einige Beispiele für Funktionscode, der die Liste der fehlgeschlagenen Nachrichten IDs im Batch zurückgibt:

------
#### [ .NET ]

**SDK für .NET**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melden von SQS-Batchelementfehlern mit Lambda unter Verwendung von .NET.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   using Amazon.Lambda.Core;
   using Amazon.Lambda.SQSEvents;
   
   // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
   [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
   namespace sqsSample;
   
   public class Function
   {
       public async Task<SQSBatchResponse> FunctionHandler(SQSEvent evnt, ILambdaContext context)
       {
           List<SQSBatchResponse.BatchItemFailure> batchItemFailures = new List<SQSBatchResponse.BatchItemFailure>();
           foreach(var message in evnt.Records)
           {
               try
               {
                   //process your message
                   await ProcessMessageAsync(message, context);
               }
               catch (System.Exception)
               {
                   //Add failed message identifier to the batchItemFailures list
                   batchItemFailures.Add(new SQSBatchResponse.BatchItemFailure{ItemIdentifier=message.MessageId}); 
               }
           }
           return new SQSBatchResponse(batchItemFailures);
       }
   
       private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context)
       {
           if (String.IsNullOrEmpty(message.Body))
           {
               throw new Exception("No Body in SQS Message.");
           }
           context.Logger.LogInformation($"Processed message {message.Body}");
           // TODO: Do interesting work based on the new message
           await Task.CompletedTask;
       }
   }
   ```

------
#### [ Go ]

**SDK für Go V2**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melden von SQS-Batchelementfehlern mit Lambda unter Verwendung von Go.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   package main
   
   import (
   	"context"
   	"fmt"
   	"github.com/aws/aws-lambda-go/events"
   	"github.com/aws/aws-lambda-go/lambda"
   )
   
   func handler(ctx context.Context, sqsEvent events.SQSEvent) (map[string]interface{}, error) {
   	batchItemFailures := []map[string]interface{}{}
   
   	for _, message := range sqsEvent.Records {
   		if len(message.Body) > 0 {
   			// Your message processing condition here
   			fmt.Printf("Successfully processed message: %s\n", message.Body)
   		} else {
   			// Message processing failed
   			fmt.Printf("Failed to process message %s\n", message.MessageId)
   			batchItemFailures = append(batchItemFailures, map[string]interface{}{"itemIdentifier": message.MessageId})
   		}
   	}
   
   	sqsBatchResponse := map[string]interface{}{
   		"batchItemFailures": batchItemFailures,
   	}
   	return sqsBatchResponse, nil
   }
   
   func main() {
   	lambda.Start(handler)
   }
   ```

------
#### [ Java ]

**SDK für Java 2.x**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melden von Fehlern bei SQS-Batchelementen mit Lambda unter Verwendung von Java.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   import com.amazonaws.services.lambda.runtime.events.SQSEvent;
   import com.amazonaws.services.lambda.runtime.events.SQSBatchResponse;
    
   import java.util.ArrayList;
   import java.util.List;
    
   public class ProcessSQSMessageBatch implements RequestHandler<SQSEvent, SQSBatchResponse> {
       @Override
       public SQSBatchResponse handleRequest(SQSEvent sqsEvent, Context context) {
            List<SQSBatchResponse.BatchItemFailure> batchItemFailures = new ArrayList<SQSBatchResponse.BatchItemFailure>();
   
            for (SQSEvent.SQSMessage message : sqsEvent.getRecords()) {
                try {
                    //process your message
                } catch (Exception e) {
                    //Add failed message identifier to the batchItemFailures list
                    batchItemFailures.add(new SQSBatchResponse.BatchItemFailure(message.getMessageId()));
                }
            }
            return new SQSBatchResponse(batchItemFailures);
        }
   }
   ```

------
#### [ JavaScript ]

**SDK für JavaScript (v3)**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melden von SQS-Batch-Elementfehlern mit Lambda unter Verwendung von. JavaScript  

   ```
   // Node.js 20.x Lambda runtime, AWS SDK for Javascript V3
   export const handler = async (event, context) => {
       const batchItemFailures = [];
       for (const record of event.Records) {
           try {
               await processMessageAsync(record, context);
           } catch (error) {
               batchItemFailures.push({ itemIdentifier: record.messageId });
           }
       }
       return { batchItemFailures };
   };
   
   async function processMessageAsync(record, context) {
       if (record.body && record.body.includes("error")) {
           throw new Error("There is an error in the SQS Message.");
       }
       console.log(`Processed message: ${record.body}`);
   }
   ```
Melden von SQS-Batch-Elementfehlern mit Lambda unter Verwendung von. TypeScript  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   import { SQSEvent, SQSBatchResponse, Context, SQSBatchItemFailure, SQSRecord } from 'aws-lambda';
   
   export const handler = async (event: SQSEvent, context: Context): Promise<SQSBatchResponse> => {
       const batchItemFailures: SQSBatchItemFailure[] = [];
   
       for (const record of event.Records) {
           try {
               await processMessageAsync(record);
           } catch (error) {
               batchItemFailures.push({ itemIdentifier: record.messageId });
           }
       }
   
       return {batchItemFailures: batchItemFailures};
   };
   
   async function processMessageAsync(record: SQSRecord): Promise<void> {
       if (record.body && record.body.includes("error")) {
           throw new Error('There is an error in the SQS Message.');
       }
       console.log(`Processed message ${record.body}`);
   }
   ```

------
#### [ PHP ]

**SDK für PHP**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melden von SQS-Batchelementfehlern mit Lambda unter Verwendung von PHP.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   <?php
   
   use Bref\Context\Context;
   use Bref\Event\Sqs\SqsEvent;
   use Bref\Event\Sqs\SqsHandler;
   use Bref\Logger\StderrLogger;
   
   require __DIR__ . '/vendor/autoload.php';
   
   class Handler extends SqsHandler
   {
       private StderrLogger $logger;
       public function __construct(StderrLogger $logger)
       {
           $this->logger = $logger;
       }
   
       /**
        * @throws JsonException
        * @throws \Bref\Event\InvalidLambdaEvent
        */
       public function handleSqs(SqsEvent $event, Context $context): void
       {
           $this->logger->info("Processing SQS records");
           $records = $event->getRecords();
   
           foreach ($records as $record) {
               try {
                   // Assuming the SQS message is in JSON format
                   $message = json_decode($record->getBody(), true);
                   $this->logger->info(json_encode($message));
                   // TODO: Implement your custom processing logic here
               } catch (Exception $e) {
                   $this->logger->error($e->getMessage());
                   // failed processing the record
                   $this->markAsFailed($record);
               }
           }
           $totalRecords = count($records);
           $this->logger->info("Successfully processed $totalRecords SQS records");
       }
   }
   
   $logger = new StderrLogger();
   return new Handler($logger);
   ```

------
#### [ Python ]

**SDK für Python (Boto3)**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melden von Fehlern bei SQS-Batchelementen mit Lambda unter Verwendung von Python.  

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   
   def lambda_handler(event, context):
       if event:
           batch_item_failures = []
           sqs_batch_response = {}
        
           for record in event["Records"]:
               try:
                   print(f"Processed message: {record['body']}")
               except Exception as e:
                   batch_item_failures.append({"itemIdentifier": record['messageId']})
           
           sqs_batch_response["batchItemFailures"] = batch_item_failures
           return sqs_batch_response
   ```

------
#### [ Ruby ]

**SDK für Ruby**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda-with-batch-item-handling). 
Melden von Fehlern bei SQS-Batchelementen mit Lambda unter Verwendung von Ruby.  

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   require 'json'
   
   def lambda_handler(event:, context:)
     if event
       batch_item_failures = []
       sqs_batch_response = {}
   
       event["Records"].each do |record|
         begin
           # process message
         rescue StandardError => e
           batch_item_failures << {"itemIdentifier" => record['messageId']}
         end
       end
   
       sqs_batch_response["batchItemFailures"] = batch_item_failures
       return sqs_batch_response
     end
   end
   ```

------
#### [ Rust ]

**SDK für Rust**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melden von Fehlern bei SQS-Batchelementen mit Lambda unter Verwendung von Rust.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   use aws_lambda_events::{
       event::sqs::{SqsBatchResponse, SqsEvent},
       sqs::{BatchItemFailure, SqsMessage},
   };
   use lambda_runtime::{run, service_fn, Error, LambdaEvent};
   
   async fn process_record(_: &SqsMessage) -> Result<(), Error> {
       Err(Error::from("Error processing message"))
   }
   
   async fn function_handler(event: LambdaEvent<SqsEvent>) -> Result<SqsBatchResponse, Error> {
       let mut batch_item_failures = Vec::new();
       for record in event.payload.records {
           match process_record(&record).await {
               Ok(_) => (),
               Err(_) => batch_item_failures.push(BatchItemFailure {
                   item_identifier: record.message_id.unwrap(),
               }),
           }
       }
   
       Ok(SqsBatchResponse {
           batch_item_failures,
       })
   }
   
   #[tokio::main]
   async fn main() -> Result<(), Error> {
       run(service_fn(function_handler)).await
   }
   ```

------

Wenn die fehlgeschlagenen Ereignisse nicht in die Warteschlange zurückkehren, finden Sie weitere Informationen unter [Wie behebe ich Probleme mit der Lambda-Funktion ReportBatchItemFailures SQS](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-sqs-report-batch-item-failures/)? im AWS Knowledge Center.

### Erfolgs- und Misserfolgsbedingungen
<a name="sqs-batchfailurereporting-conditions"></a>

Lambda behandelt einen Batch als komplett erfolgreich, wenn die Funktion eines der folgenden Elemente zurückgibt:
+ Eine leere `batchItemFailures`-Liste
+ Eine ungültige `batchItemFailures`-Liste
+ Ein leeres `EventResponse`
+ Ein ungültiges `EventResponse`

Lambda behandelt einen Batch als komplett fehlgeschlagen, wenn die Funktion eines der folgenden Elemente zurückgibt:
+ Eine ungültige JSON-Antwort
+ Eine leere Zeichenfolge `itemIdentifier`
+ Ein ungültiges `itemIdentifier`
+ Ein `itemIdentifier` mit einem falschen Schlüsselnamen
+ Einen `itemIdentifier`-Wert mit einer Nachrichten-ID, die nicht existiert

### CloudWatch Metriken
<a name="sqs-batchfailurereporting-metrics"></a>

Um festzustellen, ob Ihre Funktion Fehler bei Chargenartikeln korrekt meldet, können Sie die Amazon SQS-Metriken `NumberOfMessagesDeleted` und die `ApproximateAgeOfOldestMessage` Amazon SQS-Metriken in Amazon CloudWatch überwachen.
+ `NumberOfMessagesDeleted` verfolgt die Anzahl der Nachrichten, die aus der Warteschlange entfernt wurden. Wenn der Wert auf 0 sinkt, ist dies ein Zeichen dafür, dass die Funktionsantwort fehlgeschlagene Nachrichten nicht korrekt zurückgibt.
+ `ApproximateAgeOfOldestMessage` verfolgt, wie lange die älteste Nachricht in der Warteschlange geblieben ist. Ein starker Anstieg dieser Metrik kann darauf hinweisen, dass die Funktion fehlgeschlagene Nachrichten nicht korrekt zurückgibt.

### Verwendung von Powertools für AWS Lambda die Batch-Verarbeitung
<a name="services-sqs-batchfailurereporting-powertools"></a>

Das Batchverarbeitungsprogramm von Powertools for verarbeitet AWS Lambda automatisch die Logik für partielle Batch-Antworten und reduziert so die Komplexität der Implementierung von Batch-Fehlerberichten. Hier sind Beispiele für die Verwendung des Batch-Prozessors:

**Python**  
Umfassende Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Batch-Prozessor](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/).
Verarbeitung von Amazon SQS SQS-Nachrichten mit AWS Lambda Batch-Prozessor.  

```
import json
from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType, process_partial_response
from aws_lambda_powertools.utilities.data_classes import SQSEvent
from aws_lambda_powertools.utilities.typing import LambdaContext

processor = BatchProcessor(event_type=EventType.SQS)
logger = Logger()

def record_handler(record):
    logger.info(record)
    # Your business logic here
    # Raise an exception to mark this record as failed
    
def lambda_handler(event, context: LambdaContext):
    return process_partial_response(
        event=event, 
        record_handler=record_handler, 
        processor=processor,
        context=context
    )
```

**TypeScript**  
Umfassende Beispiele und Anweisungen zur Einrichtung finden Sie in der [Dokumentation zum Batch-Prozessor](https://docs.aws.amazon.com/powertools/typescript/latest/features/batch/).
Verarbeitung von Amazon SQS SQS-Nachrichten mit AWS Lambda Batch-Prozessor.  

```
import { BatchProcessor, EventType, processPartialResponse } from '@aws-lambda-powertools/batch';
import { Logger } from '@aws-lambda-powertools/logger';
import type { SQSEvent, Context } from 'aws-lambda';

const processor = new BatchProcessor(EventType.SQS);
const logger = new Logger();

const recordHandler = async (record: any): Promise<void> => {
    logger.info('Processing record', { record });
    // Your business logic here
    // Throw an error to mark this record as failed
};

export const handler = async (event: SQSEvent, context: Context) => {
    return processPartialResponse(event, recordHandler, processor, {
        context,
    });
};
```

# Lambdaparameter für Amazon-SQS-Zuordnungen von Ereignisquellen
<a name="services-sqs-parameters"></a>

Alle Lambda-Ereignisquelltypen verwenden dieselben [CreateEventSourceMapping[UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)API-Operationen. Allerdings gelten nur einige der Parameter für Amazon SQS.


| Parameter | Erforderlich | Standard | Hinweise | 
| --- | --- | --- | --- | 
|  BatchSize  |  N  |  10  |  Bei Standardwarteschlangen beträgt der Maximalwert 10 000. Bei FIFO-Warteschlangen beträgt der Maximalwert 10.  | 
|  Aktiviert  |  N  |  true  | Keine  | 
|  EventSourceArn  |  Y  | – |  Der ARN des Datenstroms oder eines Stream-Konsumenten  | 
|  FunctionName  |  Y  | –  | Keine  | 
|  FilterCriteria  |  N  |  –   |  [Steuern Sie, welche Ereignisse Lambda an Ihre Funktion sendet](invocation-eventfiltering.md)  | 
|  FunctionResponseTypes  |  N  | –  |  Damit Ihre Funktion bestimmte Fehler in einem Batch meldet, beziehen Sie den Wert `ReportBatchItemFailures` in `FunctionResponseTypes` ein. Weitere Informationen finden Sie unter [Implementierung von partiellen Batch-Antworten](services-sqs-errorhandling.md#services-sqs-batchfailurereporting).  | 
|  MaximumBatchingWindowInSeconds  |  N  |  0  | Das Batching-Fenster wird für FIFO-Warteschlangen nicht unterstützt | 
|  ProvisionedPollerConfig  |  N  |  –  |  Konfiguriert die minimale (2-200) und maximale (2-2000) Anzahl von dedizierten Event-Pollern für die SQS-Ereignisquellenzuordnung. Jeder Poller kann bis zu 1 MB/sec Durchsatz und 10 gleichzeitige Aufrufe verarbeiten.  | 
|  ScalingConfig  |  N  |  –   |  [Konfigurieren der maximalen Gleichzeitigkeit für Amazon-SQS-Ereignisquellen](services-sqs-scaling.md#events-sqs-max-concurrency)  | 

# Verwendung der Ereignisfilterung mit einer Amazon-SQS-Ereignisquelle
<a name="with-sqs-filtering"></a>

Sie können die Ereignisfilterung verwenden, um zu steuern, welche Datensätze aus einem Stream oder einer Warteschlange Lambda an Ihre Funktion sendet. Allgemeine Informationen über die Funktionsweise der Ereignisfilterung finden Sie unter [Steuern Sie, welche Ereignisse Lambda an Ihre Funktion sendet](invocation-eventfiltering.md).

Dieser Abschnitt konzentriert sich auf die Ereignisfilterung für Amazon-SQS-Ereignisquellen.

**Anmerkung**  
Amazon-SQS-Zuordnungen von Ereignisquellen unterstützen nur das Filtern nach dem `body`-Schlüssel.

**Topics**
+ [

## Grundlagen der Amazon-SQS-Ereignisfilterung
](#filtering-SQS)

## Grundlagen der Amazon-SQS-Ereignisfilterung
<a name="filtering-SQS"></a>

Angenommen, Ihre Amazon-SQS-Warteschlange enthält Nachrichten im folgenden JSON-Format.

```
{
    "RecordNumber": 1234,
    "TimeStamp": "yyyy-mm-ddThh:mm:ss",
    "RequestCode": "AAAA"
}
```

Ein Beispieldatensatz für diese Warteschlange würde wie folgt aussehen.

```
{
    "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
    "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
    "body": "{\n "RecordNumber": 1234,\n "TimeStamp": "yyyy-mm-ddThh:mm:ss",\n "RequestCode": "AAAA"\n}",
    "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1545082649183",
        "SenderId": "AIDAIENQZJOLO23YVJ4VO",
        "ApproximateFirstReceiveTimestamp": "1545082649185"
        },
    "messageAttributes": {},
    "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
    "eventSource": "aws:sqs",
    "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue",
    "awsRegion": "us-west-2"
}
```

Um anhand des Inhalts Ihrer Amazon-SQS-Nachrichten zu filtern, verwenden Sie den `body`-Schlüssel im Amazon-SQS-Nachrichtendatensatz. Angenommen, Sie möchten nur die Datensätze verarbeiten, bei denen `RequestCode` in Ihrer Amazon-SQS-Nachricht „BBBB“ ist. Das `FilterCriteria`-Objekt würde wie folgt aussehen.

```
{
    "Filters": [
        {
            "Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"
        }
    ]
}
```

Zur Verdeutlichung sehen Sie hier den Wert des Filter-`Pattern` in reinem JSON. 

```
{
    "body": {
        "RequestCode": [ "BBBB" ]
        }
}
```

Sie können Ihren Filter mithilfe der Konsole, AWS CLI oder einer AWS SAM-Vorlage hinzufügen.

------
#### [ Console ]

Um diesen Filter mithilfe der Konsole hinzuzufügen, folgen Sie den Anweisungen unter [Anhängen von Filterkriterien an eine Ereignisquellenzuordnung (Konsole)](invocation-eventfiltering.md#filtering-console) und geben Sie die folgende Zeichenfolge für die **Filterkriterien** ein.

```
{ "body" : { "RequestCode" : [ "BBBB" ] } }
```

------
#### [ AWS CLI ]

Um eine neue Zuordnung von Ereignisquellen mit diesen Filterkriterien über die AWS Command Line Interface (AWS CLI) zu erstellen, führen Sie den folgenden Befehl aus.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'
```

Führen Sie den folgenden Befehl aus, um diese Filterkriterien zu einer vorhandenen Zuordnung von Ereignisquellen hinzuzufügen.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'
```

------
#### [ AWS SAM ]

Um diesen Filter mit der AWS SAM hinzuzufügen, fügen Sie das folgende Snippet zur YAML-Vorlage für Ihre Ereignisquelle hinzu.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "body" : { "RequestCode" : [ "BBBB" ] } }'
```

------

Angenommen, Sie möchten, dass Ihre Funktion nur die Datensätze verarbeitet, bei denen `RecordNumber` größer als 9999 ist. Das `FilterCriteria`-Objekt würde wie folgt aussehen.

```
{
    "Filters": [
        {
            "Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"
        }
    ]
}
```

Zur Verdeutlichung sehen Sie hier den Wert des Filter-`Pattern` in reinem JSON. 

```
{
    "body": {
        "RecordNumber": [
            {
                "numeric": [ ">", 9999 ]
            }
        ]
    }
}
```

Sie können Ihren Filter mithilfe der Konsole, AWS CLI oder einer AWS SAM-Vorlage hinzufügen.

------
#### [ Console ]

Um diesen Filter mithilfe der Konsole hinzuzufügen, folgen Sie den Anweisungen unter [Anhängen von Filterkriterien an eine Ereignisquellenzuordnung (Konsole)](invocation-eventfiltering.md#filtering-console) und geben Sie die folgende Zeichenfolge für die **Filterkriterien** ein.

```
{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }
```

------
#### [ AWS CLI ]

Um eine neue Zuordnung von Ereignisquellen mit diesen Filterkriterien über die AWS Command Line Interface (AWS CLI) zu erstellen, führen Sie den folgenden Befehl aus.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'
```

Führen Sie den folgenden Befehl aus, um diese Filterkriterien zu einer vorhandenen Zuordnung von Ereignisquellen hinzuzufügen.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'
```

------
#### [ AWS SAM ]

Um diesen Filter mit der AWS SAM hinzuzufügen, fügen Sie das folgende Snippet zur YAML-Vorlage für Ihre Ereignisquelle hinzu.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }'
```

------

Für Amazon SQS kann der Nachrichtenkörper eine beliebige Zeichenfolge sein. Dies kann jedoch problematisch sein, wenn die `FilterCriteria` erwarten, dass `body` ein gültiges JSON-Format hat. Umgekehrt gilt dasselbe – wenn der Textkörper der eingehenden Nachricht ein JSON-Format aufweist, die Filterkriterien jedoch erwarten, dass `body` eine einfache Zeichenfolge ist, kann dies zu unbeabsichtigtem Verhalten führen.

Um dieses Problem zu vermeiden, stellen Sie sicher, dass das Körperformat in Ihren `FilterCriteria` mit dem erwarteten Format von `body` in den Nachrichten übereinstimmt, die Sie von Ihrer Warteschlange erhalten. Bevor Sie Ihre Nachrichten filtern, wertet Lambda automatisch das Format des Körpers der eingehenden Nachricht und Ihres Filtermusters für `body` aus. Wenn es keine Übereinstimmung gibt, verwirft Lambda die Nachricht. In der folgenden Tabelle ist diese Auswertung zusammengefasst:


| `body`-Format der eingehenden Nachricht | `body`-Format des Filtermusters | Resultierende Aktion | 
| --- | --- | --- | 
|  Einfache Zeichenfolge  |  Einfache Zeichenfolge  |  Lambda filtert basierend auf Ihren Filterkriterien.  | 
|  Einfache Zeichenfolge  |  Kein Filtermuster für Dateneigenschaften  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Einfache Zeichenfolge  |  Gültiges JSON  |  Lambda verwirft die Nachricht.  | 
|  Gültiges JSON  |  Einfache Zeichenfolge  |  Lambda verwirft die Nachricht.  | 
|  Gültiges JSON  |  Kein Filtermuster für Dateneigenschaften  |  Lambda filtert (nur für die anderen Metadateneigenschaften) basierend auf Ihren Filterkriterien.  | 
|  Gültiges JSON  |  Gültiges JSON  |  Lambda filtert basierend auf Ihren Filterkriterien.  | 

# Tutorial: Verwenden von Lambda mit Amazon SQS
<a name="with-sqs-example"></a>

In diesem Tutorial erstellen Sie eine Lambda-Funktion, die Nachrichten aus einer Warteschlange von [Amazon Simple Queue Service (Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) verarbeitet. Die Lambda-Funktion wird ausgeführt, wenn der Warteschlange eine neue Nachricht hinzugefügt wird. Die Funktion schreibt die Nachrichten in einen Amazon CloudWatch Logs-Stream. Das folgende Diagramm zeigt die AWS -Ressourcen, die Sie zur Durchführung des Tutorials verwenden.

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/sqs_tut_resources.png)


Führen Sie für dieses Tutorial die folgenden Schritte aus:

1. Erstellen Sie eine Lambda-Funktion, die Nachrichten in CloudWatch Logs schreibt.

1. Erstellen einer Amazon SQS-Warteschlange

1. Erstellen Sie eine Zuordnung von Ereignisquellen in Lambda. Die Zuordnung von Ereignisquellen liest die Amazon-SQS-Warteschlange und ruft Ihre Lambda-Funktion auf, wenn eine neue Nachricht hinzugefügt wird.

1. Testen Sie das Setup, indem Sie Nachrichten zu Ihrer Warteschlange hinzufügen und die Ergebnisse in CloudWatch Logs überwachen.

## Voraussetzungen
<a name="with-sqs-prepare"></a>

### Installieren Sie das AWS Command Line Interface
<a name="install_aws_cli"></a>

Wenn Sie das noch nicht installiert haben AWS Command Line Interface, folgen Sie den Schritten unter [Installieren oder Aktualisieren der neuesten Version von AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), um es zu installieren.

Das Tutorial erfordert zum Ausführen von Befehlen ein Befehlszeilenterminal oder eine Shell. Verwenden Sie unter Linux und macOS Ihre bevorzugte Shell und Ihren bevorzugten Paketmanager.

**Anmerkung**  
In Windows werden einige Bash-CLI-Befehle, die Sie häufig mit Lambda verwenden (z. B. `zip`), von den integrierten Terminals des Betriebssystems nicht unterstützt. Um eine in Windows integrierte Version von Ubuntu und Bash zu erhalten, [installieren Sie das Windows-Subsystem für Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). 

## Erstellen der Ausführungsrolle
<a name="with-sqs-create-execution-role"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/sqs_tut_steps1.png)


Eine [Ausführungsrolle](lambda-intro-execution-role.md) ist eine AWS Identity and Access Management (IAM-) Rolle, die einer Lambda-Funktion Zugriff AWS-Services und Ressourcen gewährt. Damit Ihre Funktion Elemente aus Amazon SQS lesen kann, fügen Sie die **AWSLambdaSQSQueueExecutionRole**Berechtigungsrichtlinie bei.

**So erstellen Sie eine Ausführungsrolle und fügen eine Amazon-SQS-Berechtigungsrichtlinie hinzu**

1. Öffnen Sie die Seite [Roles (Rollen)](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie **Rolle erstellen** aus.

1. Wählen Sie unter **Vertrauenswürdiger Entitätstyp** die Option **AWS -Service** aus.

1. Wählen Sie unter **Anwendungsfall** die Option **Lambda** aus.

1. Wählen Sie **Weiter** aus.

1. Geben Sie im Suchfeld **Berechtigungsrichtlinien** die Zeichenfolge **AWSLambdaSQSQueueExecutionRole** ein.

1. Wählen Sie die **AWSLambdaSQSQueueExecutionRole**Richtlinie aus und klicken Sie dann auf **Weiter**.

1. Geben Sie unter **Rollendetails** für **Rollenname** den Namen **lambda-sqs-role** ein und wählen Sie anschließend **Rolle erstellen** aus.

Schreiben Sie sich nach der Erstellung der Rolle den Amazon-Ressourcennamen (ARN) Ihrer Ausführungsrolle auf. Sie werden ihn in späteren Schritten noch benötigen.

## Erstellen der Funktion
<a name="with-sqs-create-function"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/sqs_tut_steps2.png)


Erstellen Sie eine Lambda-Funktion, die Ihre Amazon-SQS-Nachrichten verarbeitet. Der Funktionscode protokolliert den Hauptteil der Amazon SQS-Nachricht in CloudWatch Logs.

Dieses Tutorial verwendet die Runtime Node.js 24, aber wir haben auch Beispielcode in anderen Runtime-Sprachen bereitgestellt. Sie können die Registerkarte im folgenden Feld auswählen, um Code für die gewünschte Laufzeit anzusehen. Der JavaScript Code, den Sie in diesem Schritt verwenden, befindet sich im ersten Beispiel, das auf der **JavaScript**Registerkarte angezeigt wird.

------
#### [ .NET ]

**SDK für .NET**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Nutzen eines SQS-Ereignisses mit Lambda unter Verwendung von .NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
﻿using Amazon.Lambda.Core;
using Amazon.Lambda.SQSEvents;


// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace SqsIntegrationSampleCode
{
    public async Task FunctionHandler(SQSEvent evnt, ILambdaContext context)
    {
        foreach (var message in evnt.Records)
        {
            await ProcessMessageAsync(message, context);
        }

        context.Logger.LogInformation("done");
    }

    private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context)
    {
        try
        {
            context.Logger.LogInformation($"Processed message {message.Body}");

            // TODO: Do interesting work based on the new message
            await Task.CompletedTask;
        }
        catch (Exception e)
        {
            //You can use Dead Letter Queue to handle failures. By configuring a Lambda DLQ.
            context.Logger.LogError($"An error occurred");
            throw;
        }

    }
}
```

------
#### [ Go ]

**SDK für Go V2**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Nutzen eines SQS-Ereignisses mit Lambda unter Verwendung von Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package integration_sqs_to_lambda

import (
	"fmt"
	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(event events.SQSEvent) error {
	for _, record := range event.Records {
		err := processMessage(record)
		if err != nil {
			return err
		}
	}
	fmt.Println("done")
	return nil
}

func processMessage(record events.SQSMessage) error {
	fmt.Printf("Processed message %s\n", record.Body)
	// TODO: Do interesting work based on the new message
	return nil
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK für Java 2.x**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Nutzen eines SQS-Ereignisses mit Lambda unter Verwendung von Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.SQSEvent;
import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage;

public class Function implements RequestHandler<SQSEvent, Void> {
    @Override
    public Void handleRequest(SQSEvent sqsEvent, Context context) {
        for (SQSMessage msg : sqsEvent.getRecords()) {
            processMessage(msg, context);
        }
        context.getLogger().log("done");
        return null;
    }

    private void processMessage(SQSMessage msg, Context context) {
        try {
            context.getLogger().log("Processed message " + msg.getBody());

            // TODO: Do interesting work based on the new message

        } catch (Exception e) {
            context.getLogger().log("An error occurred");
            throw e;
        }

    }
}
```

------
#### [ JavaScript ]

**SDK für JavaScript (v3)**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/blob/main/integration-sqs-to-lambda). 
Konsumieren eines SQS-Ereignisses mit Lambda unter Verwendung. JavaScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
  for (const message of event.Records) {
    await processMessageAsync(message);
  }
  console.info("done");
};

async function processMessageAsync(message) {
  try {
    console.log(`Processed message ${message.body}`);
    // TODO: Do interesting work based on the new message
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```
Konsumieren eines SQS-Ereignisses mit Lambda unter Verwendung. TypeScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { SQSEvent, Context, SQSHandler, SQSRecord } from "aws-lambda";

export const functionHandler: SQSHandler = async (
  event: SQSEvent,
  context: Context
): Promise<void> => {
  for (const message of event.Records) {
    await processMessageAsync(message);
  }
  console.info("done");
};

async function processMessageAsync(message: SQSRecord): Promise<any> {
  try {
    console.log(`Processed message ${message.body}`);
    // TODO: Do interesting work based on the new message
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```

------
#### [ PHP ]

**SDK für PHP**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Nutzen eines SQS-Ereignisses mit Lambda unter Verwendung von PHP.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
<?php

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\InvalidLambdaEvent;
use Bref\Event\Sqs\SqsEvent;
use Bref\Event\Sqs\SqsHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler extends SqsHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws InvalidLambdaEvent
     */
    public function handleSqs(SqsEvent $event, Context $context): void
    {
        foreach ($event->getRecords() as $record) {
            $body = $record->getBody();
            // TODO: Do interesting work based on the new message
        }
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

------
#### [ Python ]

**SDK für Python (Boto3)**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Nutzen eines SQS-Ereignisses mit Lambda unter Verwendung von Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event, context):
    for message in event['Records']:
        process_message(message)
    print("done")

def process_message(message):
    try:
        print(f"Processed message {message['body']}")
        # TODO: Do interesting work based on the new message
    except Exception as err:
        print("An error occurred")
        raise err
```

------
#### [ Ruby ]

**SDK für Ruby**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Nutzen eines SQS-Ereignisses mit Lambda unter Verwendung von Ruby.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event:, context:)
  event['Records'].each do |message|
    process_message(message)
  end
  puts "done"
end

def process_message(message)
  begin
    puts "Processed message #{message['body']}"
    # TODO: Do interesting work based on the new message
  rescue StandardError => err
    puts "An error occurred"
    raise err
  end
end
```

------
#### [ Rust ]

**SDK für Rust**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Nutzen eines SQS-Ereignisses mit Lambda unter Verwendung von Rust.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use aws_lambda_events::event::sqs::SqsEvent;
use lambda_runtime::{run, service_fn, Error, LambdaEvent};

async fn function_handler(event: LambdaEvent<SqsEvent>) -> Result<(), Error> {
    event.payload.records.iter().for_each(|record| {
        // process the record
        tracing::info!("Message body: {}", record.body.as_deref().unwrap_or_default())
    });

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        // disable printing the name of the module in every log line.
        .with_target(false)
        // disabling time is handy because CloudWatch will add the ingestion time.
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

**So erstellen Sie eine Node.js-Lambda-Funktion**

1. Erstellen Sie ein Verzeichnis für das Projekt und wechseln Sie dann zu diesem Verzeichnis.

   ```
   mkdir sqs-tutorial
   cd sqs-tutorial
   ```

1. Kopieren Sie den JavaScript Beispielcode in eine neue Datei mit dem Namen`index.js`.

1. Erstellen Sie ein Bereitstellungspaket mit dem folgenden `zip`-Befehl.

   ```
   zip function.zip index.js
   ```

1. Erstellen Sie eine Lambda-Funktion mithilfe des AWS CLI -Befehls [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html). Geben Sie für den `role`-Parameter den ARN der Ausführungsrolle ein, die Sie zuvor erstellt haben.
**Anmerkung**  
Die Lambda-Funktion und die Amazon-SQS-Warteschlange müssen sich in demselben AWS-Region befinden.

   ```
   aws lambda create-function --function-name ProcessSQSRecord \
   --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
   --role arn:aws:iam::111122223333:role/lambda-sqs-role
   ```

## Testen der Funktion
<a name="with-sqs-create-test-function"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/sqs_tut_steps3.png)


Rufen Sie Ihre Lambda-Funktion manuell mit dem `invoke` AWS CLI Befehl und einem Amazon SQS SQS-Beispielereignis auf.

**So rufen Sie die Lambda-Funktion mit einem Beispielereignis auf**

1. Speichern Sie die folgende JSON als Datei mit dem Namen `input.json`. Dieser JSON-Code simuliert ein Ereignis, das so ggf. von Amazon SQS an Ihre Lambda-Funktion gesendet wird, wobei `"body"` die tatsächliche Nachricht aus der Warteschlange enthält. In diesem Beispiel lautet die Nachricht `"test"`.  
**Example Amazon-SQS-Ereignis**  

   Dies ist ein Testereignis. Nachricht und Kontonummer müssen nicht geändert werden.

   ```
   {
       "Records": [
           {
               "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
               "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
               "body": "test",
               "attributes": {
                   "ApproximateReceiveCount": "1",
                   "SentTimestamp": "1545082649183",
                   "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                   "ApproximateFirstReceiveTimestamp": "1545082649185"
               },
               "messageAttributes": {},
               "md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
               "eventSource": "aws:sqs",
               "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:my-queue",
               "awsRegion": "us-east-1"
           }
       ]
   }
   ```

1. [Führen Sie den folgenden Invoke-Befehl aus.](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html) AWS CLI Dieser Befehl gibt CloudWatch Logs in der Antwort zurück. Weitere Informationen über das Abrufen von Protokollen finden Sie unter [Zugriffs-Logs mit dem AWS CLI](monitoring-cloudwatchlogs-view.md#monitoring-cloudwatchlogs-cli).

   ```
   aws lambda invoke --function-name ProcessSQSRecord --payload file://input.json out --log-type Tail \
   --query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
   ```

   Die **cli-binary-format** Option ist erforderlich, wenn Sie AWS CLI Version 2 verwenden. Um dies zur Standardeinstellung zu machen, führen Sie `aws configure set cli-binary-format raw-in-base64-out` aus. Weitere Informationen finden Sie unter [Von AWS CLI unterstützte globale Befehlszeilenoptionen](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) im *AWS Command Line Interface -Benutzerhandbuch für Version 2*.

1. Suchen Sie in der Antwort nach dem Protokoll `INFO`. Dort protokolliert die Lambda-Funktion den Nachrichtentext. Sie sollten Protokolle sehen, die wie folgt aussehen:

   ```
   2023-09-11T22:45:04.271Z	348529ce-2211-4222-9099-59d07d837b60	INFO	Processed message test
   2023-09-11T22:45:04.288Z	348529ce-2211-4222-9099-59d07d837b60	INFO	done
   ```

## Erstellen einer Amazon-SQS-Warteschlange
<a name="with-sqs-configure-sqs"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/sqs_tut_steps4.png)


Erstellen Sie eine Amazon-SQS-Warteschlange, die die Lambda-Funktion als Ereignisquelle verwenden kann. Die Lambda-Funktion und die Amazon-SQS-Warteschlange müssen sich in demselben AWS-Region befinden.

**So erstellen Sie eine Warteschlange**

1. Öffnen Sie die [Amazon-SQS-Konsole](https://console.aws.amazon.com/sqs).

1. Wählen Sie **Create queue** (Warteschlange erstellen) aus.

1. Geben Sie einen Namen für die Warteschlange ein. Übernehmen Sie bei allen anderen Optionen die Standardeinstellungen.

1. Wählen Sie **Create queue** (Warteschlange erstellen) aus.

Notieren Sie sich nach dem Erstellen der Warteschlange ihren ARN. Sie benötigen ihn im nächsten Schritt, um die Warteschlange Ihrer Lambda-Funktion zuzuordnen.

## Konfigurieren der Ereignisquelle
<a name="with-sqs-attach-notification-configuration"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/sqs_tut_steps5.png)


Verbinden Sie die Amazon-SQS-Warteschlange mit Ihrer Lambda-Funktion, indem Sie eine [Zuordnung von Ereignisquellen](invocation-eventsourcemapping.md) erstellen. Die Zuordnung von Ereignisquellen liest die Amazon-SQS-Warteschlange und ruft Ihre Lambda-Funktion auf, wenn eine neue Nachricht hinzugefügt wird.

Verwenden Sie den Befehl, um eine Zuordnung zwischen Ihrer Amazon SQS SQS-Warteschlange und Ihrer Lambda-Funktion zu erstellen. [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html) AWS CLI Beispiel:

```
aws lambda create-event-source-mapping --function-name ProcessSQSRecord  --batch-size 10 \
--event-source-arn arn:aws:sqs:us-east-1:111122223333:my-queue
```

Verwenden Sie den Befehl, um eine Liste Ihrer Ereignisquellenzuordnungen abzurufen. [list-event-source-mappings](https://awscli.amazonaws.com/v2/documentation/api/2.1.29/reference/lambda/list-event-source-mappings.html) Beispiel:

```
aws lambda list-event-source-mappings --function-name ProcessSQSRecord
```

## Senden einer Testnachricht
<a name="with-sqs-test-message"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/sqs_tut_steps6.png)


**So senden Sie eine Amazon-SQS-Nachricht an die Lambda-Funktion**

1. Öffnen Sie die [Amazon-SQS-Konsole](https://console.aws.amazon.com/sqs).

1. Wählen Sie die Warteschlange aus, die Sie zuvor erstellt haben.

1. Wählen Sie **Nachrichten senden und empfangen**.

1. Geben Sie unter **Nachrichtentext** eine Testnachricht ein (z. B. „Dies ist eine Testnachricht.“).

1. Klicken Sie auf **Send Message (Nachricht senden)**.

Lambda fragt die Warteschlange nach Aktualisierungen ab. Wenn eine neue Nachricht vorliegt, ruft Lambda Ihre Funktion mit diesen neuen Ereignisdaten aus der Warteschlange auf. Wenn der Funktions-Handler ohne Ausnahmen zurückgegeben wird, betrachtet Lambda die Nachricht als erfolgreich verarbeitet und beginnt mit dem Lesen neuer Nachrichten in der Warteschlange. Nach erfolgreicher Verarbeitung einer Nachricht löscht Lambda diese automatisch aus der Warteschlange. Wenn der Handler eine Ausnahme auslöst, betrachtet Lambda den Nachrichten-Batch als nicht erfolgreich verarbeitet und Lambda ruft die Funktion mit demselben Nachrichten-Batch auf.

## Überprüfen Sie die Protokolle CloudWatch
<a name="with-sqs-check-logs"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/sqs_tut_steps7.png)


**So vergewissern Sie sich, dass die Funktion die Nachricht verarbeitet hat**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die SQSRecord Funktion „**Verarbeiten**“.

1. Wählen Sie **Überwachen** aus.

1. Wählen Sie ** CloudWatch Protokolle anzeigen**.

1. Wählen Sie in der CloudWatch Konsole den **Protokollstream** für die Funktion aus.

1. Suchen Sie das Protokoll `INFO`. Dort protokolliert die Lambda-Funktion den Nachrichtentext. Sie sollten die Nachricht sehen, die Sie über die Amazon-SQS-Warteschlange gesendet haben. Beispiel:

   ```
   2023-09-11T22:49:12.730Z b0c41e9c-0556-5a8b-af83-43e59efeec71 INFO Processed message this is a test message.
   ```

## Bereinigen Ihrer Ressourcen
<a name="cleanup"></a>

Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Durch das Löschen von AWS Ressourcen, die Sie nicht mehr verwenden, vermeiden Sie unnötige Kosten für Ihre AWS-Konto.

**So löschen Sie die Ausführungsrolle**

1. Öffnen Sie die Seite [Roles](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie die von Ihnen erstellte Ausführungsrolle aus.

1. Wählen Sie **Löschen** aus.

1. Geben Sie den Namen der Rolle in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie die Lambda-Funktion:**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion aus, die Sie erstellt haben.

1. Wählen Sie **Aktionen**, **Löschen** aus.

1. Geben Sie **confirm** in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie die Amazon-SQS-Warteschlange**

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die Amazon SQS SQS-Konsole unter [https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/).

1. Wählen Sie die Warteschlange aus, die Sie erstellt haben.

1. Wählen Sie **Löschen** aus.

1. Geben Sie **confirm** in das Texteingabefeld ein.

1. Wählen Sie **Löschen** aus.

# Tutorial: Verwenden einer kontoübergreifenden Amazon SQS SQS-Warteschlange als Ereignisquelle
<a name="with-sqs-cross-account-example"></a>

In diesem Tutorial erstellen Sie eine Lambda-Funktion, die Nachrichten aus einer Amazon Simple Queue Service (Amazon SQS) -Warteschlange in einem anderen Konto verarbeitet. AWS Dieses Tutorial umfasst zwei AWS Konten: **Konto A** bezieht sich auf das Konto, das Ihre Lambda-Funktion enthält, und **Konto B bezieht sich auf das Konto**, das die Amazon SQS SQS-Warteschlange enthält.

## Voraussetzungen
<a name="with-sqs-cross-account-prepare"></a>

### Installieren Sie das AWS Command Line Interface
<a name="install_aws_cli"></a>

Wenn Sie das noch nicht installiert haben AWS Command Line Interface, folgen Sie den Schritten unter [Installieren oder Aktualisieren der neuesten Version von AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), um es zu installieren.

Das Tutorial erfordert zum Ausführen von Befehlen ein Befehlszeilenterminal oder eine Shell. Verwenden Sie unter Linux und macOS Ihre bevorzugte Shell und Ihren bevorzugten Paketmanager.

**Anmerkung**  
In Windows werden einige Bash-CLI-Befehle, die Sie häufig mit Lambda verwenden (z. B. `zip`), von den integrierten Terminals des Betriebssystems nicht unterstützt. Um eine in Windows integrierte Version von Ubuntu und Bash zu erhalten, [installieren Sie das Windows-Subsystem für Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). 

## Erstellen der Ausführungsrolle (Konto A)
<a name="with-sqs-cross-account-create-execution-role"></a>

Erstellen Sie in **Konto A** eine [Ausführungsrolle](lambda-intro-execution-role.md), die Ihrer Funktion den Zugriff auf die erforderlichen AWS Ressourcen gewährt.

**So erstellen Sie eine Ausführungsrolle**

1. Öffnen Sie die [Seite Rollen](https://console.aws.amazon.com/iam/home#/roles) in der AWS Identity and Access Management (IAM-) Konsole.

1. Wählen Sie **Rolle erstellen** aus.

1. Erstellen Sie eine Rolle mit den folgenden Eigenschaften.
   + **Vertrauenswürdige Entität** – **AWS Lambda**.
   + **Berechtigungen** – **AWSLambdaSQSQueueExecutionRole**
   + **Role name (Name der Rolle** – **cross-account-lambda-sqs-role**

Die **AWSLambdaSQSQueueExecutionRole**Richtlinie verfügt über die Berechtigungen, die die Funktion zum Lesen von Elementen aus Amazon SQS und zum Schreiben von Protokollen in Amazon CloudWatch Logs benötigt.

## Erstellen Sie die Funktion (Account A)
<a name="with-sqs-cross-account-create-function"></a>

Erstellen Sie in **Konto A** eine Lambda-Funktion, die Ihre Amazon SQS-Nachrichten verarbeitet. Die Lambda-Funktion und die Amazon-SQS-Warteschlange müssen sich in demselben AWS-Region befinden.

Das folgende Codebeispiel für Node.js schreibt jede Nachricht in ein Protokoll in CloudWatch Logs.

**Example index.mjs**  

```
export const handler = async function(event, context) {
  event.Records.forEach(record => {
    const { body } = record;
    console.log(body);
  });
  return {};
}
```

**So erstellen Sie die Funktion**
**Anmerkung**  
Mit diesen Schritten wird eine Node.js-Funktion erstellt. Für andere Sprachen sind die Schritte ähnlich, aber einige Details unterscheiden sich.

1. Speichern Sie das Codebeispiel als Datei mit dem Namen `index.mjs`.

1. Erstellen Sie ein Bereitstellungspaket.

   ```
   zip function.zip index.mjs
   ```

1. Erstellen Sie die Funktion mit dem Befehl `create-function` AWS Command Line Interface (AWS CLI). Ersetzen Sie `arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role` durch den ARN der Ausführungsrolle, die Sie zuvor erstellt haben.

   ```
   aws lambda create-function --function-name CrossAccountSQSExample \
   --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
   --role arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role
   ```

## Testen Sie die Funktion (Konto A)
<a name="with-sqs-cross-account-create-test-function"></a>

Testen Sie in **Konto A** Ihre Lambda-Funktion manuell mithilfe des `invoke` AWS CLI Befehls und eines Amazon SQS SQS-Beispielereignisses.

Wenn der Handler normal und ohne Ausnahmen zurückkehrt, betrachtet Lambda die Nachricht als erfolgreich verarbeitet und beginnt mit dem Lesen neuer Nachrichten in der Warteschlange. Nach erfolgreicher Verarbeitung einer Nachricht löscht Lambda diese automatisch aus der Warteschlange. Wenn der Handler eine Ausnahme auslöst, betrachtet Lambda den Nachrichten-Batch als nicht erfolgreich verarbeitet und Lambda ruft die Funktion mit demselben Nachrichten-Batch auf.

1. Speichern Sie die folgende JSON als Datei mit dem Namen `input.txt`.

   ```
   {
       "Records": [
           {
               "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
               "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
               "body": "test",
               "attributes": {
                   "ApproximateReceiveCount": "1",
                   "SentTimestamp": "1545082649183",
                   "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                   "ApproximateFirstReceiveTimestamp": "1545082649185"
               },
               "messageAttributes": {},
               "md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
               "eventSource": "aws:sqs",
               "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:example-queue",
               "awsRegion": "us-east-1"
           }
       ]
   }
   ```

   Das vorangehende JSON simuliert ein Ereignis, das Amazon SQS an Ihre Lambda-Funktion senden könnte, wobei `"body"` die tatsächliche Nachricht aus der Warteschlange enthält.

1. Führen Sie den Befehl `invoke` AWS CLI aus.

   ```
   aws lambda invoke --function-name CrossAccountSQSExample \
   --cli-binary-format raw-in-base64-out \
   --payload file://input.txt outputfile.txt
   ```

   Die **cli-binary-format** Option ist erforderlich, wenn Sie AWS CLI Version 2 verwenden. Um dies zur Standardeinstellung zu machen, führen Sie `aws configure set cli-binary-format raw-in-base64-out` aus. Weitere Informationen finden Sie unter [Von AWS CLI unterstützte globale Befehlszeilenoptionen](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) im *AWS Command Line Interface -Benutzerhandbuch für Version 2*.

1. Überprüfen Sie die Ausgabe in der Datei `outputfile.txt`.

## Erstellen einer Amazon SQS-Warteschlange (Konto B)
<a name="with-sqs-cross-account-configure-sqs"></a>

Erstellen Sie in **Konto B** eine Amazon SQS-Warteschlange, die die Lambda-Funktion in **Konto A** als Ereignisquelle verwenden kann. Die Lambda-Funktion und die Amazon-SQS-Warteschlange müssen sich in demselben AWS-Region befinden.

**So erstellen Sie eine Warteschlange**

1. Öffnen Sie die [Amazon-SQS-Konsole](https://console.aws.amazon.com/sqs).

1. Wählen Sie **Create queue** (Warteschlange erstellen) aus.

1. Erstellen Sie eine Warteschlange mit den folgenden Eigenschaften.
   + **Typ** – **Standard**
   + **Name (Name** – **LambdaCrossAccountQueue**
   + **Konfiguration** – Behalten Sie die Standardeinstellungen bei.
   + **Zugriffsrichtlinie** – Wählen Sie **Advanced** (Erweitert). Fügen Sie die folgende JSON-Richtlinie ein. Ersetzen Sie die folgenden Werte:
     + `111122223333`: AWS-Konto ID für **Konto A**
     + `444455556666`: AWS-Konto ID für **Konto B**

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Id": "Queue1_Policy_UUID",
         "Statement": [
             {
                 "Sid": "Queue1_AllActions",
                 "Effect": "Allow",
                 "Principal": {
                     "AWS": [
                         "arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role"
                     ]
                 },
                 "Action": "sqs:*",
                 "Resource": "arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue"
             }
         ]
     }
     ```

------

     Diese Richtlinie gewährt der Lambda-Ausführungsrolle in **Konto A** Berechtigungen zur Nutzung von Nachrichten aus dieser Amazon-SQS-Warteschlange.

1. Zeichnen Sie nach dem Erstellen der Warteschlange ihren Amazon-Ressourcennamen (ARN) auf. Sie benötigen ihn im nächsten Schritt, um die Warteschlange Ihrer Lambda-Funktion zuzuordnen.

## Konfigurieren Sie die Ereignisquelle (Konto A)
<a name="with-sqs-cross-account-event-source"></a>

Erstellen Sie in **Konto A eine** Ereignisquellenzuordnung zwischen der Amazon SQS SQS-Warteschlange in **Konto B** und Ihrer Lambda-Funktion, indem Sie den folgenden `create-event-source-mapping` AWS CLI Befehl ausführen. Ersetzen Sie `arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue` durch den ARN der Amazon-SQS-Warteschlange, die Sie im vorherigen Schritt erstellt haben.

```
aws lambda create-event-source-mapping --function-name CrossAccountSQSExample --batch-size 10 \
--event-source-arn arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue
```

Führen Sie den folgenden Befehl aus, um eine Liste Ihrer Ereignisquellen-Zuweisung abzurufen.

```
aws lambda list-event-source-mappings --function-name CrossAccountSQSExample \
--event-source-arn arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue
```

## Testen der Einrichtung
<a name="with-sqs-final-integration-test-no-iam"></a>

Sie können die Einrichtung nun wie folgt testen:

1. In **Konto B** öffnen Sie die [Amazon-SQS-Konsole](https://console.aws.amazon.com/sqs).

1. Wählen Sie **LambdaCrossAccountQueue**, was Sie zuvor erstellt haben.

1. Wählen Sie **Nachrichten senden und empfangen**.

1. Geben Sie unter **Nachrichtentext** eine Testnachricht ein.

1. Klicken Sie auf **Send Message (Nachricht senden)**.

Ihre Lambda-Funktion**Konto A**sollte die Nachricht erhalten. Lambda wird die Warteschlange weiterhin nach Updates abfragen. Wenn eine neue Nachricht vorliegt, ruft Lambda Ihre Funktion mit diesen neuen Ereignisdaten aus der Warteschlange auf. Ihre Funktion wird in Amazon ausgeführt und erstellt Protokolle CloudWatch. Sie können die Protokolle in der [CloudWatch -Konsole](https://console.aws.amazon.com/cloudwatch) ansehen.

## Bereinigen Ihrer Ressourcen
<a name="cleanup"></a>

Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Indem Sie AWS Ressourcen löschen, die Sie nicht mehr verwenden, vermeiden Sie unnötige Kosten für Ihre AWS-Konto.

In :**Konto A**Bereinigen Sie Ihre Ausführungsrolle und Lambda-Funktion.

**So löschen Sie die Ausführungsrolle**

1. Öffnen Sie die Seite [Roles](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie die von Ihnen erstellte Ausführungsrolle aus.

1. Wählen Sie **Löschen** aus.

1. Geben Sie den Namen der Rolle in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie die Lambda-Funktion:**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion aus, die Sie erstellt haben.

1. Wählen Sie **Aktionen**, **Löschen** aus.

1. Geben Sie **confirm** in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

In :**Konto B**Bereinigen Sie die Amazon SQS SQS-Warteschlange.

**So löschen Sie die Amazon-SQS-Warteschlange**

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die Amazon SQS SQS-Konsole unter [https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/).

1. Wählen Sie die Warteschlange aus, die Sie erstellt haben.

1. Wählen Sie **Löschen** aus.

1. Geben Sie **confirm** in das Texteingabefeld ein.

1. Wählen Sie **Löschen** aus.

# Orchestrierung von Lambda-Funktionen mit Step Functions
<a name="with-step-functions"></a>

AWS Step Functions bietet visuelle Workflow-Orchestrierung für die Koordination von Lambda-Funktionen mit anderen Diensten. AWS Mit nativen Integrationen für mehr als 220 AWS Services und einer vollständig verwalteten, wartungsfreien Infrastruktur ist Step Functions ideal, wenn Sie visuelles Workflow-Design und vollständig verwaltete Serviceintegrationen benötigen.

Für die Orchestrierung mithilfe von Standardprogrammiersprachen innerhalb von Lambda, bei denen die Workflow-Logik neben der Geschäftslogik existiert, sollten Sie langlebige [Lambda-Funktionen](durable-functions.md) in Betracht ziehen. Hilfe bei der Auswahl zwischen diesen Optionen finden Sie unter [Dauerhafte Funktionen oder Step Functions](durable-step-functions.md).

Beispielsweise kann die Bearbeitung eines Auftrags die Bestätigung der Auftragsdetails, die Überprüfung der Lagerbestände, die Bearbeitung der Zahlung und die Erstellung einer Rechnung erfordern. Schreiben Sie separate Lambda-Funktionen für jede Aufgabe und verwenden Sie Step Functions, um den Workflow zu verwalten. Step Functions koordiniert den Datenfluss zwischen Ihren Funktionen und behandelt Fehler bei jedem Schritt. Diese Trennung macht es einfacher, Ihre Workflows zu visualisieren, zu ändern und zu verwalten, wenn sie immer komplexer werden.

## Wann sollte Step Functions mit Lambda verwendet werden?
<a name="when-to-use-step-functions"></a>

Die folgenden Szenarien sind gute Beispiele dafür, wann Step Functions besonders gut für die Orchestrierung von Lambda-basierten Anwendungen geeignet ist.
+ [Sequenzielle Verarbeitung](#sequential-processing)
+ [Komplexe Fehlerbehandlung](#complex-error-handling)
+ [Bedingte Workflows und Genehmigungen durch Menschen](#conditional-workflows-human-approvals)
+ [Parallele Verarbeitung](#parallel-processing)

### Sequenzielle Verarbeitung
<a name="sequential-processing"></a>

Bei sequenzieller Verarbeitung muss eine Aufgabe abgeschlossen sein, bevor die nächste Aufgabe beginnen kann. In einem Auftragsverarbeitungssystem kann die Zahlungsabwicklung beispielsweise erst beginnen, wenn die Auftragsvalidierung abgeschlossen ist, und die Rechnungsstellung muss auf die Zahlungsbestätigung warten. Schreiben Sie für jede Aufgabe separate Lambda-Funktionen und verwenden Sie Step Functions, um die Reihenfolge zu verwalten und den Datenfluss zwischen den Funktionen zu steuern.

#### Beispiel für Anti-Muster
<a name="anti-pattern-sequential"></a>

Eine einzige Lambda-Funktion verwaltet den gesamten Auftragsabwicklungsablauf durch Folgendes:
+ Sequenzielles Aufrufen anderer Lambda-Funktionen
+ Analysieren und Validieren der Antworten jeder Funktion
+ Implementierung von Fehlerbehandlungs- und Wiederherstellungslogik
+ Verwaltung des Datenflusses zwischen den Funktionen

#### Empfohlener Ansatz
<a name="recommended-sequential"></a>

Verwenden Sie zwei Lambda-Funktionen: eine zur Bestätigung des Auftrags und eine zur Zahlungsabwicklung. Step Functions koordiniert diese Funktionen durch Folgendes:
+ Ausführung von Aufgaben in der richtigen Reihenfolge
+ Weitergabe von Daten zwischen Funktionen
+ Implementierung der Fehlerbehandlung bei jedem Schritt
+ Verwendung von [Choice](https://docs.aws.amazon.com/step-functions/latest/dg/state-choice.html)-Zuständen, um sicherzustellen, dass nur gültige Aufträge zur Zahlung weitergeleitet werden

**Example Workflow-Diagramm**  

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/sequential_workflow.png)


**Anmerkung**  
**Alternative, bei der der Code an erster Stelle steht:** [Informationen zur sequentiellen Verarbeitung mit codebasiertem Checkpoint und Wiederholungsversuch finden Sie unter Lambda Durable Functions Steps.](durable-basic-concepts.md)

### Komplexe Fehlerbehandlung
<a name="complex-error-handling"></a>

Während Lambda [Wiederholungsfunktionen für asynchrone Aufrufe und Zuordnungen von Ereignisquellen](invocation-retries.md) bietet, bietet Step Functions eine ausgefeiltere Fehlerbehandlung für komplexe Workflows. Sie können [automatische Wiederholungsversuche](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html#error-handling-retrying-after-an-error) mit exponentiellem Backoff konfigurieren und unterschiedliche Wiederholungsrichtlinien für verschiedene Fehlertypen festlegen. Wenn alle Wiederholungsversuche ausgeschöpft sind, verwenden Sie `Catch`, um Fehler in einen [Fallback-Zustand](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html#error-handling-fallback-states) umzuleiten. Dies ist besonders nützlich, wenn Sie eine Fehlerbehandlung auf Workflow-Ebene benötigen, die mehrere Funktionen und Services koordiniert.

Weitere Informationen zur Behandlung von Lambda-Funktionsfehlern in einer Zustandsmaschine finden Sie unter [Behandlung von Fehlern](https://catalog.workshops.aws/stepfunctions/handling-errors) in *The AWS Step Functions Workshop*.

#### Beispiel für Anti-Muster
<a name="anti-pattern-error-handling"></a>

Eine einzige Lambda-Funktion behandelt alle folgenden Aufgaben:
+ Aufrufversuche eines Zahlungsabwicklungsdienstes
+ Wenn der Zahlungsdienst nicht verfügbar ist, wartet die Funktion und versucht es später erneut.
+ Implementierung eines benutzerdefinierten exponentiellen Backoffs für die Wartezeit
+ Nachdem alle Versuche fehlgeschlagen sind, wird der Fehler abgefangen und ein anderer Ablauf gewählt.

#### Empfohlener Ansatz
<a name="recommended-error-handling"></a>

Verwenden Sie eine einzige Lambda-Funktion, die sich ausschließlich auf die Zahlungsabwicklung konzentriert. Step Functions verwaltet die Fehlerbehandlung durch Folgendes:
+ Automatische [Wiederholung fehlgeschlagener Aufgaben mit konfigurierbaren Backoff-Zeiten](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html#error-handling-retrying-after-an-error)
+ Anwendung unterschiedlicher Wiederholungsrichtlinien je nach Fehlertyp
+ Weiterleitung verschiedener Fehlertypen an geeignete Fallback-Zustände
+ Beibehaltung des Status und des Verlaufs der Fehlerbehandlung

**Example Workflow-Diagramm**  

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/error_handling_workflow.png)


**Anmerkung**  
**Alternative, bei der der Code an erster Stelle steht:** Dauerhafte Funktionen ermöglichen die Behandlung von Try-Catch-Fehlern mit konfigurierbaren Wiederholungsstrategien. Siehe [Fehlerbehandlung](durable-execution-sdk-retries.md) bei dauerhaften Funktionen.

### Bedingte Workflows und Genehmigungen durch Menschen
<a name="conditional-workflows-human-approvals"></a>

Verwenden Sie den [Status Step Functions Choice](https://docs.aws.amazon.com/step-functions/latest/dg/state-choice.html), um Workflows auf der Grundlage der Funktionsausgabe weiterzuleiten, und das [waitForTaskToken-Suffix](https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html#connect-wait-token), um Workflows für menschliche Entscheidungen anzuhalten. Um beispielsweise eine Anfrage zur Erhöhung des Kreditlimits zu bearbeiten, verwenden Sie eine Lambda-Funktion, um Risikofaktoren zu bewerten. Verwenden Sie dann Step Functions, um Anfragen mit hohem Risiko an die manuelle Genehmigung und Anfragen mit geringem Risiko an die automatische Genehmigung weiterzuleiten.

*Einen Beispiel-Workflow, der ein Integrationsmuster für Callback-Task-Tokens verwendet, finden Sie unter [Callback with Task Token in The Workshop](https://catalog.workshops.aws/stepfunctions/integrating-services/3-callback-token). AWS Step Functions * 

#### Beispiel für Anti-Muster
<a name="anti-pattern-conditional"></a>

Eine einzige Lambda-Funktion verwaltet einen komplexen Genehmigungsworkflow durch Folgendes:
+ Implementierung einer verschachtelten bedingten Logik zur Bewertung von Kreditanfragen
+ Aufrufen verschiedener Genehmigungsfunktionen auf der Grundlage der Anzahl der Anfragen
+ Verwaltung mehrerer Genehmigungspfade und Entscheidungspunkte
+ Nachverfolgung des Status ausstehender Genehmigungen
+ Implementierung einer Timeout- und Benachrichtigungslogik für Genehmigungen

#### Empfohlener Ansatz
<a name="recommended-conditional"></a>

Verwenden Sie drei Lambda-Funktionen: eine, um das Risiko jeder Anfrage zu bewerten, eine, um Anfragen mit geringem Risiko zu genehmigen, und eine, um Anfragen mit hohem Risiko zur Überprüfung an einen Manager weiterzuleiten. Step Functions steuert den Workflow durch:
+ Verwendung von [Choice](https://docs.aws.amazon.com/step-functions/latest/dg/state-choice.html)-Zuständen zur Weiterleitung von Anfragen basierend auf Betrag und Risikostufe
+ Pausieren der Ausführung bis zur Genehmigung durch einen Menschen
+ Verwaltung von Timeouts für ausstehende Genehmigungen
+ Bereitstellung von Einblicken in den aktuellen Status jeder Anfrage

**Example Workflow-Diagramm**  

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/conditional_workflow.png)


**Anmerkung**  
**Alternative, bei der der Code an erster Stelle steht:** Dauerhafte Funktionen unterstützen Callbacks für Workflows. human-in-the-loop Siehe [Callbacks](durable-execution-sdk.md) in dauerhaften Funktionen.

### Parallele Verarbeitung
<a name="parallel-processing"></a>

Step Functions bietet drei Möglichkeiten, die Parallelverarbeitung zu handhaben:
+ Im [parallelen Status](https://docs.aws.amazon.com/step-functions/latest/dg/state-parallel.html) werden mehrere Zweige Ihres Workflows gleichzeitig ausgeführt. Verwenden Sie diese Option, wenn Sie verschiedene Funktionen parallel ausführen müssen, z. B. das Generieren von Miniaturansichten beim Extrahieren von Bildmetadaten.
+ Der [Inline-Zuordnungszustand](https://docs.aws.amazon.com/step-functions/latest/dg/state-map-inline.html) verarbeitet Datenarrays mit bis zu 40 gleichzeitigen Iterationen. Verwenden Sie dies für kleine bis mittlere Datensätze, bei denen Sie für jedes Element dieselbe Operation ausführen müssen.
+ Der [Zustand „Verteilte Karte“](https://docs.aws.amazon.com/step-functions/latest/dg/state-map-distributed.html) verarbeitet umfangreiche Parallelverarbeitung mit bis zu 10 000 gleichzeitigen Ausführungen und unterstützt sowohl JSON-Arrays als auch Datenquellen von Amazon Simple Storage Service (Amazon S3). Verwenden Sie diese Option, wenn Sie große Datensätze verarbeiten oder wenn Sie eine höhere Gleichzeitigkeit benötigen.

#### Beispiel für Anti-Muster
<a name="anti-pattern-parallel"></a>

Eine einzelne Lambda-Funktion versucht, die Parallelverarbeitung durch Folgendes zu verwalten:
+ Gleichzeitiges Aufrufen mehrerer Bildverarbeitungsfunktionen
+ Implementierung einer benutzerdefinierten Logik für die parallel Ausführung
+ Verwaltung von Timeouts und Fehlerbehandlung für jede parallele Aufgabe
+ Sammeln und Aggregieren von Ergebnissen aus allen Funktionen

#### Empfohlener Ansatz
<a name="recommended-parallel"></a>

Verwenden Sie drei Lambda-Funktionen: eine zum Erstellen eines Miniaturbilds, eine zum Hinzufügen eines Wasserzeichens und eine zum Extrahieren der Metadaten. Step Functions verwaltet diese Funktionen wie folgt:
+ Gleichzeitiges Ausführen aller Funktionen im [parallelen](https://docs.aws.amazon.com/step-functions/latest/dg/state-parallel.html) Status
+ Sammeln der Ergebnisse jeder Funktion in einem geordneten Array
+ Verwaltung von Timeouts und Fehlerbehandlung bei allen parallelen Ausführungen
+ Fortsetzung erst nach Abschluss aller parallelen Zweige

**Example Workflow-Diagramm**  

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/parallel_workflow.png)


**Anmerkung**  
**Alternative, bei der der Code an erster Stelle steht:** Dauerhafte Funktionen stellen Funktionen bereit `parallel()` und funktionieren. `map()` Siehe [Parallele Ausführung](durable-execution-sdk.md).

## Wann sollte Step Functions mit Lambda nicht verwendet werden?
<a name="when-not-to-use"></a>

Nicht alle Lambda-basierten Anwendungen profitieren von der Verwendung von Step Functions. Berücksichtigen Sie diese Szenarien bei der Auswahl Ihrer Anwendungsarchitektur.
+ [Einfache Anwendungen](#simple-applications)
+ [Komplexe Datenverarbeitung](#complex-data-processing)
+ [CPU-intensive Workloads](#cpu-intensive)

### Einfache Anwendungen
<a name="simple-applications"></a>

**Anmerkung**  
Für Workflows, die kein visuelles Design oder umfangreiche Serviceintegrationen erfordern, können [langlebige Lambda-Funktionen](durable-functions.md) eine einfachere Alternative sein, bei der die Workflow-Logik im Code innerhalb von Lambda beibehalten wird.

Bei Anwendungen, die keine komplexe Orchestrierung erfordern, kann die Verwendung von Step Functions zu unnötiger Komplexität führen. Wenn Sie beispielsweise einfach Nachrichten aus einer Amazon SQS SQS-Warteschlange verarbeiten oder auf EventBridge Amazon-Ereignisse reagieren, können Sie diese Dienste so konfigurieren, dass sie Ihre Lambda-Funktionen direkt aufrufen. Besteht Ihre Anwendung hingegen nur aus ein oder zwei Lambda-Funktionen mit unkomplizierter Fehlerbehandlung, so sind direkte Lambda-Aufrufe oder ereignisgesteuerte Architekturen möglicherweise einfacher bereitzustellen und zu verwalten.

### Komplexe Datenverarbeitung
<a name="complex-data-processing"></a>

Mit dem Step-Functions-Zustand [Verteilte Karte](https://docs.aws.amazon.com/step-functions/latest/dg/state-map-distributed.html) können Sie große Amazon-S3-Datensätze parallel mit Lambda-Funktionen verarbeiten. Dies ist für viele umfangreiche parallele Workloads effektiv, einschließlich der Verarbeitung halbstrukturierter Daten wie JSON- oder CSV-Dateien. Für komplexere Datentransformationen oder erweiterte Analytik sollten Sie jedoch die folgenden Alternativen in Betracht ziehen:
+ **Pipelines zur Datentransformation**: Wird AWS Glue für ETL-Jobs verwendet, die strukturierte oder halbstrukturierte Daten aus mehreren Quellen verarbeiten. AWS Glue ist besonders nützlich, wenn Sie integrierte Datenkatalog- und Schemaverwaltungsfunktionen benötigen.
+ **Datenanalytik:** Verwenden Sie Amazon EMR für Datenanalytik im Petabyte-Bereich, insbesondere wenn Sie Tools des Apache Hadoop-Ökosystems benötigen oder für Machine-Learning-Workloads, die die [Speichergrenzen](configuration-memory.md) von Lambda überschreiten.

### CPU-intensive Workloads
<a name="cpu-intensive"></a>

Step Functions kann zwar CPU-intensive Aufgaben orchestrieren, Lambda-Funktionen sind jedoch aufgrund ihrer begrenzten CPU-Ressourcen möglicherweise nicht für diese Workloads geeignet. Für rechenintensive Operationen innerhalb Ihrer Workflows sollten Sie die folgenden Alternativen in Betracht ziehen:
+ **Container-Orchestrierung:** Verwenden Sie Step Functions zur Verwaltung von Aufgaben von Amazon Elastic Container Service (Amazon ECS) für konsistentere und skalierbarere Rechenressourcen.
+ **Stapelverarbeitung:** Integrieren Sie AWS Batch Step Functions zur Verwaltung rechenintensiver Batch-Jobs, die eine kontinuierliche CPU-Auslastung erfordern.

# Aufrufen einer Lambda-Funktion mit Amazon-S3-Batchereignissen
<a name="services-s3-batch"></a>

Sie können Amazon-S3-Batchvorgänge verwenden, um eine Lambda-Funktion für einen großen Satz von Amazon-S3-Objekten aufzurufen. Amazon S3 verfolgt den Fortschritt von Batchvorgängen, sendet Benachrichtigungen und speichert einen Abschlussbericht, der den Status jeder Aktion anzeigt. 

Zum Ausführen eines Batchvorgangs erstellen Sie einen [Amazon-S3-Batchvorgangsauftrag](https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-operations.html). Wenn Sie den Auftrag erstellen, stellen Sie ein Manifest (die Liste der Objekte) bereit und konfigurieren die Aktion für diese Objekte. 

Wenn der Batchauftrag gestartet wird, ruft Amazon S3 die Lambda-Funktion [synchron](invocation-sync.md) für jedes Objekt im Manifest auf. Der Ereignis-Parameter enthält die Namen des Buckets und des Objekts. 

Das folgende Beispiel zeigt das Ereignis, das Amazon S3 an die Lambda-Funktion für ein Objekt mit dem Namen **customerImage1.jpg** im Bucket **amzn-s3-demo-bucket** sendet.

**Example Batch-Anforderungsereignis für Amazon S3**  

```
{
"invocationSchemaVersion": "1.0",
    "invocationId": "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo",
    "job": {
        "id": "f3cc4f60-61f6-4a2b-8a21-d07600c373ce"
    },
    "tasks": [
        {
            "taskId": "dGFza2lkZ29lc2hlcmUK",
            "s3Key": "customerImage1.jpg",
            "s3VersionId": "1",
            "s3BucketArn": "arn:aws:s3:::amzn-s3-demo-bucket"
        }
    ]  
}
```

Ihre Lambda-Funktion muss ein JSON-Objekt mit den Feldern zurückgeben, wie im folgenden Beispiel gezeigt. Sie können den Parameter `invocationId` und `taskId` aus dem Ereignisparameter kopieren. Sie können eine Zeichenfolge in `resultString` zurückgeben. Amazon S3 speichert die `resultString`-Werte im Abschlussbericht. 

**Example Batch-Anforderungantwort für Amazon S3**  

```
{
  "invocationSchemaVersion": "1.0",
  "treatMissingKeysAs" : "PermanentFailure",
  "invocationId" : "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo",
  "results": [
    {
      "taskId": "dGFza2lkZ29lc2hlcmUK",
      "resultCode": "Succeeded",
      "resultString": "[\"Alice\", \"Bob\"]"
    }
  ]
}
```

## Aufrufen von Lambda-Funktionen aus Amazon-S3-Batchvorägngen
<a name="invoking"></a>

Sie können die Lambda-Funktion mit einem nicht qualifizierten oder einem qualifizierten Funktions-ARN aufrufen. Wenn Sie dieselbe Funktionsversion für den gesamten Stapelauftrag verwenden möchten, konfigurieren Sie beim Erstellen des Auftrags eine bestimmte Funktionsversion im Parameter `FunctionARN`. Wenn Sie einen Alias oder den Qualifizierer \$1LATEST konfigurieren, beginnt der Stapelauftrag sofort, die neue Version der Funktion aufzurufen, wenn der Alias oder \$1LATEST während der Auftragsausführung aktualisiert wird. 

Beachten Sie, dass Sie eine vorhandene ereignisbasierte Amazon-S3-Funktion nicht für Batchvorgänge verwenden können. Dies liegt daran, dass der Amazon-S3-Batchvorgang einen anderen Ereignisparameter an die Lambda-Funktion übergibt und eine Rückgabemeldung mit einer bestimmten JSON-Struktur erwartet.

Stellen Sie in der [ressourcenbasierten Richtlinie](access-control-resource-based.md), die Sie für den Amazon-S3-Batchauftrag erstellen, sicher, dass Sie die Berechtigung für den Auftrag zum Aufrufen der Lambda-Funktion festlegen.

Legen Sie in der [Ausführungsrolle](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-iam-role-policies.html) für die Funktion eine Vertrauensrichtlinie fest, damit Amazon S3 die Rolle übernimmt, wenn die Funktion ausgeführt wird.

Wenn Ihre Funktion das AWS SDK zur Verwaltung von Amazon S3 S3-Ressourcen verwendet, müssen Sie der Ausführungsrolle Amazon S3 S3-Berechtigungen hinzufügen. 

Wenn der Auftrag ausgeführt wird, startet Amazon S3 mehrere Funktionsinstances, um die Amazon-S3-Objekte bis zur [Parallelitätsgrenze](lambda-concurrency.md) der Funktion parallel zu verarbeiten. Amazon S3 begrenzt den anfänglichen Hochlauf von Instances, um Überkosten für kleinere Aufträge zu vermeiden. 

Wenn die Lambda-Funktion den Antwortcode `TemporaryFailure` zurückgibt, wiederholt Amazon S3 den Vorgang. 

Weitere Informationen zu Amazon-S3-Stapelvorgängen finden Sie unter [Durchführen von Stapelvorgängen](https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops.html) im *Amazon-S3-Entwicklerhandbuch*. 

Ein Beispiel für die Verwendung einer Lambda-Funktion in Amazon-S3-Stapelvorgängen finden Sie unter [Aufrufen einer Lambda-Funktion von Amazon-S3-Stapelvorgängen](https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-invoke-lambda.html) im *Amazon-S3-Entwicklerhandbuch*. 

# Aufrufen von Lambda-Funktionen mit Amazon-SNS-Benachrichtigungen
<a name="with-sns"></a>

Verwenden Sie eine Lambda-Funktion, um Amazon-Simple-Notification-Service-(Amazon-SNS)-Benachrichtigungen zu verarbeiten. Amazon SNS unterstützt Lambda-Funktionen als Ziel für Nachrichten, die an ein Thema gesendet werden. Sie können Ihre Funktion für Themen in demselben Konto oder in anderen AWS-Konten abonnieren. Eine ausführliche exemplarische Vorgehensweise finden Sie unter [Tutorial: Verwendung AWS Lambda mit Amazon Simple Notification Service](with-sns-example.md).

Lambda unterstützt SNS-Auslöser nur für standardmäßige SNS-Themen. FIFO-Themen werden nicht unterstützt.

Lambda verarbeitet SNS-Nachrichten asynchron, indem die Nachrichten in eine Warteschlange gestellt und Wiederholungsversuche verarbeitet werden. Wenn Amazon SNS Lambda nicht erreichen kann, oder die Nachricht abgelehnt wird, wiederholt Amazon SNS den Vorgang in zunehmenden Intervallen über mehrere Stunden. Weitere Details finden Sie unter [Zuverlässigkeit](https://aws.amazon.com/sns/faqs/#Reliability) in den häufig gestellten Fragen zu Amazon SNS.

**Warnung**  
Asynchrone Lambda-Aufrufe verarbeiten jedes Ereignis mindestens einmal und es kann zu einer doppelten Verarbeitung von Datensätzen kommen. Um mögliche Probleme im Zusammenhang mit doppelten Ereignissen zu vermeiden, empfehlen wir Ihnen dringend, Ihren Funktionscode idempotent zu machen. Weitere Informationen finden Sie unter [Wie mache ich meine Lambda-Funktion idempotent](https://repost.aws/knowledge-center/lambda-function-idempotent) im AWS-Wissenszentrum.

## Idempotenz-Dienstprogramm von Powertools for AWS Lambda
<a name="services-sns-powertools-idempotency"></a>

Das Idempotenz-Dienstprogramm von Powertools for AWS Lambda macht Ihre Lambda-Funktionen idempotent. Es ist für Python, TypeScript, Java und .NET verfügbar. Weitere Informationen finden Sie unter [Idempotency Utility](https://docs.powertools.aws.dev/lambda/python/latest/utilities/idempotency/) in der *Dokumentation zu Powertools for AWS Lambda (Python)*, [Idempotency Utility](https://docs.aws.amazon.com/powertools/typescript/2.1.1/utilities/idempotency/) in der *Dokumentation zu Powertools for AWS Lambda (TypeScript)*, [Idempotency Utility](https://docs.powertools.aws.dev/lambda/java/latest/utilities/idempotency/) in der *Dokumentation zu Powertools for AWS Lambda (Java)* und [Idempotency Utility](https://docs.powertools.aws.dev/lambda/dotnet/utilities/idempotency/) in der *Dokumentation zu Powertools for AWS Lambda (.NET)*.

**Topics**
+ [

## Idempotenz-Dienstprogramm von Powertools for AWS Lambda
](#services-sns-powertools-idempotency)
+ [

## Hinzufügen eines Amazon-SNS-Themenauslösers für eine Lambda-Funktion mithilfe der Konsole
](#sns-trigger-console)
+ [

## Manuelles Hinzufügen eines Amazon-SNS-Themen-Auslösers für eine Lambda-Funktion
](#sns-trigger-manual)
+ [

## Beispiel für eine SNS-Eventform
](#sns-sample-event)
+ [

# Tutorial: Verwendung AWS Lambda mit Amazon Simple Notification Service
](with-sns-example.md)

## Hinzufügen eines Amazon-SNS-Themenauslösers für eine Lambda-Funktion mithilfe der Konsole
<a name="sns-trigger-console"></a>

Um ein SNS-Thema als Auslöser für eine Lambda-Funktion hinzuzufügen, verwenden Sie am einfachsten die Lambda-Konsole. Wenn Sie den Auslöser über die Konsole hinzufügen, richtet Lambda automatisch die erforderlichen Berechtigungen und Abonnements ein, um mit dem Empfang von Ereignissen aus dem SNS-Thema zu beginnen.

**So fügen Sie ein SNS-Thema als Auslöser für eine Lambda-Funktion hinzu (Konsole)**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie den Namen einer Funktion, für die Sie den Auslöser hinzufügen möchten.

1. Wählen Sie **Konfiguration** und anschließend **Auslöser** aus.

1. Wählen Sie **Add trigger**.

1. Wählen Sie unter **Auslöserkonfiguration** im Dropdown-Menü die Option **SNS** aus.

1. Wählen Sie für das **SNS-Thema** das SNS-Thema, das Sie abonnieren möchten.

## Manuelles Hinzufügen eines Amazon-SNS-Themen-Auslösers für eine Lambda-Funktion
<a name="sns-trigger-manual"></a>

Um einen SNS-Auslöser für eine Lambda-Funktion manuell einzurichten, müssen Sie die folgenden Schritte ausführen:
+ Definieren Sie eine ressourcenbasierte Richtlinie für Ihre Funktion, damit SNS sie aufrufen kann.
+ Abonnieren Sie Ihre Lambda-Funktion für das Amazon-SNS-Thema.
**Anmerkung**  
Wenn sich Ihr SNS-Thema und Ihre Lambda-Funktion in verschiedenen AWS-Konten befinden, müssen Sie außerdem zusätzliche Berechtigungen erteilen, um kontenübergreifende Abonnements für das SNS-Thema zu ermöglichen. Weitere Informationen finden Sie unter [Kontoübergreifende Berechtigung für Amazon-SNS-Abonnement erteilen](with-sns-example.md#with-sns-subscription-grant-permission).

Sie können das AWS Command Line Interface (AWS CLI) verwenden, um diese beiden Schritte abzuschließen. Verwenden Sie zunächst den folgenden AWS CLI-Befehl, um eine ressourcenbasierte Richtlinie für eine Lambda-Funktion zu definieren, die SNS-Aufrufe zulässt. Ersetzen Sie den Wert von `--function-name` durch den Namen Ihrer Lambda-Funktion und den Wert von `--source-arn` durch den ARN Ihres SNS-Themas.

```
aws lambda add-permission --function-name example-function \
    --source-arn arn:aws:sns:us-east-1:123456789012:sns-topic-for-lambda \
    --statement-id function-with-sns --action "lambda:InvokeFunction" \
    --principal sns.amazonaws.com
```

Verwenden Sie den folgenden AWS CLI-Befehl, um Ihre Funktion für das SNS-Thema zu abonnieren. Ersetzen Sie den Wert von `--topic-arn` durch Ihren SNS-Themen-ARN und den Wert von `--notification-endpoint` durch Ihren Lambda-Funktions-ARN.

```
aws sns subscribe --protocol lambda \
    --region us-east-1 \
    --topic-arn arn:aws:sns:us-east-1:123456789012:sns-topic-for-lambda \
    --notification-endpoint arn:aws:lambda:us-east-1:123456789012:function:example-function
```

## Beispiel für eine SNS-Eventform
<a name="sns-sample-event"></a>

Amazon SNS ruft Ihre Funktion [asynchron](invocation-async.md) mit einem Ereignis auf, das eine Nachricht und Metadaten enthält.

**Example Amazon-SNS-Nachrichtenereignis**  

```
{
  "Records": [
    {
      "EventVersion": "1.0",
      "EventSubscriptionArn": "arn:aws:sns:us-east-1:123456789012:sns-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
      "EventSource": "aws:sns",
      "Sns": {
        "SignatureVersion": "1",
        "Timestamp": "2019-01-02T12:45:07.000Z",
        "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==",
        "SigningCertURL": "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem",
        "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
        "Message": "Hello from SNS!",
        "MessageAttributes": {
          "Test": {
            "Type": "String",
            "Value": "TestString"
          },
          "TestBinary": {
            "Type": "Binary",
            "Value": "TestBinary"
          }
        },
        "Type": "Notification",
        "UnsubscribeUrl": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&amp;SubscriptionArn=arn:aws:sns:us-east-1:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
        "TopicArn":"arn:aws:sns:us-east-1:123456789012:sns-lambda",
        "Subject": "TestInvoke"
      }
    }
  ]
}
```

# Tutorial: Verwendung AWS Lambda mit Amazon Simple Notification Service
<a name="with-sns-example"></a>

In diesem Tutorial verwenden Sie eine Lambda-Funktion in einem, AWS-Konto um ein Amazon Simple Notification Service (Amazon SNS) -Thema in einem separaten zu abonnieren. AWS-Konto Wenn Sie Nachrichten zu Ihrem Amazon SNS SNS-Thema veröffentlichen, liest Ihre Lambda-Funktion den Inhalt der Nachricht und gibt ihn in Amazon CloudWatch Logs aus. Um dieses Tutorial abzuschließen, verwenden Sie die AWS Command Line Interface ()AWS CLI.

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-sns-tutorial/sns_tut_resources.png)


Gehen Sie für dieses Tutorial wie folgt vor:
+ Erstellen Sie in **Konto A** ein Amazon-SNS-Thema.
+ Erstellen Sie in **Konto B** eine Lambda-Funktion, die Nachrichten aus dem Thema liest.
+ Erstellen Sie in **Konto B** ein Abonnement für das Thema.
+ Veröffentlichen Sie Nachrichten zum Amazon SNS SNS-Thema in **Konto A und stellen** Sie sicher, dass die Lambda-Funktion in **Konto B** sie in Logs ausgibt. CloudWatch 

Anhand dieser Schritte lernen Sie, wie Sie ein Amazon-SNS-Thema konfigurieren, um eine Lambda-Funktion aufzurufen. Sie erfahren auch, wie Sie eine AWS Identity and Access Management (IAM-) Richtlinie erstellen, die einer Ressource in einer anderen die Erlaubnis erteilt AWS-Konto , Lambda aufzurufen.

In dem Tutorial werden zwei separate AWS-Konten verwendet. Die AWS CLI Befehle veranschaulichen dies anhand von zwei benannten Profilen`accountB`, die aufgerufen `accountA` und jeweils für die Verwendung mit einem anderen konfiguriert sind. AWS-Konto Informationen zur Konfiguration der AWS CLI Verwendung verschiedener Profile finden Sie unter [Einstellungen für Konfiguration und Anmeldeinformationsdatei](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) im *AWS Command Line Interface Benutzerhandbuch für Version 2.* Stellen Sie sicher, dass Sie AWS-Region für beide Profile dieselbe Standardeinstellung konfigurieren.

Wenn die AWS CLI Profile, die Sie für die beiden erstellen, unterschiedliche Namen AWS-Konten verwenden, oder wenn Sie das Standardprofil und ein benanntes Profil verwenden, ändern Sie die AWS CLI Befehle in den folgenden Schritten nach Bedarf.

## Voraussetzungen
<a name="with-sns-prereqs"></a>

### Installieren Sie das AWS Command Line Interface
<a name="install_aws_cli"></a>

Wenn Sie das noch nicht installiert haben AWS Command Line Interface, folgen Sie den Schritten unter [Installieren oder Aktualisieren der neuesten Version von AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), um es zu installieren.

Das Tutorial erfordert zum Ausführen von Befehlen ein Befehlszeilenterminal oder eine Shell. Verwenden Sie unter Linux und macOS Ihre bevorzugte Shell und Ihren bevorzugten Paketmanager.

**Anmerkung**  
In Windows werden einige Bash-CLI-Befehle, die Sie häufig mit Lambda verwenden (z. B. `zip`), von den integrierten Terminals des Betriebssystems nicht unterstützt. Um eine in Windows integrierte Version von Ubuntu und Bash zu erhalten, [installieren Sie das Windows-Subsystem für Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). 

## Erstellen eines Amazon-SNS-Themas (Konto A)
<a name="with-sns-create-topic"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_1.png)


**So erstellen Sie das -Thema**
+ Erstellen Sie in **Konto A** mit dem folgenden AWS CLI Befehl ein Amazon SNS SNS-Standardthema.

  ```
  aws sns create-topic --name sns-topic-for-lambda --profile accountA
  ```

  Die Ausgabe sollte in etwa wie folgt aussehen:

  ```
  {
      "TopicArn": "arn:aws:sns:us-west-2:123456789012:sns-topic-for-lambda"
  }
  ```

  Notieren Sie sich den Amazon-Ressourcennamen (ARN) Ihres Themas. Sie benötigen ihn im weiteren Verlauf des Tutorials, wenn Sie Ihrer Lambda-Funktion Berechtigungen zum Abonnieren des Themas hinzufügen.

## Erstellen einer Funktionsausführungsrolle (Konto B)
<a name="with-sns-example-create-iam-role"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_2.png)


Eine Ausführungsrolle ist eine IAM-Rolle, die einer Lambda-Funktion Zugriff AWS-Services und Ressourcen gewährt. Bevor Sie Ihre Funktion in **Konto B** erstellen, erstellen Sie eine Rolle, die der Funktion grundlegende Berechtigungen zum Schreiben von Protokollen in Logs erteilt. CloudWatch Die Berechtigungen zum Lesen aus Ihrem Amazon-SNS-Thema werden in einem späteren Schritt hinzugefügt.

**So erstellen Sie eine Ausführungsrolle**

1. Öffnen Sie in **Konto B** die Seite [Rollen](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie **Rolle erstellen** aus.

1. Wählen Sie unter **Vertrauenswürdiger Entitätstyp** die Option **AWS -Service** aus.

1. Wählen Sie unter **Anwendungsfall** die Option **Lambda** aus.

1. Wählen Sie **Weiter** aus.

1. Fügen Sie der Rolle wie folgt eine Richtlinie mit grundlegenden Berechtigungen hinzu:

   1. Geben Sie im Suchfeld **Berechtigungsrichtlinien** die Zeichenfolge **AWSLambdaBasicExecutionRole** ein.

   1. Wählen Sie **Weiter** aus.

1. Schließen Sie die Rollenerstellung ab:

   1. Geben Sie unter **Rollendetails** im Feld **Rollenname** den Namen **lambda-sns-role** ein.

   1. Wählen Sie **Rolle erstellen** aus.

## Erstellen einer Lambda-Funktion (Konto B)
<a name="with-sns-example-create-test-function"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_3.png)


Erstellen Sie eine Lambda-Funktion, die Ihre Amazon-SNS-Nachrichten verarbeitet. Der Funktionscode protokolliert den Nachrichteninhalt jedes Datensatzes in Amazon CloudWatch Logs.

Dieses Tutorial verwendet die Runtime Node.js 24, aber wir haben auch Beispielcode in anderen Runtime-Sprachen bereitgestellt. Sie können die Registerkarte im folgenden Feld auswählen, um Code für die gewünschte Laufzeit anzusehen. Der JavaScript Code, den Sie in diesem Schritt verwenden, befindet sich im ersten Beispiel, das auf der **JavaScript**Registerkarte angezeigt wird.

------
#### [ .NET ]

**SDK für .NET**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Nutzen eines SNS-Ereignisses mit Lambda unter Verwendung von .NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using Amazon.Lambda.Core;
using Amazon.Lambda.SNSEvents;


// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace SnsIntegration;

public class Function
{
    public async Task FunctionHandler(SNSEvent evnt, ILambdaContext context)
    {
        foreach (var record in evnt.Records)
        {
            await ProcessRecordAsync(record, context);
        }
        context.Logger.LogInformation("done");
    }

    private async Task ProcessRecordAsync(SNSEvent.SNSRecord record, ILambdaContext context)
    {
        try
        {
            context.Logger.LogInformation($"Processed record {record.Sns.Message}");

            // TODO: Do interesting work based on the new message
            await Task.CompletedTask;
        }
        catch (Exception e)
        {
            //You can use Dead Letter Queue to handle failures. By configuring a Lambda DLQ.
            context.Logger.LogError($"An error occurred");
            throw;
        }
    }
}
```

------
#### [ Go ]

**SDK für Go V2**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Nutzen eines SNS-Ereignisses mit Lambda unter Verwendung von Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main

import (
	"context"
	"fmt"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context, snsEvent events.SNSEvent) {
	for _, record := range snsEvent.Records {
		processMessage(record)
	}
	fmt.Println("done")
}

func processMessage(record events.SNSEventRecord) {
	message := record.SNS.Message
	fmt.Printf("Processed message: %s\n", message)
	// TODO: Process your record here
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK für Java 2.x**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Nutzen eines SNS-Ereignisses mit Lambda unter Verwendung von Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.SNSEvent;
import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord;


import java.util.Iterator;
import java.util.List;

public class SNSEventHandler implements RequestHandler<SNSEvent, Boolean> {
    LambdaLogger logger;

    @Override
    public Boolean handleRequest(SNSEvent event, Context context) {
        logger = context.getLogger();
        List<SNSRecord> records = event.getRecords();
        if (!records.isEmpty()) {
            Iterator<SNSRecord> recordsIter = records.iterator();
            while (recordsIter.hasNext()) {
                processRecord(recordsIter.next());
            }
        }
        return Boolean.TRUE;
    }

    public void processRecord(SNSRecord record) {
        try {
            String message = record.getSNS().getMessage();
            logger.log("message: " + message);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}
```

------
#### [ JavaScript ]

**SDK für JavaScript (v3)**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/blob/main/integration-sns-to-lambda). 
Konsumieren eines SNS-Ereignisses mit Lambda unter Verwendung. JavaScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
  for (const record of event.Records) {
    await processMessageAsync(record);
  }
  console.info("done");
};

async function processMessageAsync(record) {
  try {
    const message = JSON.stringify(record.Sns.Message);
    console.log(`Processed message ${message}`);
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```
Konsumieren eines SNS-Ereignisses mit Lambda unter Verwendung. TypeScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { SNSEvent, Context, SNSHandler, SNSEventRecord } from "aws-lambda";

export const functionHandler: SNSHandler = async (
  event: SNSEvent,
  context: Context
): Promise<void> => {
  for (const record of event.Records) {
    await processMessageAsync(record);
  }
  console.info("done");
};

async function processMessageAsync(record: SNSEventRecord): Promise<any> {
  try {
    const message: string = JSON.stringify(record.Sns.Message);
    console.log(`Processed message ${message}`);
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```

------
#### [ PHP ]

**SDK für PHP**  
 Es gibt noch mehr dazu. GitHub Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Nutzen eines SNS-Ereignisses mit Lambda unter Verwendung von PHP  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
<?php

/* 
Since native PHP support for AWS Lambda is not available, we are utilizing Bref's PHP functions runtime for AWS Lambda.
For more information on Bref's PHP runtime for Lambda, refer to: https://bref.sh/docs/runtimes/function

Another approach would be to create a custom runtime. 
A practical example can be found here: https://aws.amazon.com/blogs/apn/aws-lambda-custom-runtime-for-php-a-practical-example/
*/

// Additional composer packages may be required when using Bref or any other PHP functions runtime.
// require __DIR__ . '/vendor/autoload.php';

use Bref\Context\Context;
use Bref\Event\Sns\SnsEvent;
use Bref\Event\Sns\SnsHandler;

class Handler extends SnsHandler
{
    public function handleSns(SnsEvent $event, Context $context): void
    {
        foreach ($event->getRecords() as $record) {
            $message = $record->getMessage();

            // TODO: Implement your custom processing logic here
            // Any exception thrown will be logged and the invocation will be marked as failed

            echo "Processed Message: $message" . PHP_EOL;
        }
    }
}

return new Handler();
```

------
#### [ Python ]

**SDK für Python (Boto3)**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Nutzen eines SNS-Ereignisses mit Lambda unter Verwendung von Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event, context):
    for record in event['Records']:
        process_message(record)
    print("done")

def process_message(record):
    try:
        message = record['Sns']['Message']
        print(f"Processed message {message}")
        # TODO; Process your record here
        
    except Exception as e:
        print("An error occurred")
        raise e
```

------
#### [ Ruby ]

**SDK für Ruby**  
 Es gibt noch mehr GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Nutzen eines SNS-Ereignisses mit Lambda unter Verwendung von Ruby.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event:, context:)
  event['Records'].map { |record| process_message(record) }
end

def process_message(record)
  message = record['Sns']['Message']
  puts("Processing message: #{message}")
rescue StandardError => e
  puts("Error processing message: #{e}")
  raise
end
```

------
#### [ Rust ]

**SDK für Rust**  
 Es gibt noch mehr dazu GitHub. Das vollständige Beispiel sowie eine Anleitung zum Einrichten und Ausführen finden Sie im Repository mit [Serverless-Beispielen](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Nutzen eines SNS-Ereignisses mit Lambda unter Verwendung von Rust  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use aws_lambda_events::event::sns::SnsEvent;
use aws_lambda_events::sns::SnsRecord;
use lambda_runtime::{run, service_fn, Error, LambdaEvent};
use tracing::info;

// Built with the following dependencies:
//  aws_lambda_events = { version = "0.10.0", default-features = false, features = ["sns"] }
//  lambda_runtime = "0.8.1"
//  tokio = { version = "1", features = ["macros"] }
//  tracing = { version = "0.1", features = ["log"] }
//  tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] }

async fn function_handler(event: LambdaEvent<SnsEvent>) -> Result<(), Error> {
    for event in event.payload.records {
        process_record(&event)?;
    }
    
    Ok(())
}

fn process_record(record: &SnsRecord) -> Result<(), Error> {
    info!("Processing SNS Message: {}", record.sns.message);

    // Implement your record handling code here.

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        .with_target(false)
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

**So erstellen Sie die Funktion**

1. Erstellen Sie ein Verzeichnis für das Projekt und wechseln Sie dann zu diesem Verzeichnis.

   ```
   mkdir sns-tutorial
   cd sns-tutorial
   ```

1. Kopieren Sie den JavaScript Beispielcode in eine neue Datei mit dem Namen`index.js`.

1. Erstellen Sie ein Bereitstellungspaket mit dem folgenden `zip`-Befehl.

   ```
   zip function.zip index.js
   ```

1. Führen Sie den folgenden AWS CLI Befehl aus, um Ihre Lambda-Funktion in **Konto B** zu erstellen.

   ```
   aws lambda create-function --function-name Function-With-SNS \
       --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
       --role arn:aws:iam::<AccountB_ID>:role/lambda-sns-role  \
       --timeout 60 --profile accountB
   ```

   Die Ausgabe sollte in etwa wie folgt aussehen:

   ```
   {
       "FunctionName": "Function-With-SNS",
       "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:Function-With-SNS",
       "Runtime": "nodejs24.x",
       "Role": "arn:aws:iam::123456789012:role/lambda_basic_role",
       "Handler": "index.handler",
       ...
       "RuntimeVersionConfig": {
           "RuntimeVersionArn": "arn:aws:lambda:us-west-2::runtime:7d5f06b69c951da8a48b926ce280a9daf2e8bb1a74fc4a2672580c787d608206"
       }
   }
   ```

1. Notieren Sie sich den Amazon-Ressourcennamen (ARN) Ihrer Funktion. Sie benötigen ihn im weiteren Verlauf des Tutorials, wenn Sie Berechtigungen hinzufügen, um Amazon SNS das Aufrufen Ihrer Funktion zu ermöglichen.

## Hinzufügen von Berechtigungen zur Funktion (Konto B)
<a name="with-sns-create-function-permissions"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_4.png)


Damit Amazon SNS Ihre Funktion aufrufen kann, muss die dafür notwendige Berechtigung in einer Anweisung einer [ressourcenbasierten Richtlinie](access-control-resource-based.md) erteilt werden. Sie fügen diese Anweisung mit dem AWS CLI `add-permission` Befehl hinzu.

**Erteilen der Berechtigung zum Aufrufen Ihrer Funktion durch Amazon SNS**
+ Führen Sie in **Konto B** den folgenden AWS CLI Befehl mit dem ARN für Ihr Amazon SNS SNS-Thema aus, das Sie zuvor aufgezeichnet haben.

  ```
  aws lambda add-permission --function-name Function-With-SNS \
      --source-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \
      --statement-id function-with-sns --action "lambda:InvokeFunction" \
      --principal sns.amazonaws.com --profile accountB
  ```

  Die Ausgabe sollte in etwa wie folgt aussehen:

  ```
  {
      "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":
        \"arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda\"}},
        \"Action\":[\"lambda:InvokeFunction\"],
        \"Resource\":\"arn:aws:lambda:us-east-1:<AccountB_ID>:function:Function-With-SNS\",
        \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"},
        \"Sid\":\"function-with-sns\"}"
  }
  ```

**Anmerkung**  
Wenn das Konto mit dem Amazon SNS SNS-Thema in einem [Opt-In](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html) gehostet wird AWS-Region, müssen Sie die Region im Prinzipal angeben. Wenn Sie beispielsweise mit einem Amazon-SNS-Thema in der Region Asien-Pazifik (Hongkong) arbeiten, muss für den Prinzipal `sns.ap-east-1.amazonaws.com` anstelle von `sns.amazonaws.com` angegeben werden. 

## Erteilen einer kontoübergreifenden Berechtigung für das Amazon-SNS-Abonnement (Konto A)
<a name="with-sns-subscription-grant-permission"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_5.png)


Damit Ihre Lambda-Funktion in **Konto B** das Amazon-SNS-Thema abonnieren kann, das Sie in **Konto A** erstellt haben, müssen Sie **Konto B** die Berechtigung zum Abonnieren Ihres Themas erteilen. Sie erteilen diese Berechtigung mit dem AWS CLI `add-permission` Befehl. 

**Erteilen der Berechtigung zum Abonnieren des Themas durch Konto B**
+ Führen Sie in **Konto A** den folgenden AWS CLI Befehl aus. Verwenden Sie den ARN für das Amazon-SNS-Thema, den Sie sich zuvor notiert haben.

  ```
  aws sns add-permission --label lambda-access --aws-account-id <AccountB_ID> \
      --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \  
      --action-name Subscribe ListSubscriptionsByTopic --profile accountA
  ```

## Erstellen eines Abonnements (Konto B)
<a name="with-sns-create-subscription"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_6.png)


In **Konto B** abonnieren Sie nun für Ihre Lambda-Funktion das Amazon-SNS-Thema, das Sie zu Beginn des Tutorials in **Konto A** erstellt haben. Wenn eine Nachricht an dieses Thema (`sns-topic-for-lambda`) gesendet wird, ruft Amazon SNS Ihre Lambda-Funktion `Function-With-SNS` in **Konto B** auf. 

**Erstellen eines Abonnements**
+ Führen Sie in **Konto B** den folgenden AWS CLI Befehl aus. Verwenden Sie Ihre Standardregion, in der Sie Ihr Thema erstellt haben, und die ARNs für Ihr Thema und die Lambda-Funktion.

  ```
  aws sns subscribe --protocol lambda \
      --region us-east-1 \
      --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \
      --notification-endpoint arn:aws:lambda:us-east-1:<AccountB_ID>:function:Function-With-SNS \
      --profile accountB
  ```

  Die Ausgabe sollte in etwa wie folgt aussehen:

  ```
  {
      "SubscriptionArn": "arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx"
  }
  ```

## Veröffentlichen von Nachrichten für das Thema (Konto A und Konto B)
<a name="with-sns-publish-message"></a>

![\[\]](http://docs.aws.amazon.com/de_de/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_7.png)


Ihre Lambda-Funktion in **Konto B** hat nun Ihr Amazon-SNS-Thema in **Konto A** abonniert und Sie können Ihr Setup testen, indem Sie Nachrichten für das Thema veröffentlichen. Um zu bestätigen, dass Amazon SNS Ihre Lambda-Funktion aufgerufen hat, verwenden Sie CloudWatch Logs, um die Ausgabe Ihrer Funktion anzusehen.

**Veröffentlichen einer Nachricht für Ihr Thema und Anzeigen der Ausgabe Ihrer Funktion**

1. Geben Sie `Hello World` in eine Textdatei ein und speichern Sie sie als `message.txt`.

1. **Führen Sie aus demselben Verzeichnis, in dem Sie Ihre Textdatei gespeichert haben, den folgenden AWS CLI Befehl in Konto A aus.** Verwenden Sie den ARN für Ihr eigenes Thema.

   ```
   aws sns publish --message file://message.txt --subject Test \
       --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \
       --profile accountA
   ```

   Dadurch wird eine eindeutige Nachrichten-ID zurückgegeben, die angibt, dass Amazon SNS die Nachricht akzeptiert hat. Anschließend versucht Amazon SNS, die Nachricht den Abonnenten des Themas zuzustellen. Um zu bestätigen, dass Amazon SNS Ihre Lambda-Funktion aufgerufen hat, verwenden Sie CloudWatch Logs, um die Ausgabe Ihrer Funktion einzusehen:

1. Öffnen Sie in **Konto B** die Seite [Protokollgruppen](https://console.aws.amazon.com/cloudwatch/home#logsV2:log-groups) der CloudWatch Amazon-Konsole.

1. Wählen Sie die Protokollgruppe für Ihre Funktion (`/aws/lambda/Function-With-SNS`) aus.

1. Wählen Sie den neuesten Protokollstreams aus.

1. Wenn Ihre Funktion korrekt aufgerufen wurde, sieht die Ausgabe in etwa wie folgt aus und enthält die Inhalte der Nachricht, die Sie für Ihr Thema veröffentlicht haben.

   ```
   2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO Processed message Hello World
   2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO done
   ```

## Bereinigen Ihrer Ressourcen
<a name="cleanup"></a>

Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Durch das Löschen von AWS Ressourcen, die Sie nicht mehr verwenden, vermeiden Sie unnötige Kosten für Ihre AWS-Konto.

Bereinigen Sie über **Konto A** Ihr Amazon-SNS-Thema.

**So löschen Sie das Amazon-SNS-Thema**

1. Öffnen Sie die Seite [Themen](https://console.aws.amazon.com//sns/home#topics:) der Amazon-SNS-Konsole.

1. Wählen Sie das Thema aus, das Sie gerade erstellt haben.

1. Wählen Sie **Löschen** aus.

1. Geben Sie **delete me** in das Texteingabefeld ein.

1. Wählen Sie **Löschen** aus.

Bereinigen Sie über **Konto B** Ihre Ausführungsrolle, die Lambda-Funktion und das Amazon-SNS-Abonnement.

**So löschen Sie die Ausführungsrolle**

1. Öffnen Sie die Seite [Roles](https://console.aws.amazon.com/iam/home#/roles) in der IAM-Konsole.

1. Wählen Sie die von Ihnen erstellte Ausführungsrolle aus.

1. Wählen Sie **Löschen** aus.

1. Geben Sie den Namen der Rolle in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie die Lambda-Funktion:**

1. Öffnen Sie die Seite [Funktionen](https://console.aws.amazon.com/lambda/home#/functions) der Lambda-Konsole.

1. Wählen Sie die Funktion aus, die Sie erstellt haben.

1. Wählen Sie **Aktionen**, **Löschen** aus.

1. Geben Sie **confirm** in das Texteingabefeld ein und wählen Sie **Delete** (Löschen) aus.

**So löschen Sie das Amazon-SNS-Abonnement**

1. Öffnen Sie die Seite [Abonnements](https://console.aws.amazon.com//sns/home#subscriptions:) der Amazon-SNS-Konsole.

1. Wählen Sie das von Ihnen erstellte Abonnement aus.

1. Wählen Sie **Löschen**, **Löschen** aus.