移行などでCognitoにユーザを移したいケースがあるかと思います。AWSではその仕組みを作成できるので事例とともに紹介します。
実現したいこと ユーザをCognitoに移行する
Cognitoへのユーザの移行です。移行元はCognito以外も使えますが、検証では移行元もCognitoで実行しました。Cognitoの場合、クロスアカウントでも問題ありません。
検証では旧アカウントのCognitoにユーザが登録されているので新アカウントのCognitoにユーザを移していきます。
実現方法 Cognitoのトリガでユーザ移行Lambdaを実行する
Cognitoへの移行はCSVでも可能ですが、CSVではパスワードの移行が不可能です。パスワードも移行対象としたい場合はCognitoのトリガとユーザ移行用のLambdaを実装する必要があります。
以下、AWS公式ドキュメントでCognitoのユーザ移行トリガが紹介されています。
ユーザー移行の Lambda トリガーを使用したユーザープールへのユーザーのインポート
ユーザ移行Lambdaを実装すると以下図のようなアーキテクチャになります。
一気にユーザを移行するということではなく、ユーザがログインするたびにそのユーザだけが新Cognitoに移行されていきます。
AWSのドキュメントには下記の通り「既存のユーザーディレクトリまたはユーザーデータベース」とあるので移行元はCognitoでなくても使えます。移行元のユーザディレクトリによってユーザ移行Lambdaの実装を行えばOKです。
図2の流れを順に解説していきます。図中の番号と以下の番号はリンクさせています。
- ユーザがID/PWでログイン:旧Cognitoから新Cognitoに向き先を変更しておけば、ユーザは普段と同じようにID/PWでログインするのと変わりはありません。普段通りのログインと同じです。新Cognitoに対して認証をかけます。認証が成功した場合はここで終了。認証が失敗してかつ新CognitoにIDが存在しない場合は2に進みます。
- ユーザが存在しない場合Cognitoがユーザ移行Lambdaをトリガする:1でユーザが入力してきたIDが新Cognitoに存在しない場合、ユーザ移行Lambdaをトリガします。この時引数にユーザが入力してきたIDとPWを渡します。
- ユーザ移行LambdaがID/PWで旧Cognitoに認証:ユーザ移行Lambdaは受け取ったID/PWで旧Cognitoに認証に行きます。(admin_initiate_authを使用できます。)認証が成功した場合、4に進みます。クロスアカウントの場合はIAMRoleでスイッチロールさせましょう。その際に信頼関係の設定もお忘れなく。
- 旧CognitoからJWT返却:認証に成功するとJWTが返却されます。JWTからID/PW以外の情報を取り出せます。JWTはbase64になっているのでdecodeすればメールアドレスやユーザ名も取り出すことができます。
参考:Amazon Cognito JSON ウェブトークンの署名を復号して検証するにはどうすればよいですか? - 認証が成功した場合新Cognitoにユーザ作成:新CognitoにID/PWと4で取り出した情報を使いユーザを作成します。ユーザにTOKENを返します。
流れとしては旧Cognitoから新Cognitoにユーザを移動させるというより、旧Cognitoにあって新Cognitoに無いユーザを作っているという感じですね。
実装例
実装と設定については以下の記事で記載しています。
PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!
SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ
システムエンジニア
AWSを中心としたクラウド案件に携わっています。
IoTシステムのバックエンド開発、Datadogを用いた監視開発など経験があります。
IT資格マニアでいろいろ取得しています。
AWS認定:SAP, DOP, SAA, DVA, SOA, CLF
Azure認定:AZ-104, AZ-300
ITIL Foundation
Oracle Master Bronze (DBA)
Oracle Master Silver (SQL)
Oracle Java Silver SE
■略歴
理系の大学院を卒業
IT企業に就職
AWSのシステム導入のプロジェクトを担当