Help us understand the problem. What is going on with this article?

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

前書き

勉強用に何かしらのウェブサービスを作ろうと常々考えていたのですが、やはり認証基盤を自分で一から作るのは手間が非常にかかるので足踏みをしていました。
そこで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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした