この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
前提
・Cognitoのユーザーが作成済みであること
・スクリプトの実行環境をAWS CloudShellとします。
Cognitoのユーザーの作成について、下記のブログを参考
CloudFormation でCognitoユーザプールとCognitoユーザを2個のテンプレートで作成してみました。
背景
Lamdba(Python)でCognitoのユーザーチェックが必要となっていますが、Lamdbaで実装しながらの動作確認は手間がかかるので、Cognitoのユーザーチェックを切り出して、Python3で動作確認してから、Lamdbaに移行しようと思います。
Cognitoユーザの存在チェックスクリプト
SearchCognitoUser_ByUsername.py
# -*- coding: utf-8 -*-
import boto3
import sys
if(len(sys.argv) <= 1):
print('Please enter arguments!')
print('Example:filename.py "user_pool_id" "user_name"')
sys.exit()
if(len(sys.argv) <= 2):
print('Please enter the second argument!')
print('Example:filename.py "user_pool_id" "user_name"')
sys.exit()
# ここに到達できていれば sys.argv[1]、sys.argv[2] は必ず存在するので、安全にアクセスできます。
first_argv = str(sys.argv[1])
print('input first argument is', first_argv)
second_argv = str(sys.argv[2])
print('input second argument is', second_argv)
def is_cognito_user_existed(user_pool_id, user_name):
"""Cognitoユーザの存在チェック"""
try:
print('Cognitoユーザ:[' + user_name +']の存在チェックを行います。')
rt = None
filter_str = 'username = ' + '"' + user_name + '"'
print(f'filter_str: {filter_str}')
# ユーザ検索
cognito_idp = boto3.client('cognito-idp')
response = cognito_idp.list_users(
UserPoolId=user_pool_id,
Filter=filter_str
)
if isinstance(response,dict):
user_list = list(response.values())[0]
print('user_list:')
print(user_list)
# 存在しない場合
if len(user_list) == 0:
print('users list is blank')
print(user_name +' is not existed.')
rt=False
# 存在する場合
else:
print(user_name +' is existed.')
rt=True
# except Exception:
except Exception as e:
print ('[Cognito_CheckUser] check cognito user exception error.')
print("error: " + str(e))
rt=None
print('Cognitoユーザ:[' + user_name +']の存在チェックを完了しました。')
return rt
# 呼び出しのテスト
rt_check_cognito_user = is_cognito_user_existed(first_argv, second_argv)
if rt_check_cognito_user == True:
print('The user is existed.')
else:
print('The user is not existed.')
動作確認
1.Pythonのバージョン確認
Python3のバージョン確認コマンド:
python3 –version或いはpython3 -V
実行例:
[cloudshell-user@ip-10-0-116-255 ~]$ python3 --version
Python 3.7.10
[cloudshell-user@ip-10-0-116-255 ~]$ python3 -V
Python 3.7.10
[cloudshell-user@ip-10-0-116-255 ~]$
2.PythonのスクリプトをCloudShellにアップロードする
AWS CloudShell画面右上の「Actions」⇒「Uplodad file」より.Pythonのスクリプト(SearchCognitoUser_ByUsername.py)をアップロードする
3.Pythonのスクリプトを実行してみる
コマンド:
python3 file名 第一引数 第二引数
SearchCognitoUser_ByUsername.py "プール ID" "Cognitoユーザ名"
実行例:
python3 SearchCognitoUser_ByUsername.py "ap-northeast-1_lhrEvkpGb" "test61"
※
下記のユーザを作成済み
test1~test61
存在する場合の例:
[cloudshell-user@ip-10-0-116-255 ~]$ python3 SearchCognitoUser_ByUsername.py "ap-northeast-1_lhrEvkpGb" "test61"
input first argument is ap-northeast-1_lhrEvkpGb
input second argument is test61
Cognitoユーザ:[test61]の存在チェックを行います。
filter_str: username = "test61"
user_list:
[{'Username': 'test61', 'Attributes': [{'Name': 'sub', 'Value': '2cce90a5-747e-4354-b805-7fd4a235ea37'}], 'UserCreateDate': datetime.datetime(2022, 6, 11, 8, 14, 29, 983000, tzinfo=tzlocal()), 'UserLastModifiedDate': datetime.datetime(2022, 6, 11, 8, 14, 29, 983000, tzinfo=tzlocal()), 'Enabled': True, 'UserStatus': 'FORCE_CHANGE_PASSWORD'}]
test61 is existed.
Cognitoユーザ:[test61]の存在チェックを完了しました。
The user is existed.
[cloudshell-user@ip-10-0-116-255 ~]$
[cloudshell-user@ip-10-0-145-109 ~]$ python3 SearchCognitoUser_ByUsername.py "ap-northeast-1_lhrEvkpGb" "test1"
input first argument is ap-northeast-1_lhrEvkpGb
input second argument is test1
Cognitoユーザ:[test1]の存在チェックを行います。
filter_str: username = "test1"
user_list:
[{'Username': 'test1', 'Attributes': [{'Name': 'sub', 'Value': 'b3a8852d-6306-4a77-a161-d82303d1dfda'}], 'UserCreateDate': datetime.datetime(2022, 6, 11, 8, 10, 28, 557000, tzinfo=tzlocal()), 'UserLastModifiedDate': datetime.datetime(2022, 6, 11, 8, 10, 28, 557000, tzinfo=tzlocal()), 'Enabled': True, 'UserStatus': 'FORCE_CHANGE_PASSWORD'}]
test1 is existed.
Cognitoユーザ:[test1]の存在チェックを完了しました。
The user is existed.
[cloudshell-user@ip-10-0-145-109 ~]$
存在しない場合の例:
[cloudshell-user@ip-10-0-116-255 ~]$ python3 SearchCognitoUser_ByUsername.py "ap-northeast-1_lhrEvkpGb" "test62"
input first argument is ap-northeast-1_lhrEvkpGb
input second argument is test62
Cognitoユーザ:[test62]の存在チェックを行います。
filter_str: username = "test62"
user_list:
[]
users list is blank
test62 is not existed.
Cognitoユーザ:[test62]の存在チェックを完了しました。
The user is not existed.
[cloudshell-user@ip-10-0-116-255 ~]$
まとめ
今まで、lambdaの作成するときに、AWSコンソール上実装しながら、動作確認をしていましたが、今回、部分的にをAWS CloudShellで動作確認してからlambdaを作成すると、効率よくなると思います。
以上です。
お役に立てれば幸いです。