

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

# カスタム E メール送信者の Lambda トリガー
<a name="user-pool-lambda-custom-email-sender"></a>

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

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

カスタム E メール送信者トリガーを設定する方法については、「[カスタム送信者 Lambda トリガーのアクティブ化](user-pool-lambda-custom-sender-triggers.md#enable-custom-sender-lambda-trigger)」を参照してください。

## カスタム E メール送信者の Lambda トリガーのソース
<a name="trigger-source"></a>

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


| `TriggerSource value` | イベント | 
| --- | --- | 
| CustomEmailSender\$1SignUp | ユーザーがサインアップすると、Amazon Cognito がウェルカムメッセージを送信します。 | 
| CustomEmailSender\$1Authentication | ユーザーがサインインすると、Amazon Cognito が E メール OTP または MFA コードを送信します。 | 
| CustomEmailSender\$1ForgotPassword | ユーザーがパスワードをリセットするコードを要求します。 | 
| CustomEmailSender\$1ResendCode | ユーザーが代替アカウント確認コードをリクエストします。 | 
| CustomEmailSender\$1UpdateUserAttribute | ユーザーが E メールアドレスまたは電話番号の属性を更新すると、Amazon Cognito は属性を検証するためのコードを送信します。 | 
| CustomEmailSender\$1VerifyUserAttribute | ユーザーが新しい E メールアドレスまたは電話番号属性を作成し、Amazon Cognito は属性を検証するコードを送信します。 | 
| CustomEmailSender\$1AdminCreateUser | ユーザープールに新しいユーザーを作成すると、Amazon Cognito から一時パスワードが送信されます。 | 
| CustomEmailSender\$1AccountTakeOverNotification | Amazon Cognito は、ユーザーアカウントを引き継ぐ試みを検出し、ユーザーに通知を送信します。 | 

## カスタム E メール送信者の Lambda トリガーパラメータ
<a name="custom-email-sender-parameters"></a>

Amazon Cognito がこの Lambda 関数に渡すリクエストは、以下のパラメータと Amazon Cognito がすべてのリクエストに追加する[共通パラメータ](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared)を組み合わせたものです。

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

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

------

### カスタム E メール送信者のリクエストパラメータ
<a name="custom-email-sender-request-parameters"></a>

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

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

**clientMetadata**  
カスタム E メール送信者 Lambda 関数トリガーへのカスタム入力として提供できる 1 つ以上のキーバリューペア このデータを Lambda 関数に渡すには、[AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) および [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) API アクションで ClientMetadata パラメータを使用します。Amazon Cognito は、認証後関数に渡すリクエストの [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) および [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API オペレーションの ClientMetadata パラメータからのデータを含めません。  
Amazon Cognito は、次のトリガーソースを持つイベントでカスタム E メールトリガー関数に `ClientMetadata` を送信します。  
+ `CustomEmailSender_ForgotPassword`
+ `CustomEmailSender_SignUp`
+ `CustomEmailSender_Authentication`
Amazon Cognito は、ソース `CustomEmailSender_AccountTakeOverNotification` を使用してトリガーイベントで `ClientMetadata` を送信しません。

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

### カスタム E メール送信者の応答パラメータ
<a name="custom-email-sender-response-parameters"></a>

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

## コード例
<a name="custom-email-sender-code-examples"></a>

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

**`KEY_ID`**  
ユーザーのコードの暗号化と復号に使用する KMS キーの ID。

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

**この関数をデプロイするには**

1. デベロッパーワークスペースに最新バージョンの NodeJS をインストールします。

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

1. `npm init -y` でプロジェクトを初期化します。

1. Lambda 関数のスクリプトを作成します (`touch index.mjs`)。

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

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

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

1. [ZIP ファイルを関数にデプロイします](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html)。

このサンプル関数はコードを復号し、サインアップイベントの場合は、ユーザーの 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;
    }
};
```