なぜテストプランに認証を追加するのか?
前回の記事では、SampleWorldCitiesのようなArcGIS Enterpriseマップサービスに負荷をかけるためのApache JMeterテストプランの構築手順を紹介しました。これらはサービスを動的にテストするためのテストプラン構築の入門として非常に有用でしたが、すべてリモートエンドポイントが匿名/公開アクセス可能であることを前提としていました。これは多くの場合そうではありません。多くの展開環境では何らかの認証が設定されています。この記事一つであらゆるArcGIS Enterprise認証シナリオを網羅することはできませんが、一般的なものについて説明します:
- 組み込みポータルメンバーまたはドメインメンバーからトークンを必要とするセキュアなサービス向けテストプランの構成
注意:このテストプランはポータルからのユーザー認証が必要なサービスに対して使用されますが、Single Sign On(統合Windows認証)を利用してテストソフトウェアを実行しているメンバーとして自動ログインする技術的に異なるシナリオはカバーしていません。
はじめに
簡単にするため、本記事ではコマンドラインモードでApache JMeterロードテストを実行する(初心者/中級者向け)で使用したテストプランsampleworldcities3.zipから直接構築します。

このテストプランは、SampleWorldCitiesという公開アクセス可能なArcGIS Enterpriseサービスに対し、4つの異なるマップスケールで動的に負荷をかけました。それぞれが独自のTransaction Controller内に配置されたHTTPリクエストです。テストの多くのコンポーネント(例:Project Folder、Web Server Name、Service Name)は変数化されており、共有や移植性が容易になっています。
sampleworldcities4 テストプランの作成
簡単に言うと、sampleworldcities4はsampleworldcities3のテストプランを直接ベースにしています。
- sampleworldcities3.zip テストプランをダウンロード
- sampleworldcities3.zip を解凍する
- ファイルシステム上でsampleworldcities3フォルダをコピーし、sampleworldcities4と名前変更
- sampleworldcities4フォルダを開き、sampleworldcities3.jmxファイル名をsampleworldcities4.jmxに変更
- この手順はテストプランがC:\JMeter Tests\に保存されていることを前提としています
- JMeter内で新しい sampleworldcities4.jmx テストプランを開く
認証サポート追加によるテストプラン拡張
認証は以下3つの部分を追加して行います:追加のUser Defined Variables、トークン取得用認証リクエスト、およびマップリクエストヘッダー内のトークンサポート。
User Defined Variables
追加のUser Defined Variablesを設定します:
- Test Plan(例:sampleworldcities4)をクリック
- 新規Test Planを開いた際にはデフォルトで選択されています
- User Defined Variablesセクション下部で「Add」をクリック
- Name に「Username」と入力
- Value に username と入力
- SampleWorldCitiesマップサービス利用権限があるポータルメンバーのユーザー名を入力
- ドメインメンバーの場合は domain\username と入力
- Name に「Password」と入力
- Name に「TokenExpirationMinutes」と入力
- Value に「240」と入力
- 4時間有効なトークンが生成されます
- 必要に応じて調整可能ですが、通常テスト時間はこれを超えません
注意:テストプラン保存後、Apache JMeterはJMXファイル内にユーザー名とパスワードをプレーンテキストで保存します。
ProjectFolder User Defined Variable の値を変更します:
- 値内容を C:\JMeter Tests\sampleworldcities3 から
- C:\JMeter Tests\sampleworldcities4 に変更
- テストプランが別場所にある場合は適宜調整してください
WebServerName、PortalInstanceName、および ServerInstanceName User Defined Variables の値も必要に応じて変更してください。

トークン取得用認証リクエスト
ArcGIS Enterpriseサイトへブラウザから組み込みまたはドメインメンバー資格情報でJavaScriptアプリケーション経由で認証するとき、クライアントとサーバー間で複数の項目がやり取りされます。これらは複数のHTTPリクエスト・レスポンスに現れます。この通信には多くのリクエストがありますが、その大半はブラウザ内表示用静的コンテンツ取得です。コアとなる認証部分(RESTエンドポイントへのログイン時にキャプチャ)は以下3つのリクエストです:
- OAuthState
- AccessToken
- Token
テストプランではこれら3つのHTTPリクエストを一つのTransaction Controller内にまとめて認証ロジックとします。さらに各リクエストにはRegular Expression Extractorを使いサーバー応答から特定情報を抽出します。最後にこれらすべてはOnce Only Controllerという論理コンテナにまとめられます。名前通り、このコントローラー内グループは各テストスレッド生涯中一度だけ実行されます。
注意:Once Only Controller は本ケースで各スレッド毎イテレーションごとに認証・新トークン発行しないため(オーバーヘッド過大になるため)使用しています。ただし実行中再認証しないので、テスト時間はトークン有効期限(上記4時間)未満である必要があります。

この方法は一例であり、トークン生成負荷増加シミュレーションなど異なるバリエーションもあります。例えばCSVファイルからユーザー名・パスワードを読み込み異なる資格情報利用シミュレーションも可能です。
本テストプランの軽量設計にも関わらずステップ増加や負荷増加幅が大きいと、新規スレッド毎にトークン要求が発生し相応の負荷となります。この場合、小さく開始し徐々にステップ負荷増加させシステム・ワークフロー適合値探索がお勧めです。
本例認証ロジックには変数がありますがカスタマイズ要素は少ないため、各HTTPリクエスト・Regular Expression Extractor構築手順はスクリーンショット中心で示します。完全なテストプランは記事末尾よりダウンロード可能です。
OAuthState HTTP Request
サーバーからOAuthStateレスポンス(implicit grant)生成担当。

OAuthState Regular Expression Extractor
state を oauthState という変数へ抽出するため使用。
src="https:\/\/us.v-cdn.net\/6038851\/uploads\/images\/15861i91333328DCBFE08E\/oauthstate_regularexpressionextractor.png" role="button" title="oauthstate_regularexpressionextractor.png" alt="oauthstate_regularexpressionextractor.png" \/><\/span><\/SPAN><\/P>
AccessToken HTTPリクエスト<\/SPAN><\/H3>資格情報とoauth_state変数を渡す役割を担います。有効な場合、これらはサーバーからAccessTokenレスポンスを生成します<\/SPAN><\/P>
<\/span><\/SPAN><\/P>AccessToken <\/SPAN>正規表現抽出器<\/SPAN><\/H3>accessTokenという変数にアイテムをキャプチャするために使用されます<\/SPAN><\/P>
<\/span><\/SPAN><\/P>Token HTTPリクエスト<\/SPAN><\/H3>サーバーからトークンを生成する役割を担います。<\/SPAN><\/P>
<\/span><\/SPAN><\/P>Token <\/SPAN>正規表現抽出器<\/SPAN><\/H3>tokenという変数にアイテムをキャプチャするために使用されます<\/SPAN><\/P>この変数はHTTPヘッダーとして渡され、各リクエストの認証に使用されます。<\/SPAN><\/P>
<\/span><\/SPAN><\/P>Token <\/SPAN>レスポンスアサーション<\/SPAN><\/H3>トークン生成リクエストに追加され、レスポンス内の特定の文字列をチェックします。文字列「expires」が見つからない場合、トークンは生成されず、トランザクション全体が失敗(リクエスト失敗)としてマークされます。<\/SPAN><\/P>
<\/span><\/SPAN><\/P>Map Request HeadersにおけるTokenサポート<\/SPAN><\/H2>Authenticationロジックから取得したtoken変数を使い、各セキュアなmapリクエストのHTTPヘッダーにCookieという名前で値:agstoken=${token}を含めることができます。<\/SPAN><\/P>
注意:このテストプラン例ではHTTP Cookie Managerは使用されていません<\strong>
技術的には、トークンはキー/バリューペアとしてリクエストに渡すことも可能ですが、セキュリティ向上のためHTTPヘッダーとして渡されています。<\font>
テストプランの検証
View Results Treeが有効になっていることを確認し、テストを開始します(例:緑の矢印)。レスポンスの検証が行われます。
Authenticationのすべての部分で緑のチェックマークが表示されている場合、提供された資格情報から有効なトークンが取得されたことを示します。
export map呼び出しの画像は、セキュアサービスへのリクエストが正常に発行されたことを示しています。

この記事で使用されたApache JMeter Test Planのダウンロードはこちら:
sampleworldcities4.zip
Apache JMeter
は
Apache
License 2.0.
Apache、Apache JMeter、JMeter、Apacheフェザー、およびApache JMeterロゴはApache Software Foundationの商標です。