こんにちは、広野です。
アプリ管理者にアプリのユーザを管理させたいとき、アプリ画面にユーザのリストを表示して、そこから個々のユーザ情報の編集画面に繋げていく、というのが一般的なつくりだと思います。
ここではそのようなケースを想定して、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 関数がみなさまのお役に立てれば幸いです。
