カスタム E メール送信者の Lambda トリガー - Amazon Cognito

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

カスタム E メール送信者の Lambda トリガー

ユーザープールにカスタム E メール送信者トリガーを割り当てると、ユーザーイベントで E メールメッセージの送信が必要になった時点で、Amazon Cognito がデフォルトの動作ではなく Lambda 関数を呼び出します。カスタム送信者トリガーを使用すると、 AWS Lambda 関数は選択した方法とプロバイダーを通じてユーザーに E メール通知を送信できます。関数のカスタムコードは、すべての e メールメッセージを、ユーザープールから処理して配信する必要があります。

このトリガーは、ユーザープールが E メールメッセージを送信する方法をより細かく制御するシナリオに役立ちます。Lambda 関数は、例えば、複数の検証済み ID またはクロス AWS リージョンを管理する場合など、Amazon SES API オペレーションへの呼び出しをカスタマイズできます。また、関数は、メッセージを別の配信メディアまたはサードパーティーサービスにリダイレクトすることもできます。

カスタム E メール送信者トリガーを設定する方法については、「」を参照してくださいカスタム送信者 Lambda トリガーのアクティブ化

カスタム E メール送信者の Lambda トリガーのソース

以下の表には、Lambda コード内のカスタム E メールトリガーのソースに対するトリガーイベントが記載されています。

TriggerSource value イベント
CustomEmailSender_SignUp ユーザーがサインアップすると、Amazon Cognito がウェルカムメッセージを送信します。
CustomEmailSender_Authentication ユーザーがサインインし、Amazon Cognito が多要素認証 (MFA) コードを送信します。
CustomEmailSender_ForgotPassword ユーザーがパスワードをリセットするコードを要求します。
CustomEmailSender_ResendCode ユーザーが代替アカウント確認コードをリクエストします。
CustomEmailSender_UpdateUserAttribute ユーザーが E メールアドレスまたは電話番号の属性を更新すると、Amazon Cognito は属性を検証するためのコードを送信します。
CustomEmailSender_VerifyUserAttribute ユーザーが新しい E メールアドレスまたは電話番号属性を作成し、Amazon Cognito は属性を検証するコードを送信します。
CustomEmailSender_AdminCreateUser ユーザープールに新しいユーザーを作成すると、Amazon Cognito から一時パスワードが送信されます。
CustomEmailSender_AccountTakeOverNotification Amazon Cognito は、ユーザーアカウントを引き継ぐ試みを検出し、ユーザーに通知を送信します。

カスタム E メール送信者の Lambda トリガーパラメータ

Amazon Cognito がこの Lambda 関数に渡すリクエストは、以下のパラメータと Amazon Cognito がすべてのリクエストに追加する共通パラメータを組み合わせたものです。

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

カスタム E メール送信者のリクエストパラメータ

type

リクエストバージョン。カスタム E メール送信者イベントの場合、この文字列の値は常に customEmailSenderRequestV1 です。

コード

関数が復号してユーザーに送信できる暗号化されたコード。

clientMetadata

カスタム E メール送信者 Lambda 関数トリガーへのカスタム入力として提供できる 1 つ以上のキーバリューペア このデータを Lambda 関数に渡すには、AdminRespondToAuthChallenge および RespondToAuthChallenge API アクションで ClientMetadata パラメータを使用します。Amazon Cognito は、認証後関数に渡すリクエストの AdminInitiateAuth および InitiateAuth API オペレーションの ClientMetadata パラメータからのデータを含めません。

注記

Amazon Cognito は、次のトリガーソースを持つイベントでカスタム E メールトリガー関数に ClientMetadata を送信します。

  • CustomEmailSender_ForgotPassword

  • CustomEmailSender_SignUp

  • CustomEmailSender_Authentication

Amazon Cognito は、ソース CustomEmailSender_AccountTakeOverNotification を使用してトリガーイベントで ClientMetadata を送信しません。

userAttributes

ユーザー属性を表す 1 つ以上のキーバリューペア。

カスタム E メール送信者の応答パラメータ

Amazon Cognito は、カスタム E メール送信者のレスポンスに追加の情報が返されることを期待しません。Lambda 関数は、イベントを解釈し、コードを復号してから、メッセージコンテンツを配信する必要があります。一般的な関数は E メールメッセージをアセンブルし、サードパーティーの SMTP リレーに誘導します。

コード例

次の Node.js 例は、カスタム E メール送信者の Lambda 関数で E メールメッセージイベントを処理します。この例では、関数に 2 つの環境変数が定義されていることを前提としています。

KEY_ID

ユーザーのコードを暗号化および復号するために使用する KMS キーの ID。

KEY_ARN

ユーザーのコードを暗号化および復号化するために使用する KMS キーの Amazon リソースネーム (ARN)。

この関数をデプロイするには
  1. 開発者ワークスペースに最新バージョンの NodeJS をインストールします。

  2. ワークスペースに新しい NodeJS プロジェクトを作成します。

  3. を使用してプロジェクトを初期化しますnpm init -y

  4. Lambda 関数のスクリプトを作成します: touch index.mjs

  5. 以下の例の内容を に貼り付けますindex.mjs

  6. プロジェクトの依存関係をダウンロードします AWS Encryption SDK。 npm install @aws-crypto/client-node

  7. プロジェクトディレクトリをファイル に圧縮しますzip -r my_deployment_package.zip .

  8. ZIP ファイルを関数にデプロイします

このサンプル関数はコードを復号し、サインアップイベントの場合、ユーザーの E メールアドレスへの E メールメッセージの送信をシミュレートします。

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; } };