LoginSignup
8
7

More than 3 years have passed since last update.

Cognitoのユーザ移行トリガーの使い方のたった1つの大事なこと。あとSAMでのコツ

Last updated at Posted at 2019-10-17
1 / 2

前提

  • 既存Cognitoユーザプールから新規ユーザプールへマイグレーションしたい
  • ユーザにパスワードの再入力をさせたくない

可能にするやり方は調べた限り以下の2つのようでした。

  1. CSVでごっそりインポート
  2. Cognitoのユーザ移行トリガーを使ってLambdaを呼び出して1つずつ移行

今回はCognitoのユーザ移行トリガーを使ってLambdaを呼び出して1つずつ移行をやってみました。

Cognitoのユーザ移行トリガーの使い方

準備

  1. Cognitoのユーザ移行トリガーを移行Lambdaを設定する
  2. アプリクライアントのアプリベースの認証でユーザー名とパスワードの (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が動くことを確認できました。

参照

所感

ユーザ移行トリガーは公式のドキュメントで、サインアップで発火とかサインインで発火とか、両方書いてあったので両方試しましたが、どちらも発火せずハマってしまいました。正解はサインインでした。大事なのは、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}

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7