在 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 金鑰保存庫。 或者,當您在 CI/CD 管線中執行負載測試時,也可以使用與 CI/CD 技術相關聯的秘密存放區,例如 Azure Pipelines 或 GitHub Actions。

若要搭配 Azure 負載測試使用秘密,請執行下列步驟:

  1. 將秘密值儲存在秘密存放區中(Azure 金鑰保存庫 或 CI/CD 秘密存放區)。
  2. 將秘密的參考傳遞至 Apache JMeter 測試腳本。
  3. 使用 GetSecret 自定義函式,在 Apache JMeter 測試腳本中使用秘密值。

重要

您只能在使用 Azure Load Testing 執行 JMeter 測試腳本時使用 GetSecret 自定義函式。 如果您在本機執行測試腳本,則必須以不同的方式更新測試腳本並讀取秘密值。

使用 Azure 金鑰保存庫 來儲存負載測試秘密

您可以使用 Azure 金鑰保存庫,將秘密值傳遞至 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 金鑰保存庫,您可以使用 屬性在 YAML 組態檔secrets中指定秘密。 如需語法的詳細資訊,請參閱 測試組態 YAML 參考

  2. 指定 Azure Load Testing 用來存取 Azure 金鑰保存庫 中秘密的身分識別。

    身分識別可以是負載測試資源的系統指派身分識別,或其中一個使用者指派的身分識別。 請確定您使用先前授與存取權的相同身分識別。

    您可以執行下列任一動作來指定金鑰儲存庫參考身分識別:

    • 在 Azure 入口網站 中,選取負載測試、選取 [設定]、選取 [參數] 索引卷標,然後設定 金鑰保存庫 參考身分識別

      Screenshot that shows how to select key vault reference identity.

    • 如果您要設定 CI/CD 工作流程並使用 Azure 金鑰保存庫,您可以使用 屬性在 YAML 組態檔keyVaultReferenceIdentity中指定參考身分識別。 如需語法的詳細資訊,請參閱 測試組態 YAML 參考

授與 Azure 金鑰保存庫的存取權

當您在 Azure 金鑰保存庫 中儲存負載測試秘密或憑證時,負載測試資源會使用受控識別來存取金鑰保存庫。 設定管理身分識別之後,您必須授與負載測試資源許可權的受控識別,以從密鑰保存庫讀取這些值。

若要授與 Azure 負載測試資源許可權,以從 Azure 密鑰保存庫讀取秘密或憑證:

  1. Azure 入口網站 中,移至您的 Azure 金鑰保存庫資源。

    如果您沒有金鑰保存庫,請遵循 Azure 金鑰保存庫 快速入門中的指示來建立金鑰保存庫。

  2. 在左窗格中,選取 [ 存取原則],然後選取 [ + 建立]。

  3. 在 [許可權] 索引標籤的 [秘密許可權] 底下,選取 [取得],然後選取 [下一步]。

    注意

    Azure 負載測試會將憑證擷取為 秘密 ,以確保憑證的私鑰可供使用。

  4. 在 [ 主體] 索引標籤上,搜尋並選取負載測試資源的受控識別,然後選取 [ 下一步]。

    如果您使用系統指派的受控識別,受控識別名稱會符合您的 Azure 負載測試資源。

  5. 再次選取 [下一步]。

    當您的測試執行時,與負載測試資源相關聯的受控識別現在可以從密鑰保存庫讀取負載測試的秘密或憑證。

既然您已在 Azure 金鑰保存庫 中新增秘密,並設定負載測試的秘密,您現在可以移至在 Apache JMeter 中使用秘密。

使用 CI/CD 秘密存放區來儲存負載測試秘密

如果您在 CI/CD 工作流程中使用 Azure 負載測試,您也可以使用相關聯的秘密存放區。 例如,您可以在 Azure Pipelines 中使用 GitHub 存放庫秘密或秘密變數。

注意

如果您已經使用金鑰保存庫,您可能也會使用它來儲存負載測試秘密。 跳到使用 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 腳本,您可以在 #D423B4D6AE5734EFB9C37A90027AED648、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"
          }
      ]

常見問題集

Azure 負載測試服務是否儲存我的秘密值?

否。 Azure 負載測試服務不會儲存秘密的值。 當您使用金鑰保存庫秘密 URI 時,服務只會儲存秘密 URI,並擷取每個測試回合的秘密值。 如果您在 CI/CD 工作流程中提供秘密的值,則測試回合之後無法使用秘密值。 您會為每個測試回合提供這些值。

如果我在 YAML 組態檔和 CI/CD 工作流程中有參數,會發生什麼事?

如果 YAML 組態檔和 Azure 負載測試動作或 Azure Pipelines 工作都存在參數,CI/CD 工作流程中的值會用於測試回合。

我透過使用 Azure 負載測試工作或動作傳遞參數,從我的 CI/CD 工作流程建立並執行測試。 我是否可以使用相同的參數從 Azure 入口網站 執行此測試?

參數的值不會從 CI/CD 工作流程傳遞時儲存。 當您從 Azure 入口網站 執行測試時,必須再次提供參數值。 您會收到輸入遺漏值的提示。 針對秘密值,您可以輸入密鑰保存庫秘密 URI。 您在測試回合或重新執行頁面中輸入的值僅適用於該測試回合。 若要在測試層級進行變更,請移至 [ 設定測試 ] 並輸入您的參數值。