Amazon Cognito ユーザのリストを AWS Lambda で取得する

こんにちは、広野です。

アプリ管理者にアプリのユーザを管理させたいとき、アプリ画面にユーザのリストを表示して、そこから個々のユーザ情報の編集画面に繋げていく、というのが一般的なつくりだと思います。

ここではそのようなケースを想定して、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 ドキュメントに掲載されている通りです。

CognitoIdentityProvider — Boto3 Docs 1.21.44 documentation

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 関数がみなさまのお役に立てれば幸いです。

著者について
広野 祐司

AWSサーバーレスアーキテクチャを駆使して社内クラウド人材育成アプリや教育コンテンツをつくっています。
ReactでSPAを書き始めたら快適すぎて、他の開発言語には戻れなくなりました。React仲間を増やしたいです。
取得資格:AWS認定は7つ、ITサービスマネージャ、ITIL v3 Expert、等
2019, 2020 AWS APN Top engineers 受賞
好きなAWSサービス:AWS Amplify / Amazon Cognito / AWS Step Functions / AWS CloudFormation

広野 祐司をフォローする
クラウドに強いによるエンジニアブログです。
SCSKは専門性と豊富な実績を活かしたクラウドサービス USiZE(ユーサイズ)を提供しています。
USiZEサービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。
AWSサーバレスアーキテクチャ
TechHarmony
タイトルとURLをコピーしました