- 福岡フルスタックエンジニア
- 地方創生コンサルティング
- 未経験IT営業マン志望大歓迎!
- Other occupations (32)
-
Development
- 福岡フルスタックエンジニア
- 札幌/未経験/リモート可
- 未経験Webエンジニア
- 福岡受託エンジニア
- 受託開発エンジニア
- 独学未経験歓迎/エンジニア
- スキルチェンジエンジニア
- 東京フルスタックエンジニア
- PHPエンジニア
- 仙台フルスタックエンジニア
- 名古屋フルスタックエンジニア
- 京都フルスタックエンジニア
- 札幌フルスタックエンジニア
- 関西フルスタックエンジニア
- 湘南フルスタックエンジニア
- 未経験/湘南勤務/リモート可
- 未経験/福岡/リモート可
- バックエンド/サーバーサイド
- 福岡/九州/転勤なし
- Web Engineer
- 全国47都道府県募集!
- 目指せフルスタックエンジニア!
- Webエンジニア
- 関西勤務/リモート勤務可!
- 東海勤務/リモート勤務可!
- 九州勤務/リモート勤務可!
- 未経験歓迎クラウドエンジニア
- AWSクラウドエンジニア
- 未経験・経験者歓迎エンジニア
- フルリモートWebエンジニア
- フルリモート/フレックス
- フルリモート/地元で働ける
- Business
- Other
性能試験に使える!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 環境での性能試験時に行き詰った場合は、是非参考にしてみて下さい。
次回別の記事でお会いしましょう!
それでは!