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