

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

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

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

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

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

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

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


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

## カスタム SMS 送信者の Lambda トリガーパラメータ
<a name="custom-sms-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": "customSMSSenderRequestV1",
        "code": "string",
        "clientMetadata": {
            "string": "string",
             . . .
            },
        "userAttributes": {
            "string": "string",
            . . .
         }
}
```

------

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

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

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

**clientMetadata**  
カスタム SMS 送信者 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 パラメータからのデータを含めません。

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

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

Amazon Cognito は、レスポンスに追加の返品情報を期待しません。関数では、API オペレーションを使用してリソースをクエリして変更したり、イベントメタデータを外部システムに記録することができます。

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

次の Node.js 例は、カスタム SMS 送信者 Lambda 関数で SMS メッセージイベントを処理します。この例では、関数に 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)。

```
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**
+ [カスタム SMS 送信者の Lambda トリガーのソース](#trigger-source)
+ [カスタム SMS 送信者の Lambda トリガーパラメータ](#custom-sms-sender-parameters)
+ [コード例](#custom-sms-sender-code-examples)
+ [カスタム SMS 送信者関数で SMS メッセージ機能を評価する](#sms-to-email-example)

## カスタム SMS 送信者関数で SMS メッセージ機能を評価する
<a name="sms-to-email-example"></a>

カスタム SMS 送信者 Lambda 関数は、ユーザープールが送信する SMS メッセージを受け入れ、関数はカスタムロジックに基づいてコンテンツを配信します。Amazon Cognito は関数に [カスタム SMS 送信者の Lambda トリガーパラメータ](#custom-sms-sender-parameters) を送信します。この情報を使用して、関数はユーザーが望むことを実行できます。例えば、Amazon Simple Notification Service (Amazon SNS) トピックにコードを送信できます。Amazon SNS トピックのサブスクライバーは、SMS メッセージ、HTTPS エンドポイント、または E メールアドレスです。

カスタム SMS 送信者 Lambda 関数を使用して Amazon Cognito SMS メッセージングのテスト環境を作成するには、[GitHub 上の aws-samples ライブラリ](https://github.com/aws-samples)の「[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)」を参照してください。リポジトリには、新しいユーザープールを作成したり、既に持っているユーザープールを操作したりできる AWS CloudFormation テンプレートが含まれています。これらのテンプレートでは、Lambda 関数と Amazon SNS トピックが作成されます。テンプレートがカスタム SMS 送信者トリガーとして割り当てる Lambda 関数は、SMS メッセージを Amazon SNS トピックのサブスクライバーにリダイレクトします。

このソリューションをユーザープールにデプロイすると、Amazon Cognito が通常送信するすべてのメッセージが SMS メッセージングを介して送信され、代わりに Lambda 関数が中央の E メールアドレスに送信します。このソリューションを使用して、SMS メッセージをカスタマイズおよびプレビューし、Amazon Cognito が SMS メッセージを送信する原因となるユーザープールイベントをテストします。テストが完了したら、CloudFormation スタックをロールバックするか、ユーザープールからカスタム SMS 送信者関数の割り当てを削除します。

**重要**  
[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) のテンプレートは使用して、本番環境を構築しないでください。ソリューション内のカスタム SMS 送信者 Lambda 関数は SMS メッセージを*シミュレートします*が、Lambda 関数はそれらすべてを単一の中央の E メールアドレスに送信します。本番環境の Amazon Cognito ユーザープールで SMS メッセージを送信する前に、[Amazon Cognito ユーザープール用の SMS メッセージ設定](user-pool-sms-settings.md) に示す要件を満たす必要があります。