性能試験に使える!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タブ
o ユーザープールID:先の手順で作成したユーザープールの「プールID」を入力
o アプリクライアントID:先の手順で作成したユーザープール内の「アプリクライアントID」を入力

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

1. 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 環境での性能試験時に行き詰った場合は、是非参考にしてみて下さい。
次回別の記事でお会いしましょう!
それでは!
-
SNS
-
投稿日
-
カテゴリー
BTM Useful