Amazon Cognito ユーザープールでカスタム E メール送信者の Lambda トリガーを使用するにはどうすればよいですか?
E メールメッセージを処理して配信するために、Amazon Cognito カスタム E メール送信者 AWS Lambda トリガーを呼び出したいです。
解像度
Amazon Cognito のカスタム E メール送信者トリガーを使用して、サードパーティプロバイダーが Lambda 関数コードからユーザーに E メール通知を送信できるようにします。Amazon Cognito は、Lambda 関数に E メールメッセージリクエストを送信します。次に、Lambda 関数がメールメッセージを処理して配信します。
メール送信者のカスタムトリガーとなる Lambda 関数を作成する
-
index.js という名前のファイルを作成し、ファイルに次のコードを追加して変更を保存します。
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 has the decrypted secret. if(event.triggerSource == 'CustomEmailSender_SignUp'){ // Send email to end-user using custom or 3rd party provider. // Include temporary password in the email. console.log("CustomEmailSender_SignUp: " + plainTextCode); }else if(event.triggerSource == 'CustomEmailSender_ResendCode'){ console.log("CustomEmailSender_ResendCode: " + plainTextCode); }else if(event.triggerSource == 'CustomEmailSender_ForgotPassword'){ console.log("CustomEmailSender_ForgotPassword: " + plainTextCode); }else if(event.triggerSource == 'CustomEmailSender_UpdateUserAttribute'){ console.log("CustomEmailSender_UpdateUserAttribute: " + plainTextCode); }else if(event.triggerSource == 'CustomEmailSender_VerifyUserAttribute'){ console.log("CustomEmailSender_VerifyUserAttribute: " + plainTextCode); }else if(event.triggerSource == 'CustomEmailSender_AdminCreateUser'){ console.log("CustomEmailSender_AdminCreateUser: " + plainTextCode); }else if(event.triggerSource == 'CustomEmailSender_AccountTakeOverNotification'){ console.log("CustomEmailSender_AccountTakeOverNotification: " + plainTextCode); } return; };
警告:このコードは、暗号化されたシークレットを復号化するようにスクリプト化されています。シークレットは、Amazon Cognitoから送信される一時的なパスワードと認証コードです。また、このスクリプトでは、デモ用にプレーンテキストのコードをログに出力します。ただし、シークレットをプレーンテキストで記録することはセキュリティ上問題です。アプリケーションが本番環境にあるときは、復号化されたシークレットをログに出力しないでください。
カスタム E メールプロバイダーからユーザーに E メールメッセージを送信するための関連コードを index.js ファイルに追加します。 -
.zip ファイルアーカイブ ,圧縮された index.js ファイルとも呼ばれます,を作成します:
$ zip function.zip index.js
-
Lambda コンソールを開きます。
-
Node.js ランタイムでLambda 関数を作成します。
以下は、Node.js 14.x ランタイムで Lambda 関数を作成する AWS Command Line Interface (AWS CLI) コマンドの例です。
**注:**AWS CLI コマンドの実行中にエラーが発生した場合は、AWS CLIの最新バージョンを使用していることを確認してください。$ aws lambda create-function --function-name CustomEmailSender --runtime nodejs14.x --handler index.handler --zip-file fileb://function.zip --role ExecutionRoleARN --region REGION
**注:**ExecutionRoleARN を、Lambda 関数に関連付けたい AWS ID およびAccess Management (IAM) ロールの Amazon リソースネーム (ARN) に置き換えます。詳細については、「Lambda 実行ロール」を参照してください。CustomEmailSender を任意の関数名に置き換えることができます。REGION を実際の AWS リージョンコードに置き換えます。
-
AWS Encryption SDK を使用するには、@aws-crypto/client-node と base64-js モジュールをインストールします。
@aws-crypto/client-node モジュールがインストールされていない場合は、次の操作を行ってください。Lambda と互換性のあるローカル開発環境でインストールコマンドを実行します。
作業ディレクトリの作成:$ mkdir -p aws-crypto-layer/nodejs
作業ディレクトリの変更:
$ cd aws-crypto-layer/nodejs
npm パッケージマネージャーでaws-crypto モジュールの最新バージョンをインストールします:
$ npm install @aws-crypto/client-node $ npm install base64-js
注:Lambda リソースを開発する際は、Amazon Linux 2 環境を使用するのがベストプラクティスです。Windows または macOS オペレーティングシステムで開発する場合は、Docker を使用してaws-crypto モジュールをインストールします:
$ docker run --entrypoint "" -v "$PWD":/var/task "public.ecr.aws/lambda/nodejs:14" /bin/sh -c "npm install @aws-crypto/client-node; exit"
.zip ファイルを作成して Lambda レイヤーにアップロードします:
$ zip -r ../package.zip ../
@aws-crypto/client-node モジュールの最新バージョンを含む Lambda レイヤーを作成してください:
$ aws lambda publish-layer-version --layer-name node_crypto --description "My layer" --license-info "MIT" --compatible-runtimes nodejs14.x --zip-file fileb://../package.zip --region REGION
Lambda レイヤーを関数に追加します:
$ aws lambda update-function-configuration --function-name CustomEmailSender --layers arn:aws:lambda:us-east-2:123456789012:layer:node_crypto:1 --region REGION
注:****CustomEmailSenderを関数の名前に置き換えてください。arn: aws: lambda: us-east-2:123456789012: layer: node\ _crypto: 1 を**publish-layer-version コマンド出力の LayerVersionArn** 値に置き換えます。REGION を実際の AWS リージョンコードに置き換えます。
AWS KMS で暗号化キーを作成する
Amazon Cognito は、AWS Key Management Service (AWS KMS)の対称暗号化キーを使用して、Amazon Cognito によって生成された一時的なパスワードと認証コードを暗号化します。
-
次のコマンドを使用して AWS KMS キーを作成します。
$ aws kms create-key --description "KMS Key for CustomEmailSender" --region REGION
**注:**REGION を該当するリージョンに置き換えます。
このコマンドはキーポリシーを指定しないため、デフォルトのキーポリシーが割り当てられます。カスタマイズされたキーポリシーを AWS KMS キーに適用するには、JSON ポリシーでコマンドに --policy パラメータを追加します。カスタムのメールトリガーを追加するには、UpdateUserPool オペレーションを実行する IAM エンティティに kms: CreateGrant 権限を必ず付与してください。
create-key コマンドを実行するときにエイリアスを指定することはできません。新しい KMS キーのエイリアスを作成するには、create-alias コマンドを使用します:$ aws kms create-alias --alias-name alias/custom-email-key --target-key-id KeyId --region REGION
**注:**Keyid を create-key コマンドの出力にあるキーID値に置き換えます。REGION を該当するリージョンに置き換えます。
このコード例では、暗号化キー情報を環境変数 KEY_ALIAS と KEY_ARN に依存しています。これらの環境変数は、LambdaトリガーのCustomEmailSender に設定する必要があります。$ aws lambda update-function-configuration --function-name CustomEmailSender --environment 'Variables={KEY_ALIAS=alias/custom-email-key,KEY_ARN=key_ARN}' --region REGION
**注:**CustomeMailSender を Lambda 関数名に置き換えます。alias/custom-email-key を AWS KMS キーのキーエイリアスに置き換えます。key_ARN を create-key コマンド出力の ARN 値に置き換えます。REGION を該当するリージョンに置き換えます。
-
Amazon Cognitoサービスプリンシパルに、Lambda 関数を呼び出す cognito-idp.amazonaws.com 権限を付与する 以下のコマンドを使用して、Lambda 関数を呼び出す Amazon Cognito サービスプリンシパルに権限を付与します。
$ aws lambda add-permission --function-name CustomEmailSender --statement-id "CognitoLambdaInvokeAccess" --action lambda:InvokeFunction --principal cognito-idp.amazonaws.com --source-arn UserPoolArn --region REGION
**注:**CustomeMailSender を Lambda 関数名に置き換えます。UserPoolARN をユーザープール ARN に置き換えます。ユーザープールの ARN を確認するには、Amazon Cognito コンソールのユーザープールページを開きます。次に、リストからユーザープールを選択します。または、describe-user-pool コマンドを実行してください。REGION を該当するリージョンに置き換えます。
-
Amazon Cognitoユーザープールを更新して、カスタムメール送信者 Lambda トリガーを使用するように設定します。UpdateUserPool API の CustomEmailSender パラメータを設定します。UpdateUserPool には、ユーザープールの既存のパラメータと変更するパラメータがすべて必要です。Amazon Cognitoは、欠落しているパラメータの値をデフォルトに設定します。詳細については、「ユーザープール設定の更新」を参照してください。
次の例では、CustomEmailSender 関数の詳細で**--lambda-config** パラメータのみが使用されています。そのため、コマンドはCustomEmailSenderトリガーをユーザープールに追加し、残りのユーザープールパラメータをデフォルトに設定します。ユーザープールをデフォルト以外の値で構成する場合は、デフォルトに設定されないようにupdate-user-pool コマンドに値を渡してください。$ aws cognito-idp update-user-pool --lambda-config "CustomEmailSender={LambdaVersion=V1_0,LambdaArn= LambdaARN},KMSKeyID=KMSKeyARN" --user-pool-id UserPoolId --region REGION
**注:**LambdaARN を、create-function コマンドの出力にある関数の ARN 値に置き換えます。KMSKeyARN を、create-key コマンドの出力から提供された ARN 値に置き換えます。UserPoolId を Amazon Cognito ユーザープール ID に置き換えます。REGION を該当するリージョンに置き換えます。
機能をテストする
Lambda 関数の統合をテストするには、E メールの検証やパスワードの回復など、ユーザープールからユーザーの E メール送信者操作をシミュレートします。次の例は、Amazon Cognito によって Lambda 関数に送信された ForgotPassword イベントを示しています。
{ version: '1', triggerSource: 'CustomEmailSender_ForgotPassword', region: 'us-east-1', userPoolId: 'us-east-1_xxxxxxxx', userName: 'example_user', callerContext: { awsSdkVersion: 'aws-sdk-unknown-unknown', clientId: '12a3b4example-clientid' }, request: { type: 'customEmailSenderRequestV1', code: 'XXXXeBlI7XP3RQmipedVF+7OGa4AgQACABVhdXXXXXXXvLXB1YmxpYy1rZXkAREF6Zk9NR2lBR0FUeDRITStmRHl4RDJyNlpqa2wvWktBbG45ckRmTEpMZ1A3THp4ME9RaVVjVHl3MVFOSEZjS3piZz09AAt1c2VycG9vbC1pZAATdXMtZWFzdC0xX29DOUhnUHVKWgABAAdhd3Mta21zAEthcm46XXdzOmttczp1cy1lYXN0LTE6XXX3XXc0NDA5OXXzOmtleS8yNmQ0ZjVmMy00YmZhLTQ0OXXtODUxZS01ZTM2ZWIwYjhmYjMAuAECAQB42Am0o+Rx0MgG+wLLyKtm1/vTm03JK3jQBZxqABAkreYBMOoAUtm3mLS7+kb2VL0SHgAAAH4wfAYJKoZIhvcNAQcGoG8wbQIBADBoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHjPPHlSWPt+UKrQOQIBEIA7oFUeGe2NPX2cuEVi+Qxwp8/IH1bgyYQut+QbbkElc1rXXXXXbeEVMjMkFQmQufmJyag9v1f+PUalvXwXAAAAAAwAABAAAAAAAAAAAAAAAAAAscZHg8dY/cKTskGQc065mv////8AAAABAAAAAAAAAAAAAAABAAAABpofXaVnP4pmf+yMoCElrOGy7Gn8pIUAZzBlAjEAn/7tuTNko8/HCwXXXXlCOJDeU0SSyB7o9y0TXHM7GptdvmB1JL9OzLxmUg6zChIhAjAFFbH4NrSblvwh/m0inDc11BpeOSKghtg8Pg5Nkf8eY6vmXX6GxjaCuyhBSO7IDcM=', clientMetadata: null, userAttributes: { sub: '1a2b3cde-33cd-402f-5g67-examplesub', 'cognito:user_status': 'CONFIRMED', email_verified: 'true', email: 'user@example.com' } } }
次の例は、プレーンテキストコードの応答です:
CustomEmailSender_ForgotPassword: 12345
すべてのログは、Lambda 関数用に作成された Amazon CloudWatch ロググループで確認できます。これらのログを確認する方法の詳細については、「AWS Lambda で Amazon CloudWatch Logs使用する」を参照してください。
AWS Encryption SDK を使用するには、@aws-crypto/client-node と base64-js モジュールをインストールします。
関連するコンテンツ
- 質問済み 9ヶ月前lg...
- 質問済み 1年前lg...
- 質問済み 2ヶ月前lg...
- 質問済み 1年前lg...
- AWS公式更新しました 2年前