

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.

# Benutzerdefinierter Lambda-Auslöser für Sender
<a name="user-pool-lambda-custom-sender-triggers"></a>

Das Lambda löst E-Mail `CustomEmailSender` - und SMS-Benachrichtigungen von Drittanbietern in Benutzerpools aus und `CustomSMSSender` unterstützt diese. Sie können SMS- und E-Mail-Anbieter auswählen, um Benachrichtigungen an Benutzer aus Ihrem Lambda-Funktionscode zu senden. Wenn Amazon Cognito Einladungen, MFA-Codes, Bestätigungscodes, Bestätigungscodes und temporäre Passwörter an Benutzer sendet, aktivieren die Ereignisse Ihre konfigurierten Lambda-Funktionen. Amazon Cognito sendet den Code und die temporären Passwörter (Geheimnisse) an Ihre aktivierten Lambda-Funktionen. Amazon Cognito verschlüsselt diese Geheimnisse mit einem vom AWS KMS Kunden verwalteten Schlüssel und dem. AWS Encryption SDK Die AWS Encryption SDK ist eine clientseitige Verschlüsselungsbibliothek, mit der Sie generische Daten ver- und entschlüsseln können.

**[CustomEmailSender](user-pool-lambda-custom-email-sender.md)**  
Amazon Cognito ruft diesen Auslöser auf, um E-Mail-Benachrichtigungen an Benutzer zu senden. 

**[Custom (Benutzerdefiniert)SMSSender](user-pool-lambda-custom-sms-sender.md)**  
Amazon Cognito ruft diesen Auslöser auf, um SMS-Benachrichtigungen an Benutzer zu senden.

## Konzepte der Verschlüsselung
<a name="user-pool-lambda-custom-sender-triggers-resources"></a>

Amazon Cognito sendet Benutzercodes in den Ereignissen, die es an benutzerdefinierte Absenderauslöser sendet, nicht im Klartext. Die Lambda-Funktionen müssen die Codes in den Ereignissen entschlüsseln. Die folgenden Konzepte beschreiben die Verschlüsselungsarchitektur, die Ihre Funktion verwenden muss, um Codes abzurufen, die sie Benutzern zur Verfügung stellen kann.

**AWS KMS**  
AWS KMS ist ein verwalteter Dienst zum Erstellen und Steuern von AWS KMS Schlüsseln. Diese Schlüssel verschlüsseln Ihre Daten. Weitere Informationen finden Sie unter [Was ist AWS Key Management Service?](/kms/latest/developerguide/overview.html).

**KMS-Schlüssel**  
Ein KMS-Schlüssel ist eine logische Darstellung eines kryptografischen Schlüssels. Der KMS-Schlüssel enthält Metadaten wie die Schlüssel-ID, das Erstellungsdatum, die Beschreibung und den Schlüsselstatus. Der KMS-Schlüssel enthält auch das zur Ver- und Entschlüsselung von Daten verwendete Schlüsselmaterial. Weitere Informationen finden Sie unter [Löschen von AWS -KMS-Schlüsseln](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys).

**Symmetrische KMS-Schlüssel**  
Ein symmetrischer KMS-Schlüssel ist ein 256-Bit-Verschlüsselungsschlüssel, der AWS KMS nicht unverschlüsselt verlässt. Um einen symmetrischen KMS-Schlüssel zu verwenden, müssen Sie anrufen AWS KMS. Amazon Cognito verwendet symmetrische Schlüssel. Derselbe Schlüssel verschlüsselt und entschlüsselt. Weitere Informationen finden Sie unter [Symmetrische KMS-Schlüssel](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks). 

## Wissenswertes über Lambda-Trigger mit benutzerdefiniertem Sender
<a name="user-pool-lambda-custom-sender-triggers-things-to-know"></a>
+ Sie können das AWS CLI oder SDK verwenden, um Ihre Benutzerpools für die Verwendung dieser Lambda-Auslöser zu konfigurieren. Diese Konfigurationen sind über die Amazon-Cognito-Konsole nicht verfügbar.

  Die `UpdateUserPool` Operation legt die Lambda-Konfiguration fest. Anfragen für diesen Vorgang erfordern alle Parameter Ihres Benutzerpools *und* die Parameter, die Sie ändern möchten. Wenn Sie nicht alle relevanten Parameter angeben, legt Amazon Cognito die Werte aller fehlenden Parameter auf ihre Standardwerte fest. Fügen Sie, wie im folgenden AWS CLI-Beispiel gezeigt, Einträge für alle Lambda-Funktionen hinzu, die Sie zu Ihrem Benutzerpool hinzufügen oder in diesem behalten möchten. Weitere Informationen finden Sie unter [Aktualisierung der Benutzerpool- und App-Client-Konfiguration](cognito-user-pool-updating.md).

  ```
      #Send this parameter in an 'aws cognito-idp update-user-pool' CLI command, including any existing 
      #user pool configurations. This snippet also includes a pre sign-up trigger for syntax reference. The pre sign-up trigger
      #doesn't have a role in custom sender triggers.
                
        --lambda-config "PreSignUp=lambda-arn, \
                         CustomSMSSender={LambdaVersion=V1_0,LambdaArn=lambda-arn}, \
                         CustomEmailSender={LambdaVersion=V1_0,LambdaArn=lambda-arn}, \
                         KMSKeyID=key-id"
  ```

  Für Anfragen, die den JSON-Text `UpdateUserPool` des folgenden `LambdaConfig` Snippets verwenden, werden benutzerdefinierte SMS- und E-Mail-Absenderfunktionen zugewiesen.

  ```
  "LambdaConfig": {
     "KMSKeyID": "arn:aws:kms:us-east-1:111122223333:key/a6c4f8e2-0c45-47db-925f-87854bc9e357",
     "CustomEmailSender": {
        "LambdaArn": "arn:aws:lambda:us-east-1:111122223333:function:MyFunction",
        "LambdaVersion": "V1_0"
     },
     "CustomSMSSender": {
        "LambdaArn": "arn:aws:lambda:us-east-1:111122223333:function:MyFunction",
        "LambdaVersion": "V1_0"
     }
  ```
+ Um einen benutzerdefinierten Lambda-Sender-Trigger mit einem `update-user-pool` AWS CLI Befehl zu entfernen, lassen Sie den `CustomEmailSender` Parameter `CustomSMSSender` oder von weg `--lambda-config` und schließen Sie alle anderen Trigger ein, die Sie mit Ihrem Benutzerpool verwenden möchten.

  Wenn Sie einen benutzerdefinierten Lambda-Auslöser für Sender mit der API-Anfrage `UpdateUserPool` entfernen möchten, löschen Sie `CustomSMSSender` oder `CustomEmailSender` aus dem Anfragetext, der den Rest der Benutzerpool-Konfiguration enthält.
+ Amazon Cognito maskiert reservierte Zeichen wie `<` (`&lt;`) und `>` (`&gt;`) im temporären Passwort Ihres Benutzers im HTML-Format. Diese Zeichen können in temporären Passwörtern, die Amazon Cognito an Ihre benutzerdefinierte E-Mail-Senderfunktion sendet, jedoch nicht in temporären Verifizierungscodes vorkommen. Um temporäre Passwörter senden zu können, muss Ihre Lambda-Funktion die Maskierung dieser Zeichen aufheben, nachdem sie das Passwort entschlüsselt hat und bevor sie die Nachricht an Ihren Benutzer sendet.

## Lambda-Trigger mit benutzerdefiniertem Absender aktivieren
<a name="enable-custom-sender-lambda-trigger"></a>

Um benutzerdefinierte Logik zum Senden von SMS- oder E-Mail-Nachrichten für Ihren Benutzerpool zu verwenden, richten Sie benutzerdefinierte Absender-Trigger ein. Anhand des folgenden Verfahrens weisen Sie Ihrem Benutzerpool einen benutzerdefinierten SMS-Auslöser, einen benutzerdefinierten E-Mail-Auslöser oder beides zu. Nachdem Sie Ihren benutzerdefinierten Absender-Trigger hinzugefügt haben, sendet Amazon Cognito immer Benutzerattribute, einschließlich der Telefonnummer und des Einmalcodes, an Ihre Lambda-Funktion, anstatt das Standardverhalten, das eine SMS- oder E-Mail-Nachricht sendet.

1. Erstellen Sie in () einen [symmetrischen Verschlüsselungsschlüssel](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks). AWS Key Management Service AWS KMS Amazon Cognito generiert Geheimnisse — temporäre Passwörter, Bestätigungscodes, Einmalkennwörter für die Authentifizierung und Bestätigungscodes — und verwendet dann diesen KMS-Schlüssel, um die Geheimnisse zu verschlüsseln. [AWS Encryption SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html) Sie können dann die Funktion AWS Encryption SDK in Ihrer Lambda-Funktion verwenden, um die Geheimnisse zu entschlüsseln und sie im Klartext an den Benutzer zu senden.

1. Der IAM-Prinzipal, der Ihren Benutzerpool erstellt oder aktualisiert, erstellt einen einmaligen Zuschuss für den KMS-Schlüssel, den Amazon Cognito zur Verschlüsselung des Codes verwendet. Erteilen Sie diesem `CreateGrant` Prinzipalberechtigungen für Ihren KMS-Schlüssel. Damit dieses Beispiel für eine KMS-Schlüsselrichtlinie wirksam wird, muss der Administrator, der den Benutzerpool aktualisiert, mit einer Sitzung mit angenommener Rolle für die IAM-Rolle angemeldet sein. `arn:aws:iam::111222333444:role/my-example-administrator-role` 

   Wenden Sie die folgende, an Ihre Umgebung angepasste, ressourcenbasierte Richtlinie auf Ihren KMS-Schlüssel an.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
       {
           "Effect": "Allow",
           "Principal": {
               "AWS": "arn:aws:iam::111122223333:role/my-example-administrator-role"
           },
           "Action": "kms:CreateGrant",
           "Resource": "arn:aws:kms:us-west-2:111122223333:key/1example-2222-3333-4444-999example",
           "Condition": {
               "StringEquals": {
                  "kms:EncryptionContext:userpool-id": "us-west-2_EXAMPLE"
               }
           }
       },
       {
           "Sid": "Allow Lambda to decrypt",
           "Effect": "Allow",
           "Principal": {
               "AWS": "arn:aws:iam::111122223333:role/my-lambda-function-role"
           },
           "Action": "kms:Decrypt",
           "Resource": "*"
       }]
   }
   ```

------

1. Erstellen Sie eine Lambda-Funktion für den benutzerdefinierten Sender-Auslöser. Amazon Cognito verwendet das [AWS -Verschlüsselungs-SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html), um die Secrets, temporären Passwörter und Codes zu verschlüsseln, die die API-Anfragen Ihrer Benutzer autorisieren.

   1. Weisen Sie eine [Lambda-Ausführungsrolle](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) zu, die mindestens über `kms:Decrypt` Berechtigungen für Ihren KMS-Schlüssel verfügt.

   1. Verfassen Sie den Lambda-Funktionscode, um Ihre Nachrichten zu senden. Das Eingabeereignis für Ihre Funktion enthält ein Geheimnis. Entschlüsseln Sie in Ihrer Funktion das Geheimnis mit dem AWS Encryption SDK und verarbeiten Sie alle relevanten Metadaten. Senden Sie dann den Code, Ihre eigene benutzerdefinierte Nachricht und die Zieltelefonnummer an die benutzerdefinierte API, die Ihre Nachricht übermittelt.

   1. Fügen Sie das AWS Encryption SDK zu Ihrer Lambda-Funktion hinzu. Weitere Informationen finden Sie unter [AWS -Verschlüsselungs-SDK – Programmiersprachen](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/programming-languages.html). Aktualisieren Sie das Lambda-Paket, indem Sie die folgenden Schritte ausführen.

      1. Exportieren Sie Ihre Lambda-Funktion als ZIP-Datei in die AWS-Managementkonsole.

      1. Öffnen Sie Ihre Funktion und fügen Sie die AWS Encryption SDK hinzu. Weitere Informationen und Download-Links finden Sie unter [AWS Encryption SDK – Programmiersprachen](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/programming-languages.html) im *Entwicklerhandbuch zum AWS Encryption SDK *.

      1. Komprimieren Sie Ihre Funktion mit Ihren SDK-Abhängigkeiten und laden Sie die Funktion in Lambda hoch. Weitere Informationen finden Sie unter [Bereitstellen von Lambda-Funktionen als ZIP-Dateiarchive](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-zip.html#configuration-function-create) im *Entwicklerhandbuch zu AWS Lambda *.

1. Gewähren Sie dem Amazon-Cognito-Serviceprinzipal `cognito-idp.amazonaws.com`-Zugriff, um die Lambda-Funktion aufzurufen.

   Der folgende AWS CLI Befehl erteilt Amazon Cognito die Erlaubnis, Ihre Lambda-Funktion aufzurufen:

   ```
   aws lambda add-permission --function-name lambda_arn --statement-id "CognitoLambdaInvokeAccess" --action lambda:InvokeFunction --principal cognito-idp.amazonaws.com
   ```

1. Generieren Sie eine [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html)API-Anfrage mit einem `LambdaConfig` Parameter, der benutzerdefinierte Lambda-Sender-Trigger hinzufügt. Sie können in der Amazon Cognito Cognito-Konsole keine Auslöser dieses Typs hinzufügen. Benutzerdefinierte Absender-Trigger erfordern die `LambdaConfig` Parameter `KMSKeyID` und `CustomSMSSender` oder `CustomEmailSender` (oder beide).

# Benutzerdefinierter Lambda-Auslöser für E-Mail-Sender
<a name="user-pool-lambda-custom-email-sender"></a>

Wenn Sie Ihrem Benutzerpool einen benutzerdefinierten E-Mail-Absender-Trigger zuweisen, ruft Amazon Cognito statt des Standardverhaltens eine Lambda-Funktion auf, wenn ein Benutzerereignis das Senden einer E-Mail-Nachricht erfordert. Mit einem benutzerdefinierten Absender-Trigger kann Ihre AWS Lambda Funktion E-Mail-Benachrichtigungen über eine von Ihnen gewählte Methode und einen Anbieter an Ihre Benutzer senden. Der benutzerdefinierte Code Ihrer Funktion muss alle E-Mail-Nachrichten aus Ihrem Benutzerpool verarbeiten und versenden.

Dieser Trigger eignet sich für Szenarien, in denen Sie möglicherweise mehr Kontrolle darüber haben möchten, wie Ihr Benutzerpool E-Mail-Nachrichten sendet. Ihre Lambda-Funktion kann den Aufruf von Amazon SES SES-API-Vorgängen anpassen, z. B. wenn Sie mehrere verifizierte Identitäten oder Kreuzungen verwalten möchten. AWS-Regionen Ihre Funktion kann auch Nachrichten an ein anderes Übermittlungsmedium oder einen Drittanbieter-Service weiterleiten.

Informationen zur Konfiguration eines benutzerdefinierten E-Mail-Absender-Triggers finden Sie unter[Lambda-Trigger mit benutzerdefiniertem Absender aktivieren](user-pool-lambda-custom-sender-triggers.md#enable-custom-sender-lambda-trigger).

## Benutzerdefinierte E-Mail-Sender-Lambda-Auslöser-Quellen
<a name="trigger-source"></a>

Die folgende Tabelle zeigt die auslösenden Ereignisse für benutzerdefinierte E-Mail-Auslöserquellen in Ihrem Lambda-Code.


| `TriggerSource value` | Veranstaltung | 
| --- | --- | 
| CustomEmailSender\$1SignUp | Ein Benutzer meldet sich an und Amazon Cognito sendet eine Willkommensnachricht. | 
| CustomEmailSender\$1Authentication | Ein Benutzer meldet sich an und Amazon Cognito sendet einen OTP- oder MFA-Code per E-Mail. | 
| CustomEmailSender\$1ForgotPassword | Ein Benutzer fordert einen Code an, um sein Passwort zurückzusetzen. | 
| CustomEmailSender\$1ResendCode | Ein Benutzer fordert einen Ersatzcode für die Kontobestätigung an. | 
| CustomEmailSender\$1UpdateUserAttribute | Ein Benutzer aktualisiert eine E-Mail-Adresse oder ein Telefonnummernattribut und Amazon Cognito sendet einen Code zur Verifizierung des Attributs. | 
| CustomEmailSender\$1VerifyUserAttribute | Ein Benutzer erstellt eine neue E-Mail-Adresse oder ein Telefonnummernattribut und Amazon Cognito sendet einen Code zur Verifizierung des Attributs. | 
| CustomEmailSender\$1AdminCreateUser | Sie erstellen einen neuen Benutzer in Ihrem Benutzerpool und Amazon Cognito sendet ihm ein temporäres Passwort. | 
| CustomEmailSender\$1AccountTakeOverNotification | Amazon Cognito erkennt einen Versuch, ein Benutzerkonto zu übernehmen, und sendet dem Benutzer eine Benachrichtigung. | 

## Benutzerdefinierte Lambda-Auslöserparameter für SMS-Sender
<a name="custom-email-sender-parameters"></a>

Die Anforderung, die Amazon Cognito an diese Lambda-Funktion übergibt, ist eine Kombination der folgenden Parameter und der [allgemeinen Parameter](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared), die Amazon Cognito allen Anfragen hinzufügt.

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

```
{
    "request": {
        "type": "customEmailSenderRequestV1",
        "code": "string",
        "clientMetadata": {
            "string": "string",
             . . .
            },
        "userAttributes": {
            "string": "string",
            . . .
         }
}
```

------

### Benutzerdefinierte E-Mail-Sender-Anforderungsparameter
<a name="custom-email-sender-request-parameters"></a>

**type**  
Die Anforderungsversion. Für ein benutzerdefiniertes E-Mail-Sender-Ereignis ist der Wert dieses Strings immer `customEmailSenderRequestV1`.

**Code**  
Der verschlüsselte Code, den Ihre Funktion entschlüsseln und an Ihren Benutzer senden kann.

**clientMetadata**  
Ein oder mehrere Schlüssel-Wert-Paare, die Sie als benutzerdefinierte Eingabe für den benutzerdefinierten E-Mail-Sender-Auslöser der Lambda-Funktion bereitstellen können. Um diese Daten an Ihre Lambda-Funktion zu übergeben, können Sie den ClientMetadata Parameter in den Aktionen [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)und [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)API verwenden. Amazon Cognito bezieht keine Daten aus dem ClientMetadata Parameter in [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)und [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)API-Operationen in die Anfrage ein, die es an die Post-Authentifizierungsfunktion weiterleitet.  
Amazon Cognito sendet bei Ereignissen mit `ClientMetadata` den folgenden Triggerquellen an benutzerdefinierte E-Mail-Auslösefunktionen:  
+ `CustomEmailSender_ForgotPassword`
+ `CustomEmailSender_SignUp`
+ `CustomEmailSender_Authentication`
Amazon Cognito sendet keine Trigger-Ereignisse mit `ClientMetadata` der Quelle `CustomEmailSender_AccountTakeOverNotification` ein.

**userAttributes**  
Ein oder mehrere Schlüssel-Wert-Paare, die Benutzerattribute darstellen.

### Benutzerdefinierte E-Mail-Sender-Antwortparameter
<a name="custom-email-sender-response-parameters"></a>

Amazon Cognito erwartet keine zusätzlichen Rückgabeinformationen in der benutzerdefinierten E-Mail-Sender-Antwort. Ihre Lambda-Funktion muss das Ereignis interpretieren und den Code entschlüsseln und dann den Nachrichteninhalt übermitteln. Eine typische Funktion stellt eine E-Mail-Nachricht zusammen und leitet sie an ein SMTP-Relay eines Drittanbieters weiter.

## Codebeispiel
<a name="custom-email-sender-code-examples"></a>

Das folgende Beispiel für Node.js verarbeitet ein E–Mail-Nachrichtenereignis in Ihrer benutzerdefinierten Lambda-Funktion für E-Mail-Sender. In diesem Beispiel wird davon ausgegangen, dass Ihre Funktion zwei Umgebungsvariablen definiert hat.

**`KEY_ID`**  
Die ID des KMS-Schlüssels, den Sie zum Verschlüsseln und Entschlüsseln der Benutzercodes verwenden möchten.

**`KEY_ARN`**  
Der Amazon-Ressourcenname (ARN) des KMS-Schlüssels, den Sie zum Verschlüsseln und Entschlüsseln von Benutzercodes verwenden möchten.

**Um diese Funktion bereitzustellen**

1. Installieren Sie die neueste Version von NodeJS in Ihrem Developer Workspace.

1. Erstellen Sie ein neues NodeJS-Projekt in Ihrem Workspace.

1. Initialisieren Sie Ihr Projekt mit. `npm init -y`

1. Erstellen Sie das Skript für die Lambda-Funktion:`touch index.mjs`.

1. Fügen Sie den Inhalt des folgenden Beispiels in ein`index.mjs`.

1. Laden Sie die Projektabhängigkeit herunter, AWS Encryption SDK:`npm install @aws-crypto/client-node`.

1. Komprimieren Sie das Projektverzeichnis in eine Datei:`zip -r my_deployment_package.zip .`.

1. [Stellen Sie die ZIP-Datei für Ihre Funktion](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html) bereit.

Diese Beispielfunktion entschlüsselt den Code und simuliert bei Anmeldeereignissen das Senden einer E-Mail-Nachricht an die E-Mail-Adresse des Benutzers.

```
import { KmsKeyringNode, buildClient, CommitmentPolicy } from '@aws-crypto/client-node';

// Configure the encryption SDK client with the KMS key from the environment variables
const { encrypt, decrypt } = buildClient(
    CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT
);

const generatorKeyId = process.env.KEY_ID;
const keyIds = [process.env.KEY_ARN];
const keyring = new KmsKeyringNode({ generatorKeyId, keyIds });

// Example function to simulate sending email.
// This example logs message details to CloudWatch Logs from your Lambda function.
// Update this function with custom logic that sends an email message to 'emailaddress' with body 'message'.
const sendEmail = async (emailAddress, message) => {
    // Log the destination with the email address masked.
    console.log(`Simulating email send to ${emailAddress.replace(/[^@.]/g, '*')}`);
    // Log the message with the code masked.
    console.log(`Message content: ${message.replace(/\b\d{6,8}\b/g, '********')}`);
    // Simulate API delay
    await new Promise(resolve => setTimeout(resolve, 100));
    console.log('Email sent successfully');
    return true;
};

export const handler = async (event) => {
    try {
        // Decrypt the secret code using encryption SDK
        let plainTextCode;
        if (event.request.code) {
            const { plaintext, messageHeader } = await decrypt(keyring, Buffer.from(event.request.code, 'base64'));
            plainTextCode = Buffer.from(plaintext).toString('utf-8');
        }

        // Handle different trigger sources
        if (event.triggerSource == 'CustomEmailSender_SignUp') {
            const emailAddress = event.request.userAttributes.email;
            const message = `Welcome! Your verification code is: ${plainTextCode}`;
            await sendEmail(emailAddress, message);
        }
        else if (event.triggerSource == 'CustomEmailSender_ResendCode') {
            // Handle resend code
        }
        else if (event.triggerSource == 'CustomEmailSender_ForgotPassword') {
            // Handle forgot password
        }
        else if (event.triggerSource == 'CustomEmailSender_UpdateUserAttribute') {
            // Handle update attribute
        }
        else if (event.triggerSource == 'CustomEmailSender_VerifyUserAttribute') {
            // Handle verify attribute
        }
        else if (event.triggerSource == 'CustomEmailSender_AdminCreateUser') {
            // Handle admin create user
        }
        else if (event.triggerSource == 'CustomEmailSender_Authentication') {
            // Handle authentication
        }
        else if (event.triggerSource == 'CustomEmailSender_AccountTakeOverNotification') {
            // Handle account takeover notification
        }

        return;
    } catch (error) {
        console.error('Error in custom email sender:', error);
        throw error;
    }
};
```

# Benutzerdefinierter Lambda-Auslöser für SMS-Sender
<a name="user-pool-lambda-custom-sms-sender"></a>

Wenn Sie Ihrem Benutzerpool einen benutzerdefinierten SMS-Absender-Trigger zuweisen, ruft Amazon Cognito statt des Standardverhaltens eine Lambda-Funktion auf, wenn ein Benutzerereignis das Senden einer SMS-Nachricht erfordert. Mit einem benutzerdefinierten Absender-Trigger kann Ihre AWS Lambda Funktion SMS-Benachrichtigungen über eine von Ihnen gewählte Methode und einen Anbieter an Ihre Benutzer senden. Der benutzerdefinierte Code Ihrer Funktion muss alle SMS-Nachrichten aus Ihrem Benutzerpool verarbeiten und versenden.

Dieser Trigger eignet sich für Szenarien, in denen Sie möglicherweise mehr Kontrolle darüber haben möchten, wie Ihr Benutzerpool SMS-Nachrichten sendet. Ihre Lambda-Funktion kann den Aufruf von Amazon SNS SNS-API-Vorgängen anpassen, z. B. wenn Sie mehrere Originationen oder Kreuzungen verwalten möchten. IDs AWS-Regionen Ihre Funktion kann auch Nachrichten an ein anderes Übermittlungsmedium oder einen Drittanbieter-Service weiterleiten.

Informationen zur Konfiguration eines benutzerdefinierten E-Mail-Absender-Triggers finden Sie unter[Lambda-Trigger mit benutzerdefiniertem Absender aktivieren](user-pool-lambda-custom-sender-triggers.md#enable-custom-sender-lambda-trigger).

## Benutzerdefinierte SMS-Sender-Lambda-Auslöser-Quellen
<a name="trigger-source"></a>

Die folgende Tabelle zeigt das auslösende Ereignis für benutzerdefinierte SMS-Auslöserquellen in Ihrem Lambda-Code.


| `TriggerSource value` | Veranstaltung | 
| --- | --- | 
| CustomSMSSender\$1SignUp | Ein Benutzer meldet sich an und Amazon Cognito sendet eine Willkommensnachricht. | 
| CustomSMSSender\$1ForgotPassword | Ein Benutzer fordert einen Code an, um sein Passwort zurückzusetzen. | 
| CustomSMSSender\$1ResendCode | Ein Benutzer fordert einen neuen Code an, um seine Registrierung zu bestätigen. | 
| CustomSMSSender\$1VerifyUserAttribute | Ein Benutzer erstellt eine neue E-Mail-Adresse oder ein Telefonnummernattribut und Amazon Cognito sendet einen Code zur Verifizierung des Attributs. | 
| CustomSMSSender\$1UpdateUserAttribute | Ein Benutzer aktualisiert eine E-Mail-Adresse oder ein Telefonnummernattribut und Amazon Cognito sendet einen Code zur Verifizierung des Attributs. | 
| CustomSMSSender\$1Authentication | Ein Benutzer meldet sich an und Amazon Cognito sendet einen SMS-OTP- oder MFA-Code. | 
| CustomSMSSender\$1AdminCreateUser | Sie erstellen einen neuen Benutzer in Ihrem Benutzerpool und Amazon Cognito sendet ihm ein temporäres Passwort. | 

## Benutzerdefinierte Lambda-Auslöserparameter für SMS-Sender
<a name="custom-sms-sender-parameters"></a>

Die Anforderung, die Amazon Cognito an diese Lambda-Funktion übergibt, ist eine Kombination der folgenden Parameter und der [allgemeinen Parameter](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared), die Amazon Cognito allen Anfragen hinzufügt.

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

```
{
    "request": {
        "type": "customSMSSenderRequestV1",
        "code": "string",
        "clientMetadata": {
            "string": "string",
             . . .
            },
        "userAttributes": {
            "string": "string",
            . . .
         }
}
```

------

### Benutzerdefinierte SMS-Sender-Anforderungsparameter
<a name="custom-sms-sender-request-parameters"></a>

**type**  
Die Anforderungsversion. Für ein benutzerdefiniertes SMS-Sender-Ereignis ist der Wert dieses Strings immer `customSMSSenderRequestV1`.

**Code**  
Der verschlüsselte Code, den Ihre Funktion entschlüsseln und an Ihren Benutzer senden kann.

**clientMetadata**  
Ein oder mehrere Schlüssel-Wert-Paare, die Sie als benutzerdefinierte Eingabe für den benutzerdefinierten SMS-Sender-Auslöser der Lambda-Funktion bereitstellen können. Um diese Daten an Ihre Lambda-Funktion zu übergeben, können Sie den ClientMetadata Parameter in den Aktionen [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)und [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)API verwenden. Amazon Cognito bezieht keine Daten aus dem ClientMetadata Parameter in [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)und [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)API-Operationen in die Anfrage ein, die es an die Post-Authentifizierungsfunktion weiterleitet.

**userAttributes**  
Ein oder mehrere Schlüssel-Wert-Paare, die Benutzerattribute darstellen.

### Benutzerdefinierte SMS-Sender-Antwortparameter
<a name="custom-sms-sender-response-parameters"></a>

Amazon Cognito erwartet keine zusätzlichen Rückgabeinformationen in der Antwort. Ihre Funktion kann API-Operationen verwenden, um Ihre Ressourcen abzufragen und zu ändern oder Ereignismetadaten in einem externen System aufzuzeichnen.

## Codebeispiel
<a name="custom-sms-sender-code-examples"></a>

Das folgende Beispiel für Node.js verarbeitet ein SMS-Nachrichtenereignis in Ihrer benutzerdefinierten Lambda-Funktion für SMS-Sender. In diesem Beispiel wird davon ausgegangen, dass Ihre Funktion zwei Umgebungsvariablen definiert hat.

**`KEY_ID`**  
Die ID des KMS-Schlüssels, den Sie zum Verschlüsseln und Entschlüsseln der Benutzercodes verwenden möchten.

**`KEY_ARN`**  
Der Amazon-Ressourcenname (ARN) des KMS-Schlüssels, den Sie zum Verschlüsseln und Entschlüsseln von Benutzercodes verwenden möchten.

**Um diese Funktion bereitzustellen**

1. Installieren Sie die neueste Version von NodeJS in Ihrem Developer Workspace.

1. Erstellen Sie ein neues NodeJS-Projekt in Ihrem Workspace.

1. Initialisieren Sie Ihr Projekt mit. `npm init -y`

1. Erstellen Sie das Skript für die Lambda-Funktion:`touch index.mjs`.

1. Fügen Sie den Inhalt des folgenden Beispiels in ein`index.mjs`.

1. Laden Sie die Projektabhängigkeit herunter, AWS Encryption SDK:`npm install @aws-crypto/client-node`.

1. Komprimieren Sie das Projektverzeichnis in eine Datei:`zip -r my_deployment_package.zip .`.

1. [Stellen Sie die ZIP-Datei für Ihre Funktion](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html) bereit.

```
import { KmsKeyringNode, buildClient, CommitmentPolicy } from '@aws-crypto/client-node';

// Configure the encryption SDK client with the KMS key from the environment variables
const { encrypt, decrypt } = buildClient(
    CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT
);

const generatorKeyId = process.env.KEY_ID;
const keyIds = [process.env.KEY_ARN];
const keyring = new KmsKeyringNode({ generatorKeyId, keyIds });

// Example function to simulate sending SMS.
// This example logs message details to CloudWatch Logs from your Lambda function.
// Update this function with custom logic that sends an SMS message to 'phoneNumber' with body 'message'.
const sendSMS = async (phoneNumber, message) => {
    // Log the destination with the phone number masked.
    console.log(`Simulating SMS send to ${phoneNumber.replace(/[^+]/g, '*')}`);
    // Log the message with the code masked.
    console.log(`Message content: ${message.replace(/\b\d{6,8}\b/g, '********')}`);    
    // Simulate API delay
    await new Promise(resolve => setTimeout(resolve, 100));
    console.log('SMS sent successfully');
    return true;
};

export const handler = async (event) => {
    try {
        // Decrypt the secret code using encryption SDK
        let plainTextCode;
        if (event.request.code) {
            const { plaintext, messageHeader } = await decrypt(keyring, Buffer.from(event.request.code, 'base64'));
            plainTextCode = Buffer.from(plaintext).toString('utf-8');
        }

        // Handle different trigger sources
        if (event.triggerSource == 'CustomSMSSender_SignUp') {
            const phoneNumber = event.request.userAttributes.phone_number;
            const message = `Welcome! Your verification code is: ${plainTextCode}`;
            await sendSMS(phoneNumber, message);
        }
        else if (event.triggerSource == 'CustomSMSSender_ResendCode') {
            // Handle resend code
        }
        else if (event.triggerSource == 'CustomSMSSender_ForgotPassword') {
            // Handle forgot password
        }
        else if (event.triggerSource == 'CustomSMSSender_UpdateUserAttribute') {
            // Handle update attribute
        }
        else if (event.triggerSource == 'CustomSMSSender_VerifyUserAttribute') {
            // Handle verify attribute
        }
        else if (event.triggerSource == 'CustomSMSSender_AdminCreateUser') {
            // Handle admin create user
        }
        return;
    } catch (error) {
        console.error('Error in custom SMS sender:', error);
        throw error;
    }
};
```

**Topics**
+ [Benutzerdefinierte SMS-Sender-Lambda-Auslöser-Quellen](#trigger-source)
+ [Benutzerdefinierte Lambda-Auslöserparameter für SMS-Sender](#custom-sms-sender-parameters)
+ [Codebeispiel](#custom-sms-sender-code-examples)
+ [Bewerten von SMS-Nachrichtenfunktionen mit einer benutzerdefinierten SMS-Sender-Funktion](#sms-to-email-example)

## Bewerten von SMS-Nachrichtenfunktionen mit einer benutzerdefinierten SMS-Sender-Funktion
<a name="sms-to-email-example"></a>

Eine benutzerdefinierte Lambda-Funktion für SMS-Sender akzeptiert die SMS-Nachrichten, die Ihr Benutzerpool senden würde, und die Funktion stellt den Inhalt basierend auf Ihrer benutzerdefinierten Logik bereit. Amazon Cognito sendet die [Benutzerdefinierte Lambda-Auslöserparameter für SMS-Sender](#custom-sms-sender-parameters) an Ihre Funktion. Ihre Funktion kann diese Informationen nach Ihren Wünschen verarbeiten. Sie können den Code beispielsweise an ein Amazon Simple Notification Service (Amazon SNS)-Thema senden. Ein Abonnent eines Amazon-SNS-Themas kann eine SMS-Nachricht, ein HTTPS-Endpunkt oder eine E-Mail-Adresse sein.

Informationen zum Erstellen einer Testumgebung für Amazon Cognito SMS-Messaging mit einer benutzerdefinierten Lambda-Funktion für SMS-Absender finden Sie unter [amazon-cognito-user-pool- development-and-testing-with - sms-redirected-to-email](https://github.com/aws-samples/amazon-cognito-user-pool-development-and-testing-with-sms-redirected-to-email) in der [aws-samples-Bibliothek](https://github.com/aws-samples) unter. GitHub Das Repository enthält AWS CloudFormation Vorlagen, mit denen Sie einen neuen Benutzerpool erstellen oder mit einem Benutzerpool arbeiten können, den Sie bereits haben. Diese Vorlagen erstellen Lambda-Funktionen und ein Amazon-SNS-Thema. Die Lambda-Funktion, die die Vorlage als benutzerdefinierten SMS-Sender-Auslöser zuweist, leitet Ihre SMS-Nachrichten an die Abonnenten des Amazon-SNS-Themas um. 

Wenn Sie diese Lösung in einem Benutzerpool bereitstellen, werden alle Nachrichten, die Amazon Cognito normalerweise mit SNS-Messaging sendet, mit der Lambda-Funktion stattdessen an eine zentrale E-Mail-Adresse gesendet. Verwenden Sie diese Lösung, um SMS-Nachrichten anzupassen und in der Vorschau anzuzeigen und um die Benutzerpool-Ereignisse zu testen, die dazu führen, dass Amazon Cognito eine SMS-Nachricht sendet. Nachdem Sie Ihre Tests abgeschlossen haben, setzen Sie den CloudFormation Stack zurück oder entfernen Sie die Zuweisung der benutzerdefinierten SMS-Absenderfunktion aus Ihrem Benutzerpool.

**Wichtig**  
Verwenden Sie die Vorlagen in [amazon-cognito-user-pool- development-and-testing-with -](https://github.com/aws-samples/amazon-cognito-user-pool-development-and-testing-with-sms-redirected-to-email) nichtsms-redirected-to-email, um eine Produktionsumgebung zu erstellen. Die benutzerdefinierte Lambda-Funktion für SMS-Sender in der Lösung *simuliert* SMS-Nachrichten, die Lambda-Funktion sendet sie jedoch alle an eine einzige zentrale E-Mail-Adresse. Bevor Sie SMS-Nachrichten in einem Amazon-Cognito-Benutzerpool in der Produktion senden können, müssen Sie die unter [Einstellungen für SMS-Nachrichten für Amazon-Cognito-Benutzerpools](user-pool-sms-settings.md) angegebenen Anforderungen erfüllen.