前提
- 既存Cognitoユーザプールから新規ユーザプールへマイグレーションしたい
- ユーザにパスワードの再入力をさせたくない
可能にするやり方は調べた限り以下の2つのようでした。
- CSVでごっそりインポート
- Cognitoのユーザ移行トリガーを使ってLambdaを呼び出して1つずつ移行
今回はCognitoのユーザ移行トリガーを使ってLambdaを呼び出して1つずつ移行をやってみました。
Cognitoのユーザ移行トリガーの使い方
準備
- Cognitoのユーザ移行トリガーを移行Lambdaを設定する
- アプリクライアントの**アプリベースの認証でユーザー名とパスワードの (SRP を使用しない) フローを有効にする (USER_PASSWORD_AUTH)**にチェックを入れる
ユーザ移行トリガーの発火させ方 ーたった1つの大事なことー
USER_PASSWORD_AUTHで認証する!
具体的にはAWS AmplifyのConfigure以下のように明示的に指定する必要があります。
Amplify.configure({
Auth: {
// REQUIRED - Amazon Cognito Region
region: `${region}`,
// OPTIONAL - Amazon Cognito User Pool ID
userPoolId: `${pool_id}`,
// OPTIONAL - Amazon Cognito Web Client ID (26-char alphanumeric string)
userPoolWebClientId: `${client_id}`,
// OPTIONAL - Manually set the authentication flow type. Default is 'USER_SRP_AUTH'
authenticationFlowType: 'USER_PASSWORD_AUTH',
mandatorySignIn: true,
}
});
とConfigureでauthenticationFlowType: 'USER_PASSWORD_AUTH'
と設定したら、普通にログインを試みれば大丈夫です。
const user = await Auth.signIn(username, password);
this.user = cloneDeep(user);
return true;
これでユーザ移行トリガーが発火して設定したLambdaが動くことを確認できました。
#参照
https://stackoverflow.com/questions/52664612/cognito-user-migration-trigger-not-firing
所感
ユーザ移行トリガーは公式のドキュメントで、サインアップで発火とかサインインで発火とか、両方書いてあったので両方試しましたが、どちらも発火せずハマってしまいました。正解はサインインでした。大事なのは、authenticationFlowType: USER_PASSWORD_AUTH
で認証方法を指定することでした。そんなことドキュメントの例に書いてないんだもんなー
Cognitoの認証についてはもっと勉強が必要だと感じました。
ま、マイグレーションLambdaはこれから書くんですけどね。。。
SAM
SAMを使う場合、LambdaにCognitoのトリガーの設定に加え、パーミッションの設定してあげないとダメでした。
参照 https://forums.aws.amazon.com/thread.jspa?messageID=835378
migrateLambdaFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: migrate_func-python3.7/
Handler: app.lambda_handler
Description: Handle requests for sample
Timeout: 180
MemorySize: 128
Runtime: python3.7 # python3.7/go1.x/nodejs10.x
Tracing: Active # https://docs.aws.amazon.com/lambda/latest/dg/lambda-x-ray.html
Events:
Cognito:
Type: Cognito
Properties:
UserPool: !Ref UserPool
Trigger: UserMigration
PermissionToInvokeUserPoolMigration:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !Ref migrateLambdaFunction
Action: lambda:InvokeFunction
Principal: cognito-idp.amazonaws.com
SourceArn: !Sub arn:aws:cognito-idp:${AWS::Region}:${AWS::AccountId}:userpool/${UserPool}