사용자 정의 이메일 발신자 Lambda 트리거 - Amazon Cognito

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

사용자 정의 이메일 발신자 Lambda 트리거

사용자 지정 이메일 발신자 트리거를 사용자 풀에 할당하면 Amazon Cognito가 사용자 이벤트로 인해 이메일 메시지를 전송해야 하는 경우 기본 동작 대신 Lambda 함수를 호출합니다. 사용자 지정 발신자 트리거를 사용하면 AWS Lambda 함수가 선택한 메서드와 공급자를 통해 사용자에게 이메일 알림을 보낼 수 있습니다. 함수의 사용자 지정 코드는 사용자 풀의 모든 이메일 메시지를 처리하고 전달해야 합니다.

이 트리거는 사용자 풀이 이메일 메시지를 보내는 방법을 더 잘 제어하려는 시나리오를 제공합니다. 예를 들어 여러 개의 인증 ID를 관리하거나 AWS 리전간에 사용하려는 경우와 같이 Lambda 함수를 사용하여 Amazon SES API 작업에 대한 호출을 사용자 지정할 수 있습니다. 함수는 메시지를 다른 전송 미디어 또는 타사 서비스로 리디렉션할 수도 있습니다.

사용자 지정 이메일 발신자 트리거를 구성하는 방법은 섹션을 참조하세요사용자 지정 발신자 Lambda 트리거 활성화.

사용자 정의 이메일 발신자 Lambda 트리거 소스

다음 표에는 Lambda 코드의 사용자 지정 이메일 트리거 소스에 대한 트리거 이벤트가 나와 있습니다.

TriggerSource value Event
CustomEmailSender_SignUp 사용자가 가입하면 Amazon Cognito에서 시작 메시지를 보냅니다.
CustomEmailSender_Authentication 사용자가 로그인하면 Amazon Cognito가 다중 인증(MFA) 코드를 전송합니다.
CustomEmailSender_ForgotPassword 사용자가 암호를 재설정하는 코드를 요청합니다.
CustomEmailSender_ResendCode 사용자가 대체 계정 확인 코드를 요청합니다.
CustomEmailSender_UpdateUserAttribute 사용자가 이메일 주소 또는 전화 번호 속성을 업데이트하면 Amazon Cognito에서 속성을 확인하는 코드를 보냅니다.
CustomEmailSender_VerifyUserAttribute 사용자가 새 이메일 주소 또는 전화 번호 속성을 생성하면 Amazon Cognito에서 속성을 확인하는 코드를 보냅니다.
CustomEmailSender_AdminCreateUser 사용자 풀에 새 사용자를 생성하면 Amazon Cognito에서 해당 사용자에게 임시 암호를 보냅니다.
CustomEmailSender_AccountTakeOverNotification Amazon Cognito는 사용자 계정을 획득하려는 시도를 감지하고 사용자에게 알림을 보냅니다.

사용자 지정 이메일 발신자 Lambda 트리거 파라미터

Amazon Cognito가 이 Lambda 함수에 전달하는 요청은 아래 파라미터와 Amazon Cognito가 모든 요청에 추가하는 공통 파라미터의 조합입니다.

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

사용자 지정 이메일 발신자 요청 파라미터

type

요청 버전입니다. 사용자 지정 이메일 발신자 이벤트의 경우 이 문자열의 값은 항상 customEmailSenderRequestV1입니다.

code

함수가 해독하여 사용자에게 보낼 수 있는 암호화된 코드입니다.

clientMetadata

사용자 지정 이메일 발신자 Lambda 함수 트리거에 대한 사용자 지정 입력으로 제공할 수 있는 하나 이상의 키-값 페어입니다. 이 데이터를 Lambda 함수에 전달하려면 AdminRespondToAuthChallengeRespondToAuthChallenge API 작업에서 ClientMetadata 파라미터를 사용합니다. Amazon Cognito는 사후 승인 함수에 전달하는 요청에 있는 AdminInitiateAuthInitiateAuth API 작업의 ClientMetadata 파라미터에서 전달된 데이터를 포함하지 않습니다.

참고

Amazon Cognito는 다음과 같은 트리거 소스가 있는 이벤트에서 사용자 지정 이메일 트리거 함수로 ClientMetadata를 전송합니다.

  • CustomEmailSender_ForgotPassword

  • CustomEmailSender_SignUp

  • CustomEmailSender_Authentication

Amazon Cognito는 소스 CustomEmailSender_AccountTakeOverNotification를 사용하여 트리거 이벤트에서 ClientMetadata를 전송하지 않습니다.

userAttributes

사용자 속성을 나타내는 하나 이상의 키-값 페어입니다.

사용자 지정 이메일 발신자 응답 파라미터

Amazon Cognito는 사용자 지정 이메일 발신자 응답에서 추가 반환 정보를 기대하지 않습니다. Lambda 함수는 이벤트를 해석하고 코드를 복호화한 다음 메시지 내용을 전달해야 합니다. 일반적인 함수는 이메일 메시지를 조합하여 타사 SMTP 릴레이로 전달합니다.

코드 예제

다음 Node.js 예제에서는 사용자 지정 이메일 발신자 Lambda 함수에서 이메일 메시지 이벤트를 처리합니다. 이 예에서는 함수에 두 개의 환경 변수가 정의되어 있다고 가정합니다.

KEY_ID

사용자 코드를 암호화하고 해독하는 데 사용할 KMS 키의 ID입니다.

KEY_ARN

사용자 코드를 암호화하고 복호화하는 데 사용하려는 KMS 키의 Amazon 리소스 이름(ARN)입니다.

이 함수를 배포하려면
  1. 개발자 워크스페이스에 최신 버전의 NodeJS를 설치합니다.

  2. 워크스페이스에서 새 NodeJS 프로젝트를 생성합니다.

  3. 를 사용하여 프로젝트를 초기화합니다npm init -y.

  4. Lambda 함수에 대한 스크립트를 생성합니다touch index.mjs.

  5. 아래 예제의 내용을에 붙여 넣습니다index.mjs.

  6. 프로젝트 종속성 다운로드 AWS Encryption SDK: npm install @aws-crypto/client-node.

  7. 프로젝트 디렉터리를 파일로 압축합니다zip -r my_deployment_package.zip ..

  8. 함수에 ZIP 파일을 배포합니다.

이 예제 함수는 코드를 복호화하고, 가입 이벤트의 경우 사용자의 이메일 주소로 이메일 메시지를 보내는 것을 시뮬레이션합니다.

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; } };