LoginSignup
10
1

More than 1 year has passed since last update.

Amazon cognito カスタム属性を利用したユーザー登録 ~CSVファイルから登録~

Last updated at Posted at 2021-12-21

今回の記事では
「Amazon cognitoでユーザープールのカスタム属性を利用した場合のユーザー登録」
に焦点を当てながらまとめていききます。

まず、Amazon Cognitoとは、AWSのサイトには以下のような説明があります。

ウェブアプリケーションおよびモバイルアプリに素早く簡単にユーザーのサインアップ/サインインおよびアクセスコントロールの機能を追加できます。出典:https://aws.amazon.com/jp/cognito/

要するに、サインインなどのログイン機能を提供してくれるサービスととらえておけばOKです。Amazon Cognitoでは「ユーザープール」と「IDプール」の2つのプールがあります。前者はユーザー登録に使用でき、後者はIDフェデレーションに利用できます。

今回は「ユーザープール」(ユーザー登録)を取り上げます。

やりたいこと

やりたいことはAmazon Cognitoを利用したユーザー登録です。
さらに、以下の要件が加わります。
・CSV形式ファイルを取り込んでユーザーを作成すること
 (CSV形式ファイルにはユーザ情報が記載されている)
・ユーザー情報として以下の属性を持っていること

①メールアドレス
②名前
③電話番号
④ふりがな
⑤ユーザータイプ(一般ユーザー、運営ユーザーなど)

Amazon Cognitoでは、デフォルトで用意されている「標準属性」と自由に設定できる「カスタム属性が」あり、ユーザーの属性として扱うことができます。上記属性のうち、「①メールアドレス」「②名前」「③電話番号」は標準属性に含まれています。ので、用意されているもの(標準属性)を使用できます。しかし、「④ふりがな」「⑤ユーザータイプ」は標準属性に含まれていません。

ちなみに、標準属性はこちらを参照してください。

ので、「④ふりがな」「⑤ユーザータイプ」はカスタム属性として作成することが必要です。が、このカスタム属性が曲者でした。
Amazon Cognitoのコンソール画面にCSV形式ファイルを取り込める機能があります。しかし、標準属性のみであれば、コンソール画面からcsvファイルを取り込めるようですが、カスタム属性を取り込むことができないようでした。
ので、取り込み用のバッチを作成することにしました。

では、①ユーザープールの作成、②バッチの作成の2つの流れで、カスタム属性を含むユーザー属性をcsvファイルでAmazon Cognitoにユーザー登録する方法を見ていきましょう。

なお、以下スクショは2021年12月16日に作成しました。
画面デザインや設定項目が変わる可能性がありますので、ご留意ください。

①ユーザープールの作成

1.Amazon Cognitoの画面で「ユーザープールの管理」を押下します。
image.png

2.「ユーザープールを作成する」を押下します。
cognito2.PNG

3.プール名を入力します。ここでは「sample」と入力しました。さらに、「ステップに従って設定する」を押下します。
cognito3.PNG

4.各設定を行います。(スクショの都合で1ページをスクショ3枚に分けました)

「Eメールアドレスおよび電話番号」を選択し、「Eメールアドレスを許可」を選択します。
こうすると、サインインする際に「Eメールアドレス」が「ユーザーID」となります。
cognito4.PNG

標準属性を選択します。「①メールアドレス ②名前 ③電話番号」が要件なので、「email」「name」「phone number」を選択します。
cognito5.PNG

カスタム属性を選択します。今回は「④ふりがな ⑤ユーザータイプ」です。
「別の属性の追加」を押下し、タイプを「string」とし、名前を「name_hurikana」と入力し、最小長を「1」最大長を「256」とします。変更可能にチェックを入れておきましょう。
次に、タイプを「number」とし、名前を「user_type」と入力し、最小値を「0」最大値を「10」とします。変更可能にチェックを入れておきましょう。
入力、選択ができたら、「次のステップ」を押下します。
cognito6.PNG

5.各設定を行います。
今回は↓スクショのように設定しました。入力、選択ができたら、「次のステップ」を押下します。
cognito7.PNG

6.各設定を行います。(スクショの都合で1ページをスクショ2枚に分けました)
今回は↓スクショのように設定しました。入力、選択ができたら、「次のステップ」を押下します。
cognito8.PNG

cognito9.PNG
画像にある「新規ロール名」はデフォルトのものです。

7.Eメールアドレスをカスタマイズします。入力ができたら、「次のステップ」を押下します。(スクショの都合で1ページをスクショ3枚に分けました)

↓今回はスルーしました。
cognito10.PNG

↓今回はSESと連携していないので、「Amazon SES設定を通じてEメールを送信しますか」の項目では、「いいえ」を選んでいます。cognitoの機能で送れるメール数には上限があるようです。SES設定を行うことでメールの配信数を増やすことができます。SESと連携させる場合は、ここで「はい」を選択します。

また、「Eメール検証メッセージをカスタマイズしますか?」
を入力すると、ユーザーに「検証コード」を送信するメールの件名と本文を任意の文面にすることができます。

cognito11.PNG
↓「ユーザー招待メッセージをカスタマイズしますか?」
を入力すると、ユーザーを登録した際に送信されるメールの件名と本文を任意の文面にすることができます。
cognito12.PNG

8.ここ↓はスルーしました!「次のステップ」を押下します。
cognito13.PNG

9.「いいえ」を選択します。選択ができたら、「次のステップ」を押下します。
cognito14.PNG

10.ここ↓はスルーしました!「次のステップ」を押下します。
cognito15.PNG

11.ここ↓はスルーしました!「次のステップ」を押下します。
cognito16.PNG

12.確認ページです。「プールを作成」を押下します。
これでユーザープールの作成はできました。
cognito17.PNG

②バッチの作成

ユーザープールができましたので、カスタム属性を含むユーザー属性をAmazon Cognitoに取り込んでいきましょう!CSV形式ファイルはs3にアップします。ので、バッチはs3からCSV形式ファイルを持ってきて取り込む必要があります。
おおまかな処理の流れは以下の通りです。

①s3からCSV形式ファイルを移動
②CSV形式ファイルからデータの抽出
③ユーザー登録
④パスワード設定

また、以下のような内容のCSVファイルをAmazon cognitoに取り込む想定です。画像はCSVファイルをExcelで開いたもので、2件のユーザー情報が記載されています。(文字化けにも注意しましょう)
このCSVファイルをS3の任意の場所にアップロードしましょう。

cognito19.PNG

そして、バッチの内容はこちらです!shellscriptで作成しております。

userCreate.sh
#!/bin/sh

#ファイル名取得
file_name=`aws s3 ls (s3の格納場所のパス)/ | sort -nr | head -n 1 | awk '{print $NF}'`

#S3からCSV形式ファイルを移動(コピー)
aws s3 cp (s3の格納場所のパス)/${file_name} (実行サーバー上パス)/${file_name}

#カウンター
COUNTER=0

#大文字小文字数字記号を含む15桁のランダム文字列を生成
pass=`cat /dev/urandom | base64 | fold -w 15 | head -n 1`$((RANDOM%+10))

#特定のデータの抽出
while read row; do
    if [ ${COUNTER} != 0 ]; then
        name=`echo $row | cut -d , -f 1`
        email=`echo $row | cut -d , -f 2`
        phone_number=`echo $row | cut -d , -f 3`
        name_hurikana=`echo $row | cut -d , -f 4`
        user_type=`echo $row | cut -d , -f 5`

        #1行分の情報を取る
        row_info=`echo $row`

        #電話番号の頭に+がない場合追加
        if ["`echo $phone_number | grep '+'`" = ""];then
            phone_number=+81$phone_number
        fi

        #csvから取得したデータでユーザ登録
        aws cognito-idp admin-create-user \
        --user-pool-id (ユーザープールID) \
        --username $email \
        --user-attributes Name=email,Value=$email \
        Name=name,Value=$name \
        Name=email_verified,Value=TRUE \
        Name=phone_number,Value=$phone_number \
        Name=phone_number_verified,Value=TRUE \
        Name=custom:name_hurikana,Value=$name_hurikana \
        Name=custom:user_type,Value=$user_type \
        --desired-delivery-mediums EMAIL

        #パスワード設定
        aws cognito-idp admin-set-user-password \
        --user-pool-id (ユーザープールID) \
        --username $email --password $pass --permanent
    fi

    COUNTER=` expr $COUNTER + 1`

done < (実行サーバー上パス)/$file_name

ポイントなのは、パスワード設定もバッチの中で行ってしまうことです。
「aws cognito-idp admin-create-user ~」コマンドを叩くと、ステータス(cognitoのコンソール画面で確認できます)が「FORCE_CHANGE_PASSWORD」となります。この状態ではユーザーがパスワードリセットすることができません。なので、パスワード設定のコマンドも叩く必要があります。(aws cognito-idp admin-set-user-password~のコマンドです。)このコマンドを叩くと、ステータスが「CONFIRMED」に変わります。そうして、画面からパスワードリセットをリクエストすると、検証コードが送信されます。

もう一つポイントがあります。電話番号の登録です。今回は電話番号をユーザー属性として設定しています。cognitoで設定する際には国際電話の形(日本であれば、+81で始まる電話番号)で設定することが必要です。よって、csvファイル内の電話番号に「(日本であれば、)+81」を付ける必要があります。ついていない場合は電話番号を正常に登録できません。CSVファイルでは、国際電話の形で記入していないので、↓の部分で、バッチの中で電話番号の形を整えています。

        #電話番号の頭に+がない場合追加
        if ["`echo $phone_number | grep '+'`" = ""];then
            phone_number=+81$phone_number
        fi

最後に、今回のバッチを用いて、ユーザー登録した場合の初回ログインまでの流れを確認しましょう。以下のような流れです。

スライド1.JPG

スライド2.JPG

↓は画面イメージです。
スライド3.JPG


カスタム属性をCSVファイルを用いて登録しようとしたところ、うまく登録ができず試行錯誤することになりました。カスタム属性を扱った記事が少なかったこともあるので、もしもこの記事が誰かの役に立ったら嬉しいです。

最後まで読んでいただいた方、ありがとうございました。

参考文献

Amazon web service『AWS CLI command reference』(2021年12月22日利用)
https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/index.html#cli-aws-cognito-idp

AWS『ディベロッパーガイド ユーザープールの属性の設定』(2021年12月22日利用)
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-settings-attributes.html#user-pool-settings-custom-attributes

10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1