1
/
5

【BTMインフラテックブログ①】Amazon Cognito環境での性能試験時、大量ユーザー登録・Token取得に苦労した話

性能試験に使える!Amazon Cognito認証情報取得方法

こんにちは、インフラエンジニアの深町です。
本日から、クラウドインフラ事業部に所属しているエンジニアが
交代制でテックブログを掲載していくこととなりました!
定期的に記事を掲載していきますので、ぜひ目を通して頂けますと嬉しいです!

さて、本日は記念すべき1回目です!
今回は、Amazon Cognitoを利用しスマホアプリユーザー管理を実施しているシステムで
「テスト用に数千人単位のユーザーをどうやって登録したらいいんだ?」
試行錯誤した時の話を書こうと思います。
結論から言うと、AWS CLIを利用し大量ユーザーを作成する&Token取得により、
無事性能試験を実施することができました。
その時の対応内容について以下に記していきます。

Amazon Cognito環境が既にあって、
性能試験などで大量ユーザー登録やToken取得に困っている人は・・・

「1.1 Amazon Cognitoユーザープール設定確認」から
「1.4 Amazon CognitoユーザーのIDToken取得」を参考にしてください。

■Amazon Cognitoとは

AWS上でWeb/モバイルアプリなどのユーザーを登録・管理するために
「Amazon Cognito」が提供されています。
通常、AWSリソース(EC2、RDS、S3等)へアクセス可能な権限を持った
IAMユーザーでログインする必要があります。
ですが、Amazon Cognitoのユーザー管理機能を利用することで「IAMユーザー登録なし」でも
Web/モバイルアプリケーションを経由したユーザーからのAWSリソースが利用可能となります。
今回は、Amazon Cognitoで登録したユーザーからS3バケット一覧を参照するハンズオンをご紹介します

・性能試験での活用方法について (Amazon Cognitoでの大量ユーザー作成・Token取得)
今回記載するのは、JMeter(Webアプリ試験に利用される性能試験ツール)などを利用した試験で
実際に活用している方法です。
スマホアプリ等でユーザーを作成する際、一般的に以下のプロセスが必要となります。
(今回のAmazon Cognito設定も同様の構成としています)

 1.メールアドレスを入力
 2.入力したメールアドレスに「認証コード」的なものが送信されるのでコードを入力
 3.入力したメールアドレスが「正式なユーザー」として利用可能となる

■ハンズオン:Amazon Cognitoを利用したAWSリソースへのアクセスをテストしてみる

今回作成する環境について図で簡単に説明してみますね

前提環境:
・AWS CLI、jqがインストール済であること。
(ご自身のAWSアカウントから取得したAWS環境変数を入力し、AWS CLIが正常動作すること)
・参照先として利用するS3バケットを作成しておく。


0. Amazon Cognito 準備

ユーザー情報の登録先ディレクトリである「ユーザープール」と、
ユーザープールと他AWSリソースへのアクセス許可を設定する「IDプール」を設定します。


0.1 ユーザープール設定

0.1.1 ユーザープール設定
下画面の赤枠部分を設定します。
 • ユーザープール名:任意の名称を指定
 • プールID:自動生成される→IDプール設定で利用するのでID文字列をコピー
 • 任意の属性:email
 • エイリアス属性:なし
 • ユーザー名属性:email
 • パスワードポリシーは適宜設定
 • ユーザーは自己サインアップできますを指定
 • Amazon SESによるEメール配信:いいえ
 • 確認:Eメール
 • アプリクライアントを追加(次の説明に詳細を記します)

0.1.2 アプリクライアント設定
下画面の赤枠部分を設定します。
 • アプリクライアント名:任意の名所を指定
 • アプリクライアントID:自動生成される→IDプール設定で利用するのでID文字列をコピーしておく
 • 認証フローの設定:すべてチェックをつける


0.2 IDプール設定

0.2.1 IDプール設定(フェデレーティッドアイデンティティ設定)
下画面の赤枠部分を設定します。
 • IDプール名:任意の名称を指定
 • 認証されたロール:ロール名を確認しておく(次の手順でこのロール設定を変更します)
 • 認証プロバイダー Cognitoタブ
   - ユーザープールID:先の手順で作成したユーザープールの「プールID」を入力
   - アプリクライアントID:先の手順で作成したユーザープール内の
    「アプリクライアントID」を入力

0.2.2 IAMロール設定
「IDプールの編集」画面で確認したIAMロール「認証されたロール」からAWSリソースへのアクセス許可設定を実施します。
 Amazon Cognito登録ユーザからアクセスしたいAWSリソースのIAMポリシーを追加します。
 ※この画面では「AmazonS3FullAccess」を追加しています。

■Amazon Cognitoへ登録したユーザーからS3バケット参照ができることを検証する

前提条件:AWS CLI・jqコマンドが利用できる環境であること。


1.1 Amazon Cognitoユーザープール設定確認

・「0. Amazon Coginto準備」で作成したAmazon Cognitoユーザープール内の「プールID」を確認し文字列をコピーします。

・同じAmazon Cognitoユーザープール内の「アプリクライアントID」を確認し文字列をコピーします。


1.2 Amazon Cognitoユーザー作成

実行するコマンド内容について説明します。

aws cognito-idp admin-create-user \
 --user-pool-id ap-northeast-1_XXXXXXXX \
  ・作成済の「プール ID」を指定
 --username XXXX@XXXX \
  ・登録するメールアドレスを指定
 --user-attributes Name=email,Value=“XXXX@XXXX” Name=email_verified,Value=true \
  ・E メール必須、および E メールを「ユーザー名」としてサインインに利用しているため設定
 --message-action SUPPRESS
  ・本来の手順ではユーザー登録時に認証メールを送信するが、本手順ではメッセージ送信しない。
   そのため「SUPPRESS(メッセージの送信を抑制)」を指定

実際に実行するコマンドは以下をご参照ください。
(取得した「Username.txt」内容は次手順で利用します)

aws cognito-idp admin-create-user \
 --user-pool-id ap-northeast-1_XXXXXXXX \
 --username XXXX@XXXX \
 --user-attributes Name=email,Value=“XXXX@XXXX” Name=email_verified,Value=true \
 --message-action SUPPRESS \
 | jq -r ".User | .Username" >Username.txt


1.3 Amazon Cognito ユーザーステータス変更&パスワード登録

実行するコマンド内容について説明します。

aws cognito-idp admin-set-user-password \
 --user-pool-id ap-northeast-1_XXXXXXXX \
  ・作成済の「プール ID」を指定
 --username xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  ・ユーザー作成時に生成された「ユーザー名」を指定
 --password xxxxxxxx \
  ・「パスワード」を指定(今回設定では「8 文字以上」かつ「英大文字」「英小文字」「数字」が含まれること)
 --permanent
  ・パスワードを永続的に利用する場合に指定、本設定を実施することで「アカウントのステータス:CONFIRMED」となる

実際に実行するコマンドは以下をご参照ください。

aws cognito-idp admin-set-user-password \
 --user-pool-id ap-northeast-1_XXXXXXXX \
 --username xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
 --password xxxxxxxx \
 --permanent


1.4 Amazon Cognito ユーザーの IDToken 取得

実行するコマンド内容について説明します。

aws cognito-idp admin-initiate-auth \
 --user-pool-id ap-northeast-1_XXXXXXXX \
  ・作成済の「プール ID」を指定
 --client-id XXXXXXXXXXXXXXXXXXXXXXXXXX \
  ・作成済の「アプリクライアント ID」を指定
  ※「アプリクライアント設定」を実施することで Token が発行され、Token を利用した認証が可能となる
 --auth-flow "ADMIN_USER_PASSWORD_AUTH" \
  ・「USERNAME」と「PASSWORD」による認証を受け付け、認証 OK であれば Token を発行します
 --auth-parameters USERNAME=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,PASSWORD=xxxxxxxx
  ・「ユーザー名(自動生成されたもの)」「パスワード(自分で指定したもの)」を指定

実際に実行するコマンドは以下をご参照ください。
(取得した「IdToken.txt」内容は以降の手順で利用します)

aws cognito-idp admin-initiate-auth \
 --user-pool-id ap-northeast-1_XXXXXXXX \
 --client-id XXXXXXXXXXXXXXXXXXXXXXXXXX \
 --auth-flow "ADMIN_USER_PASSWORD_AUTH" \
 --auth-parameters USERNAME=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,PASSWORD=xxxxxxxx
 | jq -r ".AuthenticationResult | .IdToken" >IdToken.txt


1.5 ID プールの ID 設定確認

「フェデレーティッドアイデンティティ」で設定した「ID プールの ID」を確認します。
(取得した「ID プールの ID」は以降の手順で利用します)

1.6 ID プールコマンドを利用した「IdentityID」取得

実行するコマンド内容について説明します。

aws cognito-identity get-id \
 --identity-pool-id ap-northeast-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX \
  ・作成済の「ID プールの ID」を指定
 --logins cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_XXXXXXXXX=xxxxxxxx
  ・「ユーザープール ID」=「IdToken」(前手順で取得したもの)を指定

実際に実行するコマンドは以下をご参照ください。
(取得した「IdentityId.txt」内容は以降の手順で利用します)

aws cognito-identity get-id \
 --identity-pool-id ap-northeast-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX \
 --logins cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_XXXXXXXXX=xxxxxxxx \
 | jq -r ".IdentityId" >IdentityId.txt

1.7 ID プールコマンドを利用した「Credential」取得

以下コマンドを実行します。

aws cognito-identity get-credentials-for-identity \
 --region ap-northeast-1 \
  ・リージョンを指定
 --identity-id ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  ・前手順で取得した「IdentityId」を指定
 --logins cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_XXXXXXXXX=xxxxxxxx
  ・「ユーザープール ID」=「IdToken」(前手順で取得したもの)を指定

コマンド出力結果から「AccessKeyId」「SecretKey」「SessionToken」の値を取得します。
出力例

{
  "IdentityId": "ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "Credentials": {
    "AccessKeyId": “xxxxxxxxxxxxxxxxxxxxx",
    "SecretKey": “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "SessionToken": “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "Expiration": "2022-10-22T16:34:00+09:00"
  }
}

1.8 「Credential」情報を利用した Amazon Cognito ユーザーによる AWS リソースへのアクセス確認

以下コマンド実行し、AWS 環境変数を設定します。
Amazon Cognito ユーザーの認証情報で S3 へアクセスできることを確認します。

・ 「AWS_ACCESS_KEY_ID=」の後ろに取得済の「AccessKeyId」の値を指定
・ 「AWS_SECRET_ACCESS_KEY=」 の後ろに取得済の「SecretKey」の値を指定
・ 「AWS_SECURITY_TOKEN=」の後ろに取得済の 「SessionToken」の値を指定

export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_SECURITY_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

AWS 環境変数設定後、Amazon Cognito ユーザー認証情報を利用し S3 へアクセスできることを確認します。

aws s3 ls
 ※S3のバケット一覧が表示される


1.9 Amazon Cognito ユーザー削除

作成したユーザーをコマンドで削除します。
・「username」にユーザー作成時取得した「ユーザー名」を指定
  ※AWS マネジメントコンソールから 1 ユーザーずつ削除できますが(「ユーザーを無効化」後「ユーザーの削除」を実施)
   以下コマンドを実行し大量ユーザーを一度に削除することが可能です。

aws cognito-idp admin-delete-user \
 --user-pool-id ap-northeast-1_XXXXXXXXX \
 --username xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

いかがでしたでしょうか?
今回の手順であれば、テストユーザー大量(数万ユーザー等)であったとしても、
ユーザー登録・Token 取得が可能となります。
Amazon Cognito 環境での性能試験時に行き詰った場合は、是非参考にしてみて下さい。

次回別の記事でお会いしましょう!
それでは!

株式会社BTM's job postings
4 Likes
4 Likes

Weekly ranking

Show other rankings