Amazon Cognitoの認証をトリガーにしたときのLambda関数(Python3.6)の書き方

どうも!大阪オフィスの西村祐二です。

ユーザーがサイトにログインしたら何らかの処理を実行させたい、などといったことがよくあると思います。

Amazon CognitoではいろんなフェーズでLambda関数を実行することができます。

そんなCognito認証をトリガーとしてLambda関数を実行させるときにハマってしまったので、
備忘録として今回はそれについて記載したいと思います。

Amazon Cognitoのトリガー設定

Amazon Cognitoでは下記のフェーズでLambda関数を実行することができます。

  • サインアップ前
  • 認証前
  • カスタムメッセージ
  • 認証後
  • 確認後
  • 認証チャレンジの定義
  • 認証チャレンジの作成
  • 認証チャレンジレスポンスの確認
  • トークン生成前

詳細はこちらのドキュメントを確認ください。

マネージメントコンソールからは下記図のように簡単にLambda関数をトリガーとして設定できます。

今回は「認証後(ログイン後)」にLambda関数を実行させるようにしたいと思います。

Lambda関数の作成

今回はPython3.6でどんなデータがeventに含まれるかを確認するだけのLambda関数を作ります。

def lambda_handler(event, context):
    print(event)
    return 'end'

ちなみに、Amazon CognitoのマネージメントコンソールからLambda関数を指定しトリガーに設定しても、
指定されたLambda関数のほうでは特に表示されないようです。

動作確認

※Amazon Cognitoを使ったログインサイトの実装は割愛します。

Cognito認証を使ってブラウザ上からログインしてみます。
Lambda関数は問題なく実行されますが、ブラウザ上ではうまくログインできずに
下記のような「Unrecognizable lambda output」というエラーが発生しました。

Lambdaの出力に問題があるのはわかるのですが、
いったいどのような出力にしたらいいかわからず
解決するのにかなり時間がかかりました。

解決策

結論から言うと
eventをretrunすることで
この問題を解消することができました。

つまり、下記のようにreturn eventとすれば問題なくCognito認証を使って正常にログインできました。

def lambda_handler(event, context):
    print(event)
    return event

ドキュメントにはNode.jsのサンプルコードしかのってなかったので
きちんと確認していなかったのですが、
サンプルコードの処理の終わりにはcontext.done(error, event);となってeventを返していました。

ドキュメントはしっかり読まないとダメですね

さいごに

いかがだったでしょうか。

Amazon Cognitoの認証をトリガーにしたときハマったので、それを解決するLambda関数(Python3.6)の書き方について記載しました。
CognitoとLambdaを組み合わせることでいろんなことができそうですね。

誰かの参考になれば幸いです。