👤

AWS LambdaのPythonランタイムからCognitoユーザープールのユーザーをemailで取得する

2022/03/12に公開

AWS LambdaのPython3.9ランタイムからCognitoのユーザープールのユーザーをemailで検索して取得する。事前にCognitoのユーザープールコンソールにて「プールID(UserPoolId)」と「プール ARN」を確認してメモしておく。

Python

Lambda側のコードは以下の通り。boto3のcognito-idpクライアントにあるlist_usersメソッドのFilterに条件を設定して取得する。

import boto3

cognito_client = boto3.client('cognito-idp')

def lambda_handler(event, context):
    def user_from_cognito(email):
        users = cognito_client.list_users(
            UserPoolId=[プールID],
            Filter=f'email = \"{email}\"',
        ).get('Users')
        if users && len(users) > 0:
            return users[0]
        return None

    user = user_from_cognito(event['email'])    

Lambdaの実行ロールにポリシーを設定

Lambdaの実行ロールに下記のようなListUsersを許可するポリシーを付与する。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "cognito-idp:ListUsers",
            "Resource": "[プールARN]"
        }
    ]
}

ポリシーが設定されていない場合、以下のようなエラーが生じる。

{
 "errorMessage": "An error occurred (AccessDeniedException) when calling the ListUsers operation: User: arn:aws:sts::[]:assumed-role/[]/[] is not authorized to perform: cognito-idp:ListUsers on resource: arn:aws:cognito-idp:ap-northeast-1:[]:userpool/ap-northeast-1_[] because no identity-based policy allows the cognito-idp:ListUsers action",
 "errorType": "ClientError",
  ...
}

得られるユーザー情報

およそ次のような形式でユーザー情報が得られる

{
'Username': 'xxxxxxxxxxxx',
'Attributes': [
	{'Name': 'sub', 'Value': ''}, 
	{'Name': 'email_verified', 'Value': 'true'},
	{'Name': 'email', 'Value': 'example@example.com'}
	],
	'UserCreateDate': datetime.datetime(2000, 1, 1, 1, 1, 1, 1, tzinfo=tzlocal()),
	'UserLastModifiedDate': datetime.datetime(2000, 1, 1, 1, 1, 1, 1, tzinfo=tzlocal()),
	'Enabled': True,
	'UserStatus': 'CONFIRMED'
}"

Discussion