Azure Load Testing でシークレットと環境変数を使用する

この記事では、Azure Load Testing でシークレットと環境をパラメーターとしてロード テストに渡す方法について説明します。 Apache JMeter スクリプトを編集しなくても、パラメーターを使用してロード テストの動作を変更できます。 たとえば、Web アプリケーションをテストするには、エンドポイント URL をパラメーターとして指定して、複数の環境でテスト スクリプトを再利用します。 パラメーターを使用して、JMeter テスト スクリプトで機密情報をハード コーディングする必要がないようにすることもできます。

Azure Load Testing サービスでは、次の 2 種類のパラメーターがサポートされています。

  • シークレット: 機密情報が含まれ、ロード テスト エンジンに安全に渡されます。 たとえば、シークレットをテスト スクリプトにハードコーディングするのではなく、Web サービスの資格情報が提供されます。 詳細については、「シークレットを使用してロード テストを構成する」を参照してください。

  • 環境変数: 機密性の高くない情報が含まれており、ロード テスト エンジンで環境変数として使用できます。 たとえば、環境変数を使用すると、アプリケーション エンドポイントの URL が構成可能になります。 詳細については、「環境変数を使用してロード テストを構成する」を参照してください。

新しいテストを作成するとき、または既存のテストを更新するときに、ロード テスト構成でパラメーターを指定できます。 CI/CD ワークフローでロード テストを実行する場合は、ロード テスト構成ファイルまたは CI/CD ワークフロー定義でパラメーターを定義します。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。 Azure サブスクリプションをお持ちでない場合は、始める前に無料アカウントを作成してください。

  • Azure ロード テスト リソース。 Azure Load Testing リソースを作成する必要がある場合は、ロード テストの作成と実行に関するクイックスタートを参照してください。

シークレットを使用してロード テストを構成する

このセクションでは、Azure Load Testing でロード テスト スクリプトにシークレットを渡す方法について説明します。 たとえば、ロード テストを行う Web サービス エンドポイントに API キーを渡すためにシークレットを使う場合があります。 API キーを構成に格納したり、スクリプトにハードコーディングしたりする代わりに、シークレット ストアに格納してシークレットへのアクセスを厳密に制御できます。

Azure Load Testing を使うと、Azure Key Vault にシークレットを格納できます。 また、CI/CD パイプラインでロード テストを実行する場合、Azure Pipelines や GitHub Actions など、CI/CD テクノロジに関連付けられたシークレット ストアを使うこともできます。

Azure Load Testing でシークレットを使うには、次の手順を実行します。

  1. シークレット値をシークレット ストア (Azure Key Vault または CI/CD シークレット ストア) に格納します。
  2. Apache JMeter テスト スクリプトにシークレットへの参照を渡します。
  3. カスタム関数 GetSecret を使って、Apache JMeter テスト スクリプト内でシークレット値を使います。

重要

カスタム関数は GetSecret 、Azure Load Testing で JMeter テスト スクリプトを実行する場合にのみ使用できます。 テスト スクリプトをローカルで実行する場合は、テスト スクリプトを更新し、別の方法でシークレット値を読み取る必要があります。

Azure Key Vault を使ってロード テストのシークレットを格納する

Azure Key Vault を使って、Azure Load Testing のテスト スクリプトにシークレット値を渡すことができます。 Azure Load Testing 構成でシークレットへの参照を追加します。 次に、Azure Load Testing はこの参照を使って、Apache JMeter スクリプトのシークレット値を取得します。

また、シークレット値を取得するには、Azure Key Vault へのアクセス権を Azure Load Testing に付与する必要があります。

Note

ロード テストを CI/CD プロセスの一部として実行する場合は、関連するシークレット ストアを使用することもできます。 「CI/CD シークレット ストアを使用する」に進んでください。

Azure Key Vault でシークレットを作成する

  1. キー コンテナーにシークレット値を追加します (まだ行っていない場合)。

    重要

    ファイアウォールまたは仮想ネットワークによって Azure Key Vault へのアクセスを制限した場合は、次の手順に 従って、信頼された Azure サービスへのアクセスを許可します。

  2. シークレットのキー コンテナー シークレット識別子を取得します。 このシークレット識別子を使用して、ロード テストを構成します。

    Screenshot that shows the details of a secret in an Azure key vault.

    シークレット識別子は Azure キー コンテナー内のシークレットの完全な URI です。 必要に応じて、バージョン番号を含めることもできます。 たとえば、https://myvault.vault.azure.net/secrets/mysecret/ または https://myvault.vault.azure.net/secrets/mysecret/abcdef01-2345-6789-0abc-def012345678 です。

ロード テストにシークレットを追加する

  1. ロード テスト構成でシークレットを参照します。

    Apache JMeter スクリプトで参照する各シークレットに対して、ロード テストのシークレット パラメーターを定義します。 このパラメーター名は、Apache JMeter テスト スクリプトで使用するシークレット名と一致する必要があります。 パラメーター値はキー コンテナーのセキュリティ識別子です。

    次のいずれかを実行して、シークレット パラメーターを指定できます。

    • Azure portal で、ロード テストを選択し、[構成] を選択し、[パラメーター] タブを選択して、パラメーターの詳細を入力します。

      Screenshot that shows where to add secret details to a load test in the Azure portal.

    • CI/CD ワークフローを構成し、Azure Key Vault を使う場合は、YAML 構成ファイルで secrets プロパティを使ってシークレットを指定できます。 構文の詳細については、テスト構成 YAML リファレンスに関する記事を参照してください。

  2. Azure Load Testing が Azure Key Vault 内のシークレットにアクセスするために使う ID を指定します。

    ID は、ロード テスト リソースのシステム割り当て ID、またはユーザー割り当て ID のいずれかを指定できます。 必ず以前にアクセスを許可したものと同じ ID を使ってください。

    キー コンテナーの参照 ID は、次のいずれかの方法で指定できます。

    • Azure portal でロード テストを選び、[構成] を選び、[パラメーター] タブを選び、Key Vault の参照 ID を構成します。

      Screenshot that shows how to select key vault reference identity.

    • CI/CD ワークフローを構成し、Azure Key Vault を使う場合は、YAML 構成ファイルで keyVaultReferenceIdentity プロパティを使って参照 ID を指定できます。 構文の詳細については、テスト構成 YAML リファレンスに関する記事を参照してください。

Azure Key Vault にアクセス権を付与する

ロード テスト シークレットまたは証明書を Azure Key Vault に格納すると、ロード テスト リソースでは、キー コンテナーにアクセスするためにマネージド IDが使用されます。 マネージド ID を構成したら、ロード テスト リソースのマネージド ID に、キー コンテナーからこれらの値を読み取るアクセス許可を付与する必要があります。

Azure Key Vault からシークレットまたは証明書を読み取るアクセス許可を Azure ロード テスト リソースに付与するには:

  1. Azure portal で Azure キー コンテナー リソースに移動します。

    キー コンテナーがない場合は、「Azure Key Vault のクイックスタート」の手順に従って作成します。

  2. 左側のウィンドウで、[アクセス ポリシー] を選択し、[+ 作成] を選択します。

  3. [アクセス許可] タブの [シークレットのアクセス許可] で、[取得] を選択し、[次へ] を選択します。

    Note

    Azure Load Testing では、証明書の秘密キーが使用可能であることを確認するために、証明書がシークレットとして取得されます。

  4. [プリンシパル] タブで、ロード テスト リソースのマネージド ID を検索して選択し、[次へ] を選択します。

    システム割り当てマネージド ID を使用している場合、マネージド ID 名は Azure ロード テスト リソースの名前と一致します。

  5. 次へを再度選択します。

    テストの実行時に、ロード テスト リソースに関連付けられているマネージド ID で、キー コンテナーからロード テストのシークレットまたは証明書が読み取れるようになりました。

Azure Key Vault にシークレットを追加し、ロード テスト用のシークレットを構成したので、Apache JMeter の [シークレットの使用] に移動できるようになりました。

CI/CD シークレット ストアを使ってロード テストのシークレットを保存する

CI/CD ワークフローで Azure Load Testing を使用している場合は、関連付けられているシークレット ストアを使用することもできます。 たとえば、GitHub リポジトリ シークレットまたは Azure Pipelines のシークレット変数を使用できます。

Note

既にキーコンテナーを使用している場合は、それを使用してロード テストのシークレットを格納することもできます。 「Azure キー コンテナーを使用する」に進んでください。

CI/CD シークレット ストアでシークレットを使用し、CI/CD でロード テストに渡すには:

  1. まだ存在しない場合は、CI/CD シークレット ストアにシークレット値を追加します。

    Azure Pipelines では、パイプラインを編集して変数を追加できます。

    Screenshot that shows how to add a variable to Azure Pipelines.

    GitHub では、GitHub リポジトリ シークレットを使用できます。

    Screenshot that shows how to add a GitHub repository secret.

    Note

    値としてキー コンテナー シークレット識別子ではなく、実際のシークレット値を使用してください。

  2. CI/CD ワークフローの Load Testing タスクまたはアクションの入力パラメーターとしてシークレットを渡します。

    次の YAML スニペットは、Load Testing GitHub アクションにシークレットを渡す方法を示しています。

    - name: 'Azure Load Testing'
      uses: azure/load-testing@v1
      with:
        loadtestConfigFile: 'SampleApp.yaml'
        loadtestResource: 'MyTest'
        resourceGroup: 'loadtests-rg'
        secrets: |
        [
            {
            "name": "appToken",
            "value": "${{ secrets.MY_SECRET }}"
            }
        ]
    

    次の YAML スニペットは、Azure Pipelines タスクにシークレットを渡す方法を示しています。

    - task: AzureLoadTest@1
      inputs:
        azureSubscription: 'MyAzureLoadTestingRG'
        loadTestConfigFile: 'SampleApp.yaml'
        loadTestResource: 'MyTest'
        resourceGroup: 'loadtests-rg'
        secrets: |
          [
              {
              "name": "appToken",
              "value": "$(mySecret)"
              }
          ]
    

    重要

    シークレット入力パラメーターの名前は、Apache JMeter スクリプトで使用される名前と一致する必要があります。

これで、CI/CD シークレット ストアにシークレットを指定し、Azure Load Testing に参照を渡す手順を完了しました。 Apache JMeter スクリプトでシークレットを使用できるようになりました。

Apache JMeter でシークレットを使用する

次に、先ほど指定したシークレットを使用するように Apache JMeter スクリプトを更新します。

まず、シークレット値を取得するユーザー定義変数を作成します。 次に、この変数をテスト内で使います (たとえば、HTTP 要求ヘッダーで API トークンを渡すため)。

  1. JMX ファイルにユーザー定義変数を作成し、GetSecret カスタム関数を使用してシークレット値をこれに割り当てます。

    GetSecret(<my-secret-name>) 関数は、引数としてシークレット名を受け取ります。 この名前は、後の手順でロード テストを構成するときに使用します。

    次の図に示すように、Apache JMeter IDE を使用してユーザー定義変数を作成できます。

    Screenshot that shows how to add user-defined variables to your Apache JMeter script.

    または、次のコード スニペットの例に示すように、JMX ファイルを直接編集することもできます。

    <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
      <collectionProp name="Arguments.arguments">
        <elementProp name="appToken" elementType="Argument">
          <stringProp name="Argument.name">udv_appToken</stringProp>
          <stringProp name="Argument.value">${__GetSecret(appToken)}</stringProp>
          <stringProp name="Argument.desc">Value for x-secret header </stringProp>
          <stringProp name="Argument.metadata">=</stringProp>
        </elementProp>
      </collectionProp>
    </Arguments>
    
  2. テスト スクリプト内のユーザー定義変数を参照します。

    ${} 構文を使用して、スクリプト内の変数を参照できます。 次の例では、udv_appToken 変数を使用して HTTP ヘッダーを設定します。

      <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true">
        <collectionProp name="HeaderManager.headers">
          <elementProp name="" elementType="Header">
            <stringProp name="Header.name">api-key</stringProp>
            <stringProp name="Header.value">${udv_appToken}</stringProp>
          </elementProp>
        </collectionProp>
      </HeaderManager>
    

環境変数を使用してロード テストを構成する

このセクションでは、環境変数を使用して、ロード テストにパラメーターを渡します。

  1. 環境変数を使用するように Apache JMeter スクリプトを更新します (たとえば、アプリケーション エンドポイントのホスト名を構成します)。

  2. ロード テストを構成し、環境変数をテスト スクリプトに渡します。

Apache JMeter で環境変数を使用する

このセクションでは、環境変数を使用してスクリプトの動作を制御するように、Apache JMeter スクリプトを更新します。

まず、環境変数を読み取るユーザー定義変数を定義します。次に、この変数をテストの実行で使用できます (たとえば、HTTP ドメインを更新します)。

  1. JMX ファイルにユーザー定義変数を作成し、System.getenv 関数を使用して環境変数の値をこれに割り当てます。

    System.getenv("<my-variable-name>") 関数は、引数として環境変数名を受け取ります。 ロード テストを構成するときに、この同じ名前を使用します。

    次の図に示すように、Apache JMeter IDE を使用してユーザー定義変数を作成できます。

    Screenshot that shows how to add user-defined variables for environment variables to your JMeter script.

    または、次のコード スニペットの例に示すように、JMX ファイルを直接編集することもできます。

    <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
      <collectionProp name="Arguments.arguments">
        <elementProp name="appToken" elementType="Argument">
          <stringProp name="Argument.name">udv_webapp</stringProp>
          <stringProp name="Argument.value">${__BeanShell( System.getenv("webapp") )}</stringProp>
          <stringProp name="Argument.desc">Web app URL</stringProp>
          <stringProp name="Argument.metadata">=</stringProp>
        </elementProp>
      </collectionProp>
    </Arguments>
    
  2. テスト スクリプト内のユーザー定義変数を参照します。

    ${} 構文を使用して、スクリプト内の変数を参照できます。 次の例では、udv_webapp 変数を使用して、アプリケーション エンドポイントの URL を構成します。

    <stringProp name="HTTPSampler.domain">${udv_webapp}</stringProp>
    

Azure Load Testing で環境変数を構成する

環境変数を Apache JMeter スクリプトに渡すには、Azure portal、YAML テスト構成ファイル、または CI/CD ワークフローで直接、ロード テストを構成できます。

重要

ロード テストの環境変数を定義する場合、その名前は Apache JMeter スクリプトで使用した変数名と一致する必要があります。

Azure portal を使用してロード テストに環境変数を指定するには、次の手順を実行します。

  1. テスト構成ページで、[パラメーター] タブを選択します。

  2. [環境変数] セクションで、環境変数の [名前][値] を入力し、[適用] を選択します。

    Screenshot that shows how to add an environment variable to a load test in the Azure portal.

CI/CD ワークフローでロード テストを実行する場合は、YAML テスト構成ファイルで環境変数を定義できます。 構文の詳細については、テスト構成 YAML リファレンスに関する記事を参照してください。

または、CI/CD ワークフロー定義で環境変数を直接指定することもできます。 Azure Load Testing アクションまたは Azure Pipelines タスクの入力パラメーターを使用して、環境変数を Apache JMeter スクリプトに渡します。

次の YAML スニペットは、GitHub Actions の例を示しています。

- name: 'Azure Load Testing'
  uses: azure/load-testing
  with:
    loadtestConfigFile: 'SampleApp.yaml'
    loadtestResource: 'MyTest'
    resourceGroup: 'loadtests-rg'
    env: |
    [
        {
        "name": "webapp",
        "value": "myapplication.contoso.com"
        }
    ]

次の YAML スニペットは、Azure Pipelines の例を示しています。

- task: AzureLoadTest@1
  inputs:
    azureSubscription: 'MyAzureLoadTestingRG'
    loadTestConfigFile: 'SampleApp.yaml'
    loadTestResource: 'MyTest'
    resourceGroup: 'loadtests-rg'
    env: |
      [
          {
          "name": "webapp",
          "value": "myapplication.contoso.com"
          }
      ]

よく寄せられる質問

Azure Load Testing サービスにシークレット値は格納されますか?

いいえ。 Azure Load Testing サービスにはシークレットの値は格納されません。 キー コンテナーのシークレット URI を使用する場合、サービスではシークレット URI のみが格納され、テスト実行ごとにシークレットの値が取り込まれます。 シークレットの値を CI/CD ワークフローで指定する場合、シークレットの値はテストの実行後に使用できません。 これらの値は、テストの実行ごとに指定します。

YAML 構成ファイルと CI/CD ワークフローの両方にパラメーターがある場合は、どうなるでしょうか。

YAML 構成ファイルと Azure Load Testing アクションまたは Azure Pipelines タスクの両方にパラメーターが存在する場合、CI/CD ワークフローの値がテスト実行に使用されます。

Azure Load Testing のタスクまたはアクションを使用してパラメーターを渡すことによって、CI/CD ワークフローからテストを作成して実行しました。 同じパラメーターを使用して、Azure portal からこのテストを実行できますか?

パラメーターの値は、CI/CD ワークフローから渡された場合は格納されません。 Azure portal からテストを実行するときに、パラメーター値をもう一度指定する必要があります。 不足している値を入力するように求めるメッセージが表示されます。 シークレット値の場合は、キー コンテナーのシークレット URI を入力します。 テストの実行または再実行のページで入力した値は、そのテストの実行についてのみ有効です。 テスト レベルで変更を行う場合は、[Configure Test]\(テストの構成 \) に移動し、パラメーター値を入力します。