CognitoのカスタムメッセージLambdaトリガーを使ってみた

2019.08.01

こんにちは。カトアキです。

夏ですね。

僕の住んでいる会津では今トマトが旬です。 会津トマトは春のアスパラ・秋の米(&日本酒!)・冬の会津地鶏と並ぶ4大名物(カトアキ調べ)の一つです。 こちらは盆地のため、昼は暑くて夜が寒いというのは嫌な面もありますが、この寒暖差によって美味しいトマトとか米が食べられるのはいいところです。県外の方はもしこちらにいらしたときはぜひ食べてみてください。

はじめに

さて、唐突な食の話から本題に移ります。

Cognitoでユーザ登録の仕組みを作ると、新規登録時に指定したメールアドレス宛に検証コードが送信され、コードを入力することで登録を完了するという流れにすることができます。

その上で、カスタムメッセージLambdaトリガーを使用すると、検証コードを送信する際に送るメールの内容を動的に変更することができるのでそちらを試してみました。それについてお伝えします!

今回やってみたこと

サインアップの検証コードを受け取る際のデフォルトのメール文面は次のようになっています。

メールには検証コードが記載されていますが、これには有効期限があります。24時間です。

[参考]Amazon Cognitoにおける制限

24時間後っていつ?というのが、ちょっとわかりづらい人がいるかもしれません。今回は、「有効期限は 8/210:00までです」といった形で期限を動的に出してあげるものを作ってみることにしました。

どうやるのか

進め方

Lambda Functionの作成

以下のようなLambda Functionを作成します。

コード:

import datetime
 
message_template= '''
<html>
<head></head>
<body>
  <p>確認コード:{{####}} </p> <br/>
  <p>※有効期限は{limit}までとなります。ご注意ください。</p>
</body>
</html>
'''.strip()
 
def handler(event, context):
    now = datetime.datetime.now()
    after_24hours = now + datetime.timedelta(hours=24)
    message = message_template.format(limit=after_24hours.strftime('%Y-%m-%d %H:%M:%S'))
 
    event['response']['emailSubject'] = '検証コードの送付'
    event['response']['emailMessage'] = message
    event['response']['smsMessage'] = message
 
    print(event)
 
    return event

環境変数:

TZ Asia/Tokyo

その他の設定

ランタイム Python 3.7
ハンドラ lambda_function.handler

Cognitoの設定

ユーザプールのカスタムメッセージトリガにで作成したLambda Functionをセットします。

動作確認

サインアップ:

CLIでユーザープールにサインアップします。

$ aws --profile $profile cognito-idp sign-up \
--client-id $clientId \
--username $username \
--password $password \
--user-attributes \
Name="phone_number",Value=“$tel”,\
Name="email",Value="$mailAddress" \
Name="name",Value=$username

上記コマンドのオプションですが、各自の環境に合わせて変更する必要があります

項目 説明
profile AWS-CLIのプロファイルです katoaki_dev
clientId ユーザプールのアプリクライアントIDなければ作成してください※例の値はダミーです。 266tupoikdklbu0tliaa1lil99
username 登録するユーザ名です katoaki
password 登録するパスワードです※ユーザプールのポリシーに沿っている値をセットしてください。 Yg74ahjX
mailAddress 登録するメールアドレスです。ここに検証コードについてのメールが届きます。※例のメアドはダミーです k-a-t-o-a-k-i@classmethod.jp
tel 登録する電話番号です 818012345678
userpoolid ユーザプールIDです ap-northeast-1_UaaaFrPLiS
CLIの公式な説明はこちらを参照ください:[参考]cognito-idp — AWS CLI 1.16.209 Command Reference

コマンドを実行し、次のようにメールが届きました。

最後に、サインアップしたユーザを次のコマンドで削除しておきます。

ユーザ削除:

$ aws --profile $profile cognito-idp admin-delete-user \
--user-pool-id $userpoolId \
--username $username

さいごに

ちなみにですが、カスタムメッセージLambdaトリガーはサインアップ以外のイベントもハンドリングすることができます。

[参考]Lambda トリガーを使用したユーザープールワークフローのカスタマイズ - Amazon Cognito

誰かの参考になれば幸いです。それから、忘れた頃の自分の助けになればと思ってもいます。