Azure

Azure Load Testing でシークレットを利用する方法

はじめに

Azure Load Testing ではKey Vaultのシークレットを利用することができます。シークレットストアを利用することでAPIキーなどをセキュアに取り扱います。

前回は環境変数の利用方法を紹介しましたが、より安全に利用したり管理したり一括してキーを管理できます。

Azure Load TestingをVNET内(プライベート エンドポイント)で利用する - 技術的な何か。
Azure Load TestingをVNET内(プライベート エンドポイント)で利用する - 技術的な何か。

はじめに Azure Load TestingではJMeterスクリプトを使用する場合にはVNET内(プライベート エンドポイント)で利用することが可能です。 以前試した時にはなかった機能です。この機

level69.net

 

公式ドキュメントを参考にして補足、省略しながら説明しています。

シークレットと環境変数を使用する - Azure Load Testing | Microsoft Learn
シークレットと環境変数を使用する - Azure Load Testing | Microsoft Learn

Azure Load Testing でシークレットと環境変数をパラメーターとして使用して、構成可能なロード テストを作成する方法について説明します。

learn.microsoft.com

本稿のサンプルではテスト対象の仮想マシンのプライベートIPをシークレットに格納しています。

 

アクセス権の設定

Load Testing からKey Vault(キーコンテナー)へアクセスできるように設定を行います。

Load Testingの設定

システム割り当てマネージドIDを有効にします。ユーザー割り当てでもできます。

Key Vault(キーコンテナー)の設定

Load Testingがアクセス出来るようにアクセスポリシーを設定します。

シークレットのアクセス許可に取得を設定します。

プリンシパルに上記で作成したマネージドIDを追加します。

以上でアクセス権の設定は完了です。

シークレットの設定

シークレットを入力します。シークレットにはプライベートIPを格納します。10.2.0.4です。

名前は任意の値で、Load Testing 側と同じにする必要性はありません。

作成したシークレットを開き、シークレット識別子を控えます。これをLoad Testing で指定します。

テストの作成

Load Testing でテストの作成を行います。

下記のJMeterスクリプトをファイルとして保存します。

ここで重要なことはシークレットはUser Defined Variables (ユーザー定義変数)内でのみ参照することができます。このため${__GetSecret(vmIP)} をHTTPSamplerで定義しても失敗します。

 

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.5">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Azure Load Testing Quickstart" enabled="true">
      <stringProp name="TestPlan.comments"></stringProp>
      <boolProp name="TestPlan.functional_mode">false</boolProp>
      <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
      <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
        <collectionProp name="Arguments.arguments"/>
      </elementProp>
      <stringProp name="TestPlan.user_define_classpath"></stringProp>
    </TestPlan>
    <hashTree>
      <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
        <collectionProp name="Arguments.arguments">
          <elementProp name="udv_appToken" elementType="Argument">
            <stringProp name="Argument.name">udv_vmIP</stringProp>
            <stringProp name="Argument.value">${__GetSecret(vmIP)}</stringProp>
            <stringProp name="Argument.metadata">=</stringProp>
          </elementProp>
        </collectionProp>
      </Arguments>
      <hashTree/>
      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
          <boolProp name="LoopController.continue_forever">false</boolProp>
          <intProp name="LoopController.loops">-1</intProp>
        </elementProp>
        <stringProp name="ThreadGroup.num_threads">5</stringProp>
        <stringProp name="ThreadGroup.ramp_time">10</stringProp>
        <boolProp name="ThreadGroup.scheduler">true</boolProp>
        <stringProp name="ThreadGroup.duration">120</stringProp>
        <stringProp name="ThreadGroup.delay">5</stringProp>
        <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
      </ThreadGroup>
      <hashTree>
        <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Homepage" enabled="true">
          <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
            <collectionProp name="Arguments.arguments"/>
          </elementProp>
          <stringProp name="HTTPSampler.domain">${udv_vmIP}</stringProp>
          <stringProp name="HTTPSampler.port"></stringProp>
          <stringProp name="HTTPSampler.protocol"></stringProp>
          <stringProp name="HTTPSampler.contentEncoding"></stringProp>
          <stringProp name="HTTPSampler.path"></stringProp>
          <stringProp name="HTTPSampler.method">GET</stringProp>
          <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
          <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
          <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
          <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
          <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
          <stringProp name="HTTPSampler.connect_timeout"></stringProp>
          <stringProp name="HTTPSampler.response_timeout"></stringProp>
        </HTTPSamplerProxy>
        <hashTree/>
      </hashTree>
    </hashTree>
  </hashTree>
</jmeterTestPlan>

保存したファイルをスクリプトとしてアップロードします。

シークレットに変数名とシークレット識別子を入力します。IDの種類は環境に合わせます。

ネットワークは仮想ネットワークを指定します。

作成します。

 

実行確認

作成後は自動、もしくは手動で実行します。

ダッシュボードや対象マシンのログなどで確認します。

以上のようにシークレットを参照します。

まとめ

Load Testing でもシークレットを参照することでセキュアにキーなどを取り扱うことができます。特に、Key Vault で一括管理しているなどの環境ではキーの変更に伴う作業を最低限に行えると思います。

-Azure
-,