こんにちは、広野です。
アプリ管理者にアプリのユーザを管理させたいとき、アプリ画面にユーザのリストを表示して、そこから個々のユーザ情報の編集画面に繋げていく、というのが一般的なつくりだと思います。
ここではそのようなケースを想定して、Amazon Cognito が認証基盤として使用されているケースにおいて、Amazon Cognito ユーザのデータを AWS Lambda で取得するサンプルを紹介します。
やりたいこと
- Amazon Cognito ユーザのリストを AWS Lambda で取得する。
AWS Lambda 関数 (Python)
AWS Lambda 関数で boto3 を使用して Amazon Cognito のユーザを取得する際、1回のクエリーで取得可能なデータ件数は最大60件という仕様があります。そのため、データ件数がそれより多い場合は続きのデータを取得する処理を繰り返す必要があります。この60件制限は boto3 のドキュメントには載っていないのですが、実際にやってみると引っ掛かりますので要注意です。
1回目のクエリーを実行した結果、続きのデータがある場合はデータとともに PagenationToken という値が付加されて返ってきます。PagenationToken が無ければデータ取得処理は終了、有れば PagenationToken を付加してクエリーし、続きのデータを取得できるようになっています。こういった繰り返し処理のことをページネーション処理と言います。
import boto3 import json # Cognito User Pool Configs LIMIT = 60 # 1回のクエリーで取得可能なデータ件数 REGION = 'ap-northeast-1' USER_POOL_ID = ap-northeast-1_xxxxxxxxx' # CognitoユーザプールIDを記載 # Create boto3 CognitoIdentityProvider client client = boto3.client('cognito-idp', REGION) # Get user records def lambda_handler(event, context): try: # 1回目のクエリーを実行する response = client.list_users( UserPoolId=USER_POOL_ID, AttributesToGet=['email'], Limit=LIMIT ) # 1回目のクエリー結果を変数に格納する user_records = response['Users'] # 2回目以降のクエリーは繰り返し処理となる while True: # 前回のクエリーに PaginationToken が無ければ処理終了 if 'PaginationToken' not in response: break # 前回のクエリーに PaginationToken が有れば PagenationToken を付加してクエリーする response = client.list_users( UserPoolId=USER_POOL_ID, AttributesToGet=['email'], Limit=LIMIT, PaginationToken=response['PaginationToken'] ) # 前回のクエリー結果に最新のクエリー結果を追記する user_records.extend(response['Users']) except Exception as e: print(e) else: # Return result return { "isBase64Encoded": False, "statusCode": 200, "body": json.dumps(user_records) }
取得したデータのフォーマットは、boto3 ドキュメントに掲載されている通りです。
AWS Lambda 関数に必要な権限
以下のマネージド IAM ポリシーを付与しています。私が開発した環境では Amazon Cognito への書き込みの権限も必要だったため、AmazonCognitoPowerUser を付与していますが、もう一段落として AmazonCognitoReadOnly にした方がいいと思います。
- arn:aws:iam::aws:policy/AmazonCognitoPowerUser
- arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole
- arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess
参考: アプリ画面での表示
こちらは React アプリ画面での例ですが、取得したデータをこんな感じで表示しています。
ゴミ箱アイコンをクリックするとそのユーザを削除するモーダルウィンドウを呼び出すようにしています。
まとめ
いかがでしたでしょうか?
ページネーション処理は他のデータ取得処理にも応用できますので、本記事の AWS Lambda 関数がみなさまのお役に立てれば幸いです。