Amazon Cognito ユーザープールでカスタム E メール送信者の Lambda トリガーを使用するにはどうすればよいですか?

所要時間4分
0

E メールメッセージを処理して配信するには、Amazon Cognito カスタム E メール送信者 AWS Lambda トリガーを呼び出す必要があります。

解像度

Amazon Cognito のカスタム E メール送信者トリガーを使用して、サードパーティプロバイダーが Lambda 関数コードからユーザーに E メール通知を送信できるようにします。Amazon Cognito は、Lambda 関数に E メールメッセージリクエストを送信します。次に、Lambda 関数がメールメッセージを処理して配信します。

メール送信者のカスタムトリガーとなる Lambda 関数を作成する

  1. 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 ファイルに追加します。

  1. .zip ファイルアーカイブ ,圧縮された index.js ファイルとも呼ばれます,を作成します:
$ zip function.zip index.js
  1. Lambda コンソールを開きます

  2. 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 <specify a region>

**メモ:置換<ExecutionRoleARN>Lambda 関数に関連付けたい AWS ID およびAccess Management (IAM) ロール Amazon Rsource name (ARN) を使用します。詳細については、「Lambda 実行ロール」を参照してください。CustomEmailSender を任意の関数名に置き換えることができます。置換してください<specify a region>**お使いの AWS リージョンコードを使用してください。

  1. AWS Encryption SDK を使用するには、@aws-crypto/client-node モジュールをインストールします。

@aws-crypto/client-node モジュールがインストールされていない場合は、次の高レベルのタスクを完了する必要があります:

  • モジュールをインストールします。
  • モジュールの最新バージョンをパッケージ化します。
  • Lambda 関数で使用できる依存関係を含む Lambda レイヤーを作成します。

**メモ:**Lambda と互換性のあるローカル開発環境でインストールコマンドを実行します。

作業ディレクトリの作成:

$ mkdir -p aws-crypto-layer/nodejs

作業ディレクトリの変更:

$ cd aws-crypto-layer/nodejs

npm パッケージマネージャーでaws-crypto モジュールの最新バージョンをインストールします:

$ npm install @aws-crypto/client-node

メモ: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 <specify a region>

Lambda レイヤーを関数に追加します:

$ aws lambda update-function-configuration --function-name CustomEmailSender --layers arn:aws:lambda:us-east-2:123456789012:layer:node_crypto:1 --region <specify a region>

メモ:****CustomEmailSenderを関数の名前に置き換えてください。arn: aws: lambda: us-east-2:123456789012: layer: node\ _crypto: 1 を**publish-layer-version コマンド出力の LayerVersionArn** 値に置き換えます。置換してください**<specify a region>**リージョンコードを。

AWS KMS で暗号化キーを作成する

Amazon Cognito は、AWS Key Management Service (AWS KMS)の対称暗号化キーを使用して、Amazon Cognito によって生成された一時的なパスワードと認証コードを暗号化します。

  1. AWS KMS キーを作成してください:
$ aws kms create-key --description "KMS Key for CustomEmailSender" --region <specify a region>

**メモ:置換<specify a 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 <specify a region>

メモ:置換<KeyId>create-key コマンドの出力からのキー ID 値を使用します。置換してください**<specify a region>**リージョンコードを。

このコード例では、暗号化キー情報を環境変数 KEY\ _ALIASKEY\ _ARN に依存しています。これらの環境変数は、LambdaトリガーのCustomEmailSender に設定する必要があります。

$ aws lambda update-function-configuration --function-name CustomEmailSender --environment 'Variables={KEY_ALIAS=alias/custom-email-key,KEY_ARN=<key_ARN>}' --region <specify a region>

メモ:CustomeMailSenderを Lambda 関数名に置き換えてください。alias/custom-email-key を AWS KMS キーのキーエイリアスに置き換えます。<key\ _ARN> create-keyコマンド出力の ARN 値に置き換えます。置換してください**<specify a region>**リージョンコードを。

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

次のコマンドを使用して、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 <specify a region>

メモ:CustomeMailSenderを Lambda 関数名に置き換えてください。置換してください**<UserPoolArn>ユーザープールの ARN で。ユーザープールの ARN を確認するには、Amazon Cognito コンソールのユーザープールページを開きます。次に、リストからユーザープールを選択します。または、describe-user-pool コマンドを実行してください。置換してください<specify a region>**リージョンコードを。

カスタム E メール送信者の Lambda トリガーを使用するように Amazon Cognito ユーザープールを更新する

UpdateUserPool API のCustomEmailSender パラメータを設定して、ユーザープールを更新します。UpdateUserPool には、ユーザープールの既存のパラメータと変更するパラメータがすべて必要です。Amazon Cognitoは、欠落しているパラメータの値をデフォルトに設定します。詳細については、「ユーザープール設定の更新」を参照してください。

次の例では、CustomEmailSenderの Lambda 関数の詳細で**--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 <specify a region>

メモ:置換<LambdaArn>作成関数コマンド出力からの関数の ARN 値を使用します。置換してください**<KMSKeyArn>create-key コマンドの出力で指定された ARN 値を使用します。置換してください<UserPoolId>お使いの Amazon Cognito ユーザープール IDで。置換してください<specify a 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ログへのアクセス」を参照してください。

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ