👤
AWS LambdaのPythonランタイムからCognitoユーザープールのユーザーをemailで取得する
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