Cognito 사용자 풀에서 보내는 메일 사용자 지정

서비스 인증에 Cognito 사용자 풀을 사용할 때 확인 코드나 처음 로그인 비밀번호 등을 이메일로 알려주는 경우가 있다고 생각합니다.

Cognito의 기본 설정이라면 이런 메일이 도착합니다.
Your confirmation code is 927173
Your username is xxxx and temporary password is xxxxxx.

이 메일 제목, 본문을 사용자 정의하는 방법입니다.

맞춤 메시지를 설정할 수 있는 이벤트



공식 문서에서 발췌한 것입니다.
다음은 맞춤 메시지가 설정할 수 있는 이벤트 목록입니다.

AWS Lambda 트리거 요청 및 응답 파라미터


triggerSource 값
트리거 이벤트


CustomMessage_AdminCreateUser
사용자 지정 메시지 – 새 사용자에게 임시 암호를 보내기 위해.

CustomMessage_ResendCode
맞춤 메시지 – 기존 사용자에게 확인 코드를 다시 보내기 위해.

CustomMessage_ForgotPassword
맞춤 메시지 - 잊어 버린 암호 요청에 대한 확인 코드를 보내기 위해.

CustomMessage_UpdateUserAttribute
사용자 지정 메시지 - 사용자의 이메일 또는 전화 번호가 변경되면 이 트리거는 인증 코드를 해당 사용자에게 자동으로 보냅니다. 다른 속성에는 사용할 수 없습니다.

CustomMessage_VerifyUserAttribute
사용자 지정 메시지 - 사용자가 수동으로 새 이메일 및 전화 번호의 인증 코드를 요청하면이 트리거는 사용자에게 인증 코드를 보냅니다.

CustomMessage_Authentication
맞춤 메시지 - 인증시 MFA 코드를 보내기 위해.


이번에는 triggerSource 값이 CustomMessage_AdminCreateUser의 경우 사용자 정의를 예로 합니다.

절차


  • Lambda 함수 만들기
  • Cognito 사용자 풀에 1.에서 만든 함수를 등록

  • 1. Lambda 함수 만들기



    Python3.6의 예입니다.
    기능의 IAM 역할은 Cloudwatch 로깅 권한만 부여하면 됩니다. 다음 IAM 정책의 예입니다.
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "logs:CreateLogGroup",
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                ],
                "Resource": [
                    "*"
                ],
                "Effect": "Allow"
            }
        ]
    }
    

    Lambda 함수로 받는 이벤트를 로그 출력하면 이런 느낌.
    {
        "version": "1",
        "region": "ap-northeast-1",
        "userPoolId": "ap-northeast-1_xxxxxxxxx",
        "userName": "hogee",
        "callerContext": {
            "awsSdkVersion": "aws-sdk-js-2.176.0",
            "clientId": "CLIENT_ID_NOT_APPLICABLE"
        },
        "triggerSource": "CustomMessage_AdminCreateUser",
        "request": {
            "userAttributes": {
                "sub": "bf6e9c66-0a69-476e-bfd8-724d38e6555f",
                "cognito:email_alias": "[email protected]",
                "email_verified": "True",
                "cognito:user_status": "FORCE_CHANGE_PASSWORD",
                "name": "hoge",
                "email": "[email protected]"
            },
            "codeParameter": "{####}",
            "usernameParameter": "{username}"
        },
        "response": {
            "smsMessage": "None",
            "emailMessage": "None", # ここをカスタムした本文に変える
            "emailSubject": "None" # ここをカスタムしたタイトルに変える
        }
    }
    

    이 이벤트를 그대로 return event 로 하면(자) 디폴트 설정이 적용된 메일이 보내집니다. 사용자 정의하려면 response 필드를 사용자 정의하려는 내용으로 다시 작성하고 리턴하십시오.

    cognito_custom_message.py
    # -*- coding:utf-8 -*-
    
    def handler(event, context):
        if event['triggerSource'] == 'CustomMessage_AdminCreateUser':
            customed_event = custom_message_admin_create_user(event)
    
        return customed_event
    
    
    def custom_message_admin_create_user(event):
    
        email_message = '''
    {username} 様
    <br>
    <br>
    管理者から招待されました。
    <br>
    <br>
    ログインメールアドレス:{mail}
    <br>
    初回ログインパスワード:{password}
    '''.format(username='{username}',
               mail=event['request']['userAttributes']['email'],
               password='{####}')
    
        event['response']['emailSubject'] = '仮パスワード発行のお知らせ'
        event['response']['emailMessage'] = email_message
    
        return event
    
    {username} 에 사용자 이름, {####} 에 암호가 포함되어 메일이 전송됩니다.
    triggerSource에 따라 본문에 포함해야 하는 코드 매개변수는 다르므로 방금 전 공식 문서에서 확인하십시오.
    triggerSource가 CustomMessage_AdminCreateUser이면 메시지 본문에 {username}{####}가 없으면 오류가 발생합니다.

    추가로 사용자 정의 메시지 이벤트를 처리하려는 경우 handler()
        elif event['triggerSource'] == 'CustomMessage_ForgotPassword':
            customed_event = custom_message_forgot_password(event)
    

    그렇게하면 대응할 수 있습니다.

    2. Cognito 사용자 풀에 1.에서 만든 함수를 등록



    Lambda 함수를 만든 후 Cognito 사용자 풀의 콘솔로 이동하여 트리거 → 사용자 지정 메시지에서 만든 Lambda 함수를 지정합니다.



    serverless framework에서는 이렇게 됩니다.

    serverless.yml
    <略>
    functions:
      cognitoCustomMessage:
        handler: functions/cognito_custom_message.handler
        role: CognitoCustomMessageRole
        events:
          - cognitoUserPool:
              pool: UserPool
              trigger: CustomMessage
    resources:
      Resources:
        CognitoUserPoolUserPool:
          <以下略>
    

    설정 후 애플리케이션에서 사용자를 등록해 보면,



    맞춤형 이메일이 도착했습니다.

    이상입니다.

    좋은 웹페이지 즐겨찾기