カスタム送信者 Lambda SMS トリガー - Amazon Cognito

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

カスタム送信者 Lambda SMS トリガー

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

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

注記

現在、Amazon Cognito コンソールでカスタム送信者のトリガーを割り当てることはできません。CreateUserPool または UpdateUserPoolAPIリクエストの LambdaConfigパラメータを使用してトリガーを割り当てることができます。

このトリガーをセットアップするには、以下のステップを実行します。

  1. () で対称暗号化キーを作成します AWS Key Management Service AWS KMS。Amazon Cognito は、一時的なパスワード、検証コード、確認コードなどのシークレットを生成し、このKMSキーを使用してシークレットを暗号化します。その後、Lambda 関数の復号APIオペレーションを使用してシークレットを復号し、プレーンテキストでユーザーに送信できます。AWS Encryption SDK は、関数内の AWS KMS オペレーションに便利なツールです。

  2. カスタム送信者のトリガーとして割り当てる Lambda 関数を作成します。KMS キーのkms:Decryptアクセス許可を Lambda 関数ロールに付与します。

  3. Amazon Cognito サービスプリンシパルに、Lambda 関数を呼び出すための cognito-idp.amazonaws.com へのアクセス権を付与します。

  4. カスタム配信メソッドまたはサードパーティープロバイダーにメッセージを転送する Lambda 関数コードを書き込みます。ユーザーの認証コードまたは確認コードを配信するには、Base64 がリクエストで code パラメーターの値をデコードして復号化します。このオペレーションでは、メッセージに含める必要があるプレーンテキストのコードまたはパスワードが生成されます。

  5. カスタム送信者 Lambda トリガーを使用するようにユーザープールを更新します。カスタム送信者トリガーを使用してユーザープールを更新または作成するIAMプリンシパルには、KMSキーの許可を作成するアクセス許可が必要です。次のLambdaConfigスニペットは、カスタムSMSおよび E メール送信者関数を割り当てます。

    "LambdaConfig": { "KMSKeyID": "arn:aws:kms:us-east-1:123456789012:key/a6c4f8e2-0c45-47db-925f-87854bc9e357", "CustomEmailSender": { "LambdaArn": "arn:aws:lambda:us-east-1:123456789012:function:MyFunction", "LambdaVersion": "V1_0" }, "CustomSMSSender": { "LambdaArn": "arn:aws:lambda:us-east-1:123456789012:function:MyFunction", "LambdaVersion": "V1_0" }

カスタム送信者 Lambda SMS トリガーパラメータ

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

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

カスタムSMS送信者リクエストパラメータ

type

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

コード

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

clientMetadata

カスタム送信者 Lambda SMS 関数トリガーへのカスタム入力として指定できる 1 つ以上のキーと値のペア。このデータを Lambda 関数に渡すには、 AdminRespondToAuthChallenge および RespondToAuthChallengeAPIアクションで ClientMetadata パラメータを使用できます。Amazon Cognito には、 の ClientMetadata パラメータAdminInitiateAuthからのデータや、事後認証関数に渡されるリクエストのInitiateAuthAPIオペレーションは含まれません。

userAttributes

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

カスタムSMS送信者レスポンスパラメータ

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

カスタム送信者 Lambda SMS トリガーのアクティブ化

カスタムロジックを使用してユーザープールのSMSメッセージを送信するカスタムSMS送信者トリガーを設定できます。次の手順では、カスタムSMSトリガー、カスタム E メールトリガー、またはその両方をユーザープールに割り当てます。カスタムSMS送信者トリガーを追加すると、Amazon Cognito は、Amazon Simple Notification Service でSMSメッセージを送信するデフォルトの動作ではなく、電話番号や 1 回限りのコードを含むユーザー属性を Lambda 関数に常に送信します。

重要

Amazon Cognito HTML- < (&lt;) や > (&gt;) などの予約文字をユーザーの一時パスワードからエスケープします。これらの文字は、Amazon Cognito がカスタム E メール送信者機能に送信する一時パスワードには表示される場合がありますが、一時的な確認コードには表示されません。一時パスワードを送信するには、Lambda 関数がパスワードを復号した後、ユーザーにメッセージを送信する前に、これらの文字をアンエスケープする必要があります。

  1. AWS KMSで暗号化キーを作成します。このキーは、Amazon Cognito が生成する一時パスワードと認可コードを暗号化します。次に、カスタム送信者の Lambda 関数でこれらのシークレットを復号して、プレーンテキストでユーザーに送信できます。

  2. KMS キーを使用してコードを暗号化するための Amazon Cognito サービスプリンシパルcognito-idp.amazonaws.comアクセスを許可します。

    次のリソースベースのポリシーをKMSキーに適用します。

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": "cognito-idp.amazonaws.com" }, "Action": "kms:CreateGrant", "Resource": "arn:aws:kms:us-west-2:111222333444:key/1example-2222-3333-4444-999example", "Condition": { "StringEquals": { "aws:SourceAccount": "111222333444" }, "ArnLike": { "aws:SourceArn": "arn:aws:cognito-idp:us-west-2:111222333444:userpool/us-east-1_EXAMPLE" } } }] }
  3. カスタム送信者トリガーのための Lambda 関数を作成します。Amazon Cognito はAWS 暗号化SDKを使用して、ユーザーのAPIリクエストを承認するシークレット、一時的なパスワード、コードを暗号化します。

    1. KMS 少なくともキーに対するkms:Decryptアクセス許可を持つIAMロールを Lambda 関数に割り当てます。

  4. Amazon Cognito サービスプリンシパルに、Lambda 関数を呼び出すための cognito-idp.amazonaws.com へのアクセス権を付与します。

    次の AWS CLI コマンドは、Lambda 関数を呼び出すアクセス許可を Amazon Cognito に付与します。

    aws lambda add-permission --function-name lambda_arn --statement-id "CognitoLambdaInvokeAccess" --action lambda:InvokeFunction --principal cognito-idp.amazonaws.com
  5. メッセージを送信する Lambda 関数コードを作成します。Amazon Cognito AWS Encryption SDK がカスタム送信者 Lambda 関数にシークレットを送信する前にAmazon Cognito が を使用してシークレットを暗号化します。関数内でシークレットを復号し、関連するメタデータを処理します。次に、コード、独自のカスタムメッセージ、送信先電話番号を、メッセージを配信APIするカスタムに送信します。

  6. Lambda 関数 AWS Encryption SDK に を追加します。詳細については、AWS 「暗号化SDKプログラミング言語」を参照してください。Lambda パッケージを更新するには、次のステップを完了します。

    1. Lambda 関数を.zip ファイルとして AWS Management Consoleにエクスポートします。

    2. 関数を開き、 を追加します AWS Encryption SDK。詳細とダウンロードリンクについては、AWS Encryption SDK デベロッパーガイドの「AWS Encryption SDK プログラミング言語」を参照してください。

    3. 関数をSDK依存関係で圧縮し、関数を Lambda にアップロードします。詳細については、AWS Lambda デベロッパーガイドの「Lambda 関数の .zip ファイルアーカイブとしてのデプロイ」を参照してください。

  7. ユーザープールを更新してカスタム送信者の Lambda トリガーを追加します。UpdateUserPool API リクエストに CustomSMSSender または CustomEmailSenderパラメータを含めます。UpdateUserPool API オペレーションには、ユーザープールのすべてのパラメータ変更するパラメータが必要です。関連するすべてのパラメータを指定しない場合、Amazon Cognito は不足しているパラメータの値をデフォルトに設定します。次の例に示すように、ユーザープールに追加または保持するすべての Lambda 関数のエントリを含めます。詳細については、「ユーザープールとアプリケーションクライアント設定の更新」を参照してください。

    #Send this parameter in an 'aws cognito-idp update-user-pool' CLI command, including any existing #user pool configurations. --lambda-config "PreSignUp=lambda-arn, \ CustomSMSSender={LambdaVersion=V1_0,LambdaArn=lambda-arn}, \ CustomEmailSender={LambdaVersion=V1_0,LambdaArn=lambda-arn}, \ KMSKeyID=key-id"

でカスタム送信者 Lambda トリガーを削除するにはupdate-user-pool AWS CLI、 から CustomSMSSender または CustomEmailSenderパラメータを省略し--lambda-config、ユーザープールで使用する他のすべてのトリガーを含めます。

UpdateUserPool API リクエストを使用してカスタム送信者 Lambda トリガーを削除するには、残りのユーザープール設定を含むリクエスト本文から CustomSMSSender または CustomEmailSenderパラメータを省略します。

コード例

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

KEY_ALIAS

ユーザーのコードを暗号化および復号するために使用するKMSキーのエイリアス

KEY_ARN

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

const AWS = require('aws-sdk'); const b64 = require('base64-js'); const encryptionSdk = require('@aws-crypto/client-node'); //Configure the encryption SDK client with the KMS key from the environment variables. const { encrypt, decrypt } = encryptionSdk.buildClient(encryptionSdk.CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT); const generatorKeyId = process.env.KEY_ALIAS; const keyIds = [ process.env.KEY_ARN ]; const keyring = new encryptionSdk.KmsKeyringNode({ generatorKeyId, keyIds }) exports.handler = async (event) => { //Decrypt the secret code using encryption SDK. let plainTextCode; if(event.request.code){ const { plaintext, messageHeader } = await decrypt(keyring, b64.toByteArray(event.request.code)); plainTextCode = plaintext } //PlainTextCode now contains the decrypted secret. if(event.triggerSource == 'CustomSMSSender_SignUp'){ //Send an SMS message to your user via a custom provider. //Include the temporary password in the message. } else if(event.triggerSource == 'CustomSMSSender_ResendCode'){ } else if(event.triggerSource == 'CustomSMSSender_ForgotPassword'){ } else if(event.triggerSource == 'CustomSMSSender_UpdateUserAttribute'){ } else if(event.triggerSource == 'CustomSMSSender_VerifyUserAttribute'){ } else if(event.triggerSource == 'CustomSMSSender_AdminCreateUser'){ } else if(event.triggerSource == 'CustomSMSSender_AccountTakeOverNotification'){ } return; };

カスタムSMS送信者関数を使用してSMSメッセージ機能を評価する

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

カスタム送信者 Lambda 関数を使用して Amazon Cognito SMS SMSメッセージングのテスト環境を作成するには、 の aws-samples ライブラリ GitHubamazon-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 のテンプレートを使用して本番環境を構築しないでください。ソリューションのカスタムSMS送信者 Lambda 関数はメッセージをシミュレートしますが、Lambda 関数はこれらすべてを 1 つの中央 E メールアドレスに送信します。 SMS本番稼働用 Amazon Cognito ユーザープールでSMSメッセージを送信する前に、 に示す要件を満たす必要がありますSMS Amazon Cognito ユーザープールのメッセージ設定

カスタム送信者 Lambda SMS トリガーソース

次の表は、Lambda コード内のカスタムトリガーソースのSMSトリガーイベントを示しています。

TriggerSource value イベント
CustomSMSSender_SignUp ユーザーがサインアップすると、Amazon Cognito がウェルカムメッセージを送信します。
CustomSMSSender_ForgotPassword ユーザーがパスワードをリセットするコードを要求します。
CustomSMSSender_ResendCode ユーザーが新しいコードをリクエストして登録を確認します。
CustomSMSSender_VerifyUserAttribute ユーザーが新しい E メールアドレスまたは電話番号の属性を作成すると、Amazon Cognito は属性を検証するコードを送信します。
CustomSMSSender_UpdateUserAttribute ユーザーが E メールアドレスまたは電話番号の属性を更新すると、Amazon Cognito は属性を検証するためのコードを送信します。
CustomSMSSender_Authentication SMS 多要素認証 (MFA) で設定されたユーザーがサインインします。
CustomSMSSender_AdminCreateUser ユーザープールに新しいユーザーを作成すると、Amazon Cognito から一時パスワードが送信されます。