共用方式為


在 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 Key Vault 中建立秘密

  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,您可以在 YAML 組態檔中使用 secrets 屬性指定秘密。 如需語法的詳細資訊,請參閱測試組態 YAML 參考

  2. 指定 Azure 負載測試用來存取 Azure 金鑰保存庫中秘密的身分識別。

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

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

    • 在 Azure 入口網站中,選取負載測試、選取 [設定]、選取 [參數] 索引標籤,然後設定 [Key Vault 參考身分識別]

      Screenshot that shows how to select key vault reference identity.

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

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

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

若要向 Azure 負載測試資源授與權限,使其能夠從 Azure 金鑰保存庫讀取秘密或憑證:

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

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

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

  3. 在 [權限] 索引標籤的 [祕密權限] 下,選取 [取得],然後選取 [下一步]

    注意

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

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

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

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

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

既然您已在 Azure Key Vault 中新增秘密,並已設定負載測試的秘密,現在即可移至在 Apache JMeter 中使用秘密

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

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

注意

如果您已經使用金鑰保存庫,則可以同時用於儲存負載測試秘密。 跳至使用 Azure Key Vault

若要在 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"
          }
      ]

常見問題集

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

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

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

如果 YAML 組態檔和 Azure Load Testing 動作或 Azure Pipelines 工作中都有參數,測試回合會使用 CI/CD 工作流程中的值。

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

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