前提

・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を作成すると、効率よくなると思います。

以上です。
お役に立てれば幸いです。

参考

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cognito-idp.html#CognitoIdentityProvider.Client.list_users

Last modified: 2022-06-11

Author