你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 负载测试中使用机密和环境变量

本文介绍如何将机密和环境作为参数传递到 Azure 负载测试中的负载测试。 可以使用参数更改负载测试的行为,而无需编辑 Apache JMeter 脚本。 例如,若要测试 Web 应用程序,请将终结点 URL 指定为参数,以便在多个环境中重复使用测试脚本。 还可以使用参数来避免必须在 JMeter 测试脚本中硬编码敏感信息。

Azure 负载测试服务支持两种类型的参数:

  • 机密:包含敏感信息,可安全地传递给负载测试引擎。 例如,机密提供 Web 服务凭据,而不是在测试脚本中对这些凭据进行硬编码。 有关详细信息,请参阅使用机密配置负载测试

  • 环境变量:包含非敏感信息,可在负载测试引擎中用作环境变量。 例如,环境变量使应用程序终结点 URL 可配置。 有关详细信息,请参阅使用环境变量配置负载测试

创建新的测试或更新现有测试时,可以在负载测试配置中指定参数。 如果在 CI/CD 工作流中运行负载测试,请在负载测试配置文件或 CI/CD 工作流定义中定义参数。

先决条件

  • 具有活动订阅的 Azure 帐户。 如果没有 Azure 订阅,请在开始之前创建一个免费帐户

  • 一个 Azure 负载测试资源。 如果需要创建 Azure 负载测试资源,请参阅创建并运行负载测试快速入门。

使用机密配置负载测试

本部分介绍如何在 Azure 负载测试中将机密传递给负载测试脚本。 例如,可以使用机密将 API 密钥传递给要进行负载测试的 Web 服务终结点。 可以将 API 密钥保存在机密存储中,以严格控制对机密的访问,而不是在配置中存储 API 密钥或在脚本中对其进行硬编码。

Azure 负载测试允许将机密存储在 Azure Key Vault 中。 也可以在 CI/CD 管道中运行负载测试时使用与 CI/CD 技术(例如 Azure Pipelines 或 GitHub Actions)关联的机密存储。

若要将机密与 Azure 负载测试一起使用,请执行以下步骤:

  1. 将机密值存储在机密存储(Azure Key Vault 或 CI/CD 机密存储)中。
  2. 将机密引用传递到 Apache JMeter 测试脚本中。
  3. 通过使用 GetSecret 自定义函数在 Apache JMeter 测试脚本中使用机密值。

重要

只有在使用 Azure 负载测试运行 JMeter 测试脚本时,才能使用 GetSecret 自定义函数。 如果在本地运行测试脚本,则需要以不同的方式更新测试脚本并读取机密值。

使用 Azure Key Vault 存储负载测试机密

可以使用 Azure Key Vault 在 Azure 负载测试中将机密值传递给测试脚本。 在 Azure 负载测试配置中添加对机密的引用。 然后,Azure 负载测试使用此引用检索 Apache JMeter 脚本中的机密值。

还需要授予 Azure 负载测试对 Azure 密钥保管库的访问权限才能检索机密值。

注意

如果在 CI/CD 过程中运行负载测试,则还可以使用相关的机密存储。 请转到使用 CI/CD 机密存储

在 Azure 密钥库中创建机密

  1. 将机密值添加到密钥保管库(如果尚未这样做)。

    重要

    如果防火墙或虚拟网络限制对 Azure 密钥保管库的访问,请执行以下步骤,向 受信任的 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 门户中,依次选择你的负载测试、“配置”、“参数”选项卡,然后输入参数详细信息

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

    • 如果要配置 CI/CD 工作流并使用 Azure Key Vault,可以使用 secrets 属性在 YAML 配置文件中指定机密。 有关语法的详细信息,请参阅测试配置 YAML 参考

  2. 指定 Azure 负载测试用来在 Azure Key Vault 中访问机密的标识。

    标识可以是负载测试资源的系统分配的标识,也可以是用户分配的标识之一。 确保使用以前已授予访问权限的同一标识。

    可以通过执行以下操作之一来指定密钥保管库引用标识:

    • 在 Azure 门户中,依次选择你的负载测试、“配置”,“参数”选项卡,然后配置“Key Vault 引用标识”

      Screenshot that shows how to select key vault reference identity.

    • 如果要配置 CI/CD 工作流并使用 Azure Key Vault,可以使用 keyVaultReferenceIdentity 属性在 YAML 配置文件中指定引用标识。 有关语法的详细信息,请参阅测试配置 YAML 参考

授予对 Azure Key Vault 的访问权限

在 Azure 密钥库中存储负载测试机密或证书时,负载测试资源使用托管标识来访问密钥保管库。 配置管理标识后,需要向负载测试资源的托管标识授予从密钥保管库读取这些值的权限。

若要授予 Azure 负载测试资源从 Azure 密钥保管库读取机密或证书的权限,请执行以下操作:

  1. Azure 门户中,转到你的 Azure 密钥保管库资源。

    如果你没有密钥保管库,请按照 Azure 密钥保管库快速入门中的说明创建一个。

  2. 在左窗格中,选择“访问策略,然后选择“+ 创建”。

  3. “权限”选项卡上的“机密权限”下,选择“获取,然后选择“下一步”。

    注意

    Azure 负载测试将证书检索为 机密 ,以确保证书的私钥可用。

  4. “主体 ”选项卡上,搜索并选择负载测试资源的托管标识,然后选择“ 下一步”。

    如果使用系统分配的托管标识,则托管标识名称与 Azure 负载测试资源的名称匹配。

  5. 再次选择“下一步”。

    测试运行时,与负载测试资源关联的托管标识现在可以从密钥保管库读取负载测试的机密或证书。

在 Azure 密钥库中添加了机密,为负载测试配置了机密后,现在可以移动到 Apache JMeter 中使用机密。

使用 CI/CD 机密存储保存负载测试机密

如果在 CI/CD 工作流中使用 Azure 负载测试,则还可以使用关联的机密存储。 例如,可以使用 GitHub 存储库机密,或 Azure Pipelines 中的机密变量

注意

如果你已使用密钥保管库,则还可以使用它来存储负载测试机密。 请转到使用 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.

    注意

    请务必使用实际的机密值(而不是密钥保管库机密标识符)作为值。

  2. 将机密作为输入参数传递给 CI/CD 工作流中的负载测试任务/操作。

    以下 YAML 代码片段演示如何将机密传递给负载测试 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 负载测试的引用。 现在可以在 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 负载测试中配置环境变量

若要将环境变量传递给 Apache JMeter 脚本,可以在 Azure 门户、YAML 测试配置文件或直接在 CI/CD 工作流中配置负载测试。

重要

为负载测试定义环境变量时,该环境变量的名称必须与在 Apache JMeter 脚本中使用的变量名称匹配。

若要使用 Azure 门户为负载测试指定环境变量,请执行以下操作:

  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 负载测试或 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"
          }
      ]

FAQ

Azure 负载测试服务是否存储我的机密值?

错误。 Azure 负载测试服务不会存储机密值。 当你使用密钥保管库机密 URI 时,该服务仅存储机密 URI,并为每次测试运行提取机密值。 如果你在 CI/CD 工作流中提供机密值,在完成测试运行后,机密值将不可用。 为每个测试运行提供这些值。

如果我的 YAML 配置文件和 CI/CD 工作流中都使用了参数,会发生什么情况?

如果 YAML 配置文件和 Azure 负载测试操作或 Azure Pipelines 任务中都存在参数,则 CI/CD 工作流中的值用于测试运行。

我通过使用 Azure 负载测试任务或操作传递参数,从 CI/CD 工作流创建并运行了一个测试。 我是否可以使用相同的参数从 Azure 门户运行此测试?

如果从 CI/CD 工作流传递参数,则不会存储这些参数的值。 从Azure 门户运行测试时,必须再次提供参数值。 出现输入缺失值的提示。 对于机密值,请输入密钥保管库机密 URI。 在测试运行或重新运行页中输入的值仅对该测试运行有效。 若要在测试级别进行更改,请转到“配置测试”并输入参数值