CognitoのUserPoolを移行する
Cognito UserPoolに新しい認証方法を追加したいが、
そのためには既存のものを修正することはできず、新しいUserPoolを作らないといけない
『Cognito UserPool 実践入門』も参考になる
移行の方法は2つ
Lambdaを使用して漸進的に移行する
こっちについて見るmrsekut.icon
CSVで全移行する
パスワードリセットされる
Lambdaを使用する方の大まかなアーキテクチャ
プロダクトPはリリース後、新しいUserPool(以下NP)を見る
あるユーザーがリリース後に初めてPでログインしようとする
しかしNPを見ているのでそこにユーザー情報はない
このタイミングでLambdaを起動して、古いUserPool(以下OP)を見て、NPに移行させる
Lambda関数
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-sample-event-parameter-shared
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-lambda-migrate-user.html
型ってなんかのLibraryで提供されてないんか #??
aws-lambdaとかamazon-cognito-identity-jsとかにある
サンプルコード見つけての定数でgrepして型特定したりした
大まかな手順 ref
新しいUserPoolを作成
Lambda関数を作成
Node.jsのサンプルコード
関数のdocsとかも
これ微妙に中途半端でわからない
authenticateUserとlookupUserはどうすればいいんだ #??
Pythonのコードと型を参照してなんとかたどりついた
code:ts
import * as AWS from "aws-sdk";
const client = new AWS.CognitoIdentityServiceProvider();
...
const user = client.adminInitiateAuth({
UserPoolId: "**************,
ClientId: "**************,
AuthFlow: "**************,
AuthParameters: {
USERNAME: event.userName,
PASSWORD: event.request.password,
},
});
...
const user = client.adminGetUser({
UserPoolId: "*******",
Username: event.userName,
});
Pythonのサンプルコード
結局これにした
tsの方での、emailの取得の仕方がわからなかった
Cognitoのコンソール画面でLambdaをトリガーとして設定
クライアント側のAmplifyの設定に1行加える
code:amplify.js
Auth: {
identityPoolId: '*******',
region: 'ap-northeast-1',
userPoolId: '*******',
userPoolWebClientId: '*******',
authenticationFlowType: 'USER_PASSWORD_AUTH' // これ
},
テスト
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-lambda-migrate-user.html
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cognito-hosted-web-ui/
https://docs.aws.amazon.com/cognito/latest/developerguide/how-to-create-user-accounts.html