🔥

Cognito でサインアップしたユーザーの情報を DynamoDB に保存するには?

2021/02/28に公開

みんな大好き AWS Cognito。
https://aws.amazon.com/jp/cognito/

最近のサーバーレスアーキテクチャでは採用されることも多いと思いますが、1つ疑問がありました。
サインアップしたユーザーの情報はアプリ側でどう使えばいいの? ということです。

調べても中々出なかったので、今回はこの件について書きます🙌

結論

  • Cognito に保存されているユーザー情報を「認証・認可」以外で使うのはイケてない
  • サインアップ時に別途 DBに保存すべき
  • Cognito の Lambda トリガーで実現可能

解説

cognito ユーザープールにはユーザーに関する色んな情報が登録されますが、これらはあくまでも「認証・認可」のために使う情報です。
アプリ側で直接参照して使うものではありません。

例えばユーザーの詳細画面を実装するときに、 cognito にアクセスして取得した情報を表示するのはあまり良くありません。
DB では無いので扱いも大変です😥

なので多少の違和感があるかもしれませんが、cognito でユーザーがサインアップした時には、その情報を DB に「コピーする」ようにして、アプリ側ではそのデータを使うのが良いかなと思います😊

どうしていったら良いかを調べていたところ、 cognito の便利な機能を見つけました。
Lambda トリガーです
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html

詳細は公式を見て頂きたいのですが、私の理解では 「用意した Lambda 関数を様々な認証イベントの間にフックとして起動できる機能」 です。

トリガーは、認証前、認証後、など予め決められたイベントの中から選択します。
その中でも今回使うのは、「確認後 Lambda トリガー」です。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-lambda-post-confirmation.html

これを使うと、ユーザーがサインアップを行い、さらにその確認も済んだタイミングでトリガーとして設定しておいたLambda が起動します!!
もちろんサインアップしたユーザーの情報は Lambda に event として渡ってくるので、それを処理すればOKです。

必要なパラメーターが届き、Lambda でロジックを書けるならあとはいくらでもやれます😁
おそらく一般的には DynamoDB に INSERT すると思いますので、お使いのランタイムの SDK ドキュメントを確認してみてください。

トリガーはこの他にも使えそうです。
流石 AWS 。。。

おまけ

AWS SAM を使うと簡単にトリガーを設定することができます。

~~~
  SignUpHookFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: signup-hook-function
      CodeUri: cognito/
      Handler: handler
      Runtime: go1.x
      Role: !GetAtt LambdaRole.Arn
      Events:
        SignUpHook:
          Type: Cognito
          Properties:
            UserPool: !Ref UserPool
            Trigger:
              - PostConfirmation
~~~

一部抜粋で申し訳無いですが、ポイントは絞れていると思います。
AWS::Serverless::FunctionEvents プロパティにタイプを cognito、関連づける ユーザープールID とトリガーの種類(今回は PostConfirmation だけですが、配列なので複数指定可能です)を設定するだけです。
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-events


これが正解かは分からないので、もっと良いアイデアがあれば聞かせて頂きたいです🙏
今回は以上です〜


参考にさせて頂いた記事

Discussion