IT

【aws】CognitoにCSVで一括ユーザー登録して招待メールを送付したい。

以下の複数ユーザー登録版です。

やること

  • 用意したメールアドレスリスト(CSV)に対して、Cognitoユーザー登録&招待メールを送付する。
  • すでに登録されているものに関しては送付しないように判定処理を実施する。

リソースは東京リージョン(ap-northeast-1)に存在するものとします。

利用するもの

  • python3.12
  • boto3(awsSDK)
  • Pandas

コード

メインのコード:invitation.py

import boto3
import pandas as pd
import json
from botocore.exceptions import ClientError

# JSONファイルから設定を読み込む
with open('config.json', 'r') as config_file:
    config = json.load(config_file)

# Cognitoクライアントの初期化
cognito_client = boto3.client('cognito-idp', region_name=config['Region'])

# ユーザープールのIDを設定ファイルから取得
user_pool_id = config['UserPoolId']

# CSVファイルの読み込み
users_df = pd.read_csv('maillist.csv', header=None, names=['email'])

# ユーザー登録関数
def register_user(email):
# ユーザー名をメールアドレスと同じにする、余分なスペースを削除
    username = email.strip() 
    try:
        # ユーザーがすでに存在するかどうかを確認
        cognito_client.admin_get_user(
            UserPoolId=user_pool_id,
            Username=username
        )
        print(f'User {email} already exists.')
    except ClientError as e:
        if e.response['Error']['Code'] == 'UserNotFoundException':
            # ユーザーが存在しない場合、作成する
            try:
                cognito_client.admin_create_user(
                    UserPoolId=user_pool_id,
                    Username=username,
                    UserAttributes=[
                        {'Name': 'email', 'Value': email},
                        {'Name': 'email_verified', 'Value': 'true'}
                    ],
                    DesiredDeliveryMediums=['EMAIL']
                )
                print(f'User {email} created successfully.')
            except ClientError as e:
                print(f"Failed to create user {email}: {e}")
        else:
            print(f"Error checking user {email}: {e}")

# 各ユーザーに対して登録処理を実行
for email in users_df['email']:
    register_user(email)
  • config.json
{
    "UserPoolId": "ap-northeast-1_{固有のID}",
    "Region": "ap-northeast-1"
}
  • CSVファイル:maillist.csv
email
hogehoge01@sample.jp
hogehoge02@sample.jp

簡単な解説

  • ユーザープールやリストは都度内容が変わるので、別ファイルにしています。
  • pandasを使用してCSVファイルを読み込み、email列を作成して処理しやすい形式にしています。
  • register_userの関数で、メアドをユーザー名として扱い登録処理を実行し、存在しなければEmailを配信します。
  • CSVの2行目から順番に上記の処理を実施され、結果はコンソールに出力されます。

結果をリストで欲しい場合には、コマンドライン(python invitation.py > result.txt)で対応する想定です。

最後に

「Pandasは多機能すぎて重いからやめとけ。」等はよく言われますが、一番Eazyに使えるのでつい多用してしまいますね。

以上、どなたかのお役に立てば幸いです。

  • この記事を書いた人

緑川縁

ニートからシステムエンジニアになった人
クラウド案件をメインにやっています。
保持資格:CCNA,AWS SAA&SAP,秘書検定2級
趣味でボカロ曲作り始めました。

-IT
-,