LoginSignup
13
8

More than 3 years have passed since last update.

CognitoUserPoolの情報をLambda経由でRDSへ連携した

Posted at

前書き

勉強用に何かしらのウェブサービスを作ろうと常々考えていたのですが、やはり認証基盤を自分で一から作るのは手間が非常にかかるので足踏みをしていました。
そこでCognitoを使おうと思ったのですがサーバーレス構成もNOSQLも使ったことがないのとNOSQL辛いよというアドバイスを頂いたので、とりあえず作るということを優先して日頃なれているRDBに認証情報を放りこみたかったという感じです。
なお技術スタックとしてLambdaではNode.js、RDSにはPostgreSQLを採用しました。

流れ

  1. CognitoのイベントをLambdaでフックする
  2. LambdaでCognitoの認証情報を取得する
  3. LambdaからRDSへデータを書き込む

1. CognitoのイベントフックをLambdaで行う

Cognitoはサインアップ前確認後などそれぞれのイベントに合わせてLambdaでフックすることができます。
今回のユースケースでは確認後に行うのが適切でしょうか。今回私は確認後で設定しました。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html

2. LambdaでCognitoの認証情報を取得する

Cognitoのイベントフックとして使用した場合、Lambdaのevent引数に認証情報が渡されます。
以下のJson形式で渡される共通パラメータに加えて、各イベントごとに固有のパラメータが追加されます。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html#cognito-user-pools-lambda-trigger-event-parameter-shared
確認後イベントの場合、event.request.userAttributes以下にユーザープールの属性値が入ってくる形になります。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-lambda-post-confirmation.html#w208aac15c27c23c15b9b1
今回私はuserName情報とemail情報を書き込んだので、event.userNameとevent.request.userAttributes.emailになりますね。

3. LambdaからRDSへデータを書き込む

LambdaからPostgreSQLへ接続する

今回のLambdaのためにNode.jsを初めていじったので全く詳しくないのですが、Node.jsからPostgreSQLへ接続するにはpgパッケージを用いるのが一般的なようです。
ただLambda内でnpm installやyarn addを行うことはできないので、別の環境で用意したnodeModulesをLambdaへアップロードする必要があります。
様々な方法があるようなのですが、今回はローカルで作成したコードを雑にzipで固めてアップロードしました。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-deployment-package-nodejs/

LambdaからRDSへのアクセス制御

細かい話ですがRDSはVPC内に存在しているのでLambdaからアクセス可能にしておかなければなりません。
今回はRDSとLambdaをデフォルトVPCに所属させることとしました。

成果物

以下のリポジトリです
https://github.com/inobu/cognito-rds-associate

13
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8