やりたいこと
- スクリプトから既存のCognitoのユーザープールに特定のユーザーを追加したい。
- 登録したいユーザーがすでに追加済みであるかの判定を入れる。
- 追加した際にメッセージテンプレートの招待メッセージを用いて、メールを送付する。
招待メッセージはコンソールからHTMLでカスタムしたものを利用します。
SESでドメイン検証済み&サンドボックス離脱済みであれば、送信元を好きなアドレスに設定できます。
コード
- pythonとaws SDK(boto3) がインストール済み
- awsのプロファイルは必要権限が設定済み
import boto3
from botocore.exceptions import ClientError
# Cognitoクライアントの初期化
cognito_client = boto3.client('cognito-idp')
# ユーザープールのIDを指定
user_pool_id = '{利用するユーザープールID}'
# メールアドレスとユーザー名を指定
email = '{対象ユーザーのメアド}'
username = email
# ユーザーがすでに存在するかどうかを確認
try:
response = cognito_client.admin_get_user(
UserPoolId=user_pool_id,
Username=username
)
user_exists = True
print('該当ユーザーは存在します。')
except ClientError as e:
if e.response['Error']['Code'] == 'UserNotFoundException':
user_exists = False
print('該当ユーザーが存在しないため、ユーザーを作成します。')
else:
print(f"予期しないエラーが発生しました: {e}")
raise
# ユーザーが存在しない場合にのみ作成
if not user_exists:
try:
response = cognito_client.admin_create_user(
UserPoolId=user_pool_id,
Username=username,
UserAttributes=[
{
'Name': 'email',
'Value': email
},
{
'Name': 'email_verified',
'Value': 'true'
}
],
DesiredDeliveryMediums=['EMAIL'],
ForceAliasCreation=False
)
print('ユーザーが正常に作成されました。')
except ClientError as e:
if e.response['Error']['Code'] == 'UsernameExistsException':
print("ユーザーは既に存在します。新しいユーザーを作成する必要はありません。")
else:
print(f"作成時にエラーが発生しました: {e}")
raise
簡単な解説
cognito_client.admin_get_user()
ユーザーが存在するかの判定と、ユーザー作成を実行するメソッド
UserAttributes ~~
{'Name': 'email_verified',
'Value': 'true' }
メールアドレスを事前に検証済み扱いにしないとメールが送付されないので、'true' にしています。
ForceAliasCreation=False
これをTrueにすると、既存のエイリアス(例:メールアドレス)を持つユーザーがいても新規ユーザーを強制的に作成
最後に
cognitoに関して日本語のドキュメントがあまり豊富ではないの少しスクリプトを組むのに苦慮しましたが、上記コードだけでやりたいことができてHappyです。
以降で、複数ユーザーの場合のコードを書く機会があったら、それも記事にしたいと思います。
以上、どなたかのお役に立てば幸いです。