Azure Functions PowerShell 開發人員指南

本文提供如何使用 PowerShell 撰寫 Azure Functions 的詳細數據。

PowerShell Azure 函式 (function) 會以觸發時執行的 PowerShell 腳本表示。 每個函式腳本都有一個相關 function.json 檔案,可定義函式的行為方式,例如其觸發方式及其輸入和輸出參數。 若要深入瞭解,請參閱 觸發程式和系結一文

如同其他類型的函式,PowerShell 腳本函式會採用符合檔案中 function.json 定義之所有輸入系結名稱的參數。 TriggerMetadata參數也會傳遞,其中包含啟動函式之觸發程式的其他資訊。

本文假設您已閱讀 Azure Functions 開發人員參考。 您也應該已完成 PowerShell 的 Functions 快速入門,以建立您的第一個 PowerShell 函式。

資料夾結構

PowerShell 專案所需的資料夾結構如下所示。 此預設值可以變更。 如需詳細資訊,請參閱 下面的 scriptFile 一節。

PSFunctionApp
 | - MyFirstFunction
 | | - run.ps1
 | | - function.json
 | - MySecondFunction
 | | - run.ps1
 | | - function.json
 | - Modules
 | | - myFirstHelperModule
 | | | - myFirstHelperModule.psd1
 | | | - myFirstHelperModule.psm1
 | | - mySecondHelperModule
 | | | - mySecondHelperModule.psd1
 | | | - mySecondHelperModule.psm1
 | - local.settings.json
 | - host.json
 | - requirements.psd1
 | - profile.ps1
 | - extensions.csproj
 | - bin

在專案的根目錄中,有一個 host.json 共用檔案可用來設定函式應用程式。 每個函式都有一個資料夾,其中包含自己的程式碼檔案 (.ps1) 和系結組態檔 (function.json)。 function.json檔案的父目錄名稱一律是您函式的名稱。

某些系結需要有檔案 extensions.csproj 存在。 在 2.x 版和更新版本的 Functions 執行時間中,系結延伸模組是在檔案中extensions.csproj定義,而資料夾內的實際連結庫檔案則為 bin 。 在本機開發時,您必須 註冊系結延伸模組。 在 Azure 入口網站 中開發函式時,會為您完成此註冊。

在 PowerShell 函式應用程式中,您可以選擇性地在 profile.ps1 函式應用程式開始執行時執行 (否則稱為 冷啟動)。 如需詳細資訊,請參閱 PowerShell配置檔

將 PowerShell 腳本定義為函式

根據預設,Functions 運行時間會在 中 run.ps1尋找您的函式,其中 run.ps1 會與其對應的 function.json共用相同的父目錄。

您的文稿會在執行時傳遞數個自變數。 若要處理這些參數,請將 區塊新增 param 至腳本頂端,如下列範例所示:

# $TriggerMetadata is optional here. If you don't need it, you can safely remove it from the param block
param($MyFirstInputBinding, $MySecondInputBinding, $TriggerMetadata)

TriggerMetadata 參數

參數 TriggerMetadata 可用來提供觸發程式的其他資訊。 其他元數據會因系結到系結而有所不同,但它們都包含 sys 包含下列數據的屬性:

$TriggerMetadata.sys
屬性 描述 類型
UtcNow 在UTC中觸發函式時 Datetime
MethodName 觸發的函式名稱 string
RandGuid 此函式執行的唯一 GUID string

每個觸發程式類型都有一組不同的元數據。 例如,$TriggerMetadataQueueTrigger 包含InsertionTimeIdDequeueCount、 、 等專案。 如需佇列觸發程式元數據的詳細資訊,請移至 佇列觸發程式的官方檔。 查看您正在使用的 觸發 程式檔,以查看觸發程式元數據內的內容。

繫結

在 PowerShell 中, 結會在函式的function.json中設定及定義。 函式會與系結互動數種方式。

讀取觸發程式和輸入數據

觸發程式和輸入系結會讀取為傳遞至函式的參數。 輸入系結在 function.json 中設定為 directioninnamefunction.json定義的屬性是 區塊中param參數的名稱。 由於 PowerShell 使用具名參數進行係結,因此參數的順序並不重要。 不過,最佳做法是遵循 中 function.json定義的系結順序。

param($MyFirstInputBinding, $MySecondInputBinding)

寫入輸出資料

在 Functions 中,輸出系結在function.json中設定為 directionout 。 您可以使用可供 Functions 執行時間使用的 Push-OutputBinding Cmdlet 來寫入輸出系結。 在所有情況下, name 系結的 屬性,如 中所 function.json 定義,會對應至 Name Cmdlet 的 Push-OutputBinding 參數。

下列示範如何在函式腳本中呼叫 Push-OutputBinding

param($MyFirstInputBinding, $MySecondInputBinding)

Push-OutputBinding -Name myQueue -Value $myValue

您也可以透過管線傳入特定系結的值。

param($MyFirstInputBinding, $MySecondInputBinding)

Produce-MyOutputValue | Push-OutputBinding -Name myQueue

Push-OutputBinding 會根據 指定的 -Name值,以不同的方式運作:

  • 當指定的名稱無法解析為有效的輸出系結時,就會擲回錯誤。

  • 當輸出系結接受值的集合時,您可以重複呼叫 Push-OutputBinding 以推送多個值。

  • 當輸出系結只接受單一值時,第二次呼叫 Push-OutputBinding 會引發錯誤。

Push-OutputBinding 語法

以下是呼叫 Push-OutputBinding的有效參數:

名稱 類型 位置 描述
-Name String 1 您要設定的輸出系結名稱。
-Value Object 2 您想要設定的輸出系結值,這是從管線 ByValue 接受的值。
-Clobber SwitchParameter 已命名 (選擇性)指定時,強制為指定的輸出系結設定值。

也支援下列常見參數:

  • Verbose
  • Debug
  • ErrorAction
  • ErrorVariable
  • WarningAction
  • WarningVariable
  • OutBuffer
  • PipelineVariable
  • OutVariable

如需詳細資訊,請參閱 關於 CommonParameters

Push-OutputBinding 範例:HTTP 回應

HTTP 觸發程式會使用名為 response的輸出系結傳回回應。 在下列範例中,的 response 輸出系結具有 「output #1」 的值:

PS >Push-OutputBinding -Name response -Value ([HttpResponseContext]@{
    StatusCode = [System.Net.HttpStatusCode]::OK
    Body = "output #1"
})

因為輸出是 HTTP,它只接受單一值,因此在第二次呼叫 時 Push-OutputBinding 會擲回錯誤。

PS >Push-OutputBinding -Name response -Value ([HttpResponseContext]@{
    StatusCode = [System.Net.HttpStatusCode]::OK
    Body = "output #2"
})

對於只接受單一值的輸出,您可以使用 -Clobber 參數來覆寫舊值,而不是嘗試新增至集合。 下列範例假設您已經新增值。 使用 -Clobber,下列範例的回應會覆寫現有的值,以傳回 “output #3” 的值:

PS >Push-OutputBinding -Name response -Value ([HttpResponseContext]@{
    StatusCode = [System.Net.HttpStatusCode]::OK
    Body = "output #3"
}) -Clobber

Push-OutputBinding 範例:佇列輸出系結

Push-OutputBinding 用來將數據傳送至輸出系結,例如 Azure 佇列記憶體輸出系結。 在下列範例中,寫入佇列的訊息值為 “output #1”:

PS >Push-OutputBinding -Name outQueue -Value "output #1"

儲存體 佇列的輸出系結會接受多個輸出值。 在此情況下,在第一次寫入清單後呼叫下列範例,其中包含兩個專案:“output #1” 和 “output #2”。

PS >Push-OutputBinding -Name outQueue -Value "output #2"

下列範例會在前兩個之後呼叫時,再將兩個值新增至輸出集合:

PS >Push-OutputBinding -Name outQueue -Value @("output #3", "output #4")

寫入佇列時,訊息會包含下列四個值:“output #1”、“output #2”、“output #3” 和 “output #4”。

Get-OutputBinding Cmdlet

您可以使用 Get-OutputBinding Cmdlet 來擷取目前為輸出系結設定的值。 此 Cmdlet 會擷取哈希表,其中包含具有其個別值的輸出系結名稱。

以下是使用 Get-OutputBinding 傳回目前系結值的範例:

Get-OutputBinding
Name                           Value
----                           -----
MyQueue                        myData
MyOtherQueue                   myData

Get-OutputBinding 也包含稱為 -Name的參數,可用來篩選傳回的系結,如下列範例所示:

Get-OutputBinding -Name MyQ*
Name                           Value
----                           -----
MyQueue                        myData

支援 Get-OutputBinding通配符 \ 。

記錄

在 PowerShell 函式中記錄的運作方式就像一般 PowerShell 記錄一樣。 您可以使用記錄 Cmdlet 來寫入每個輸出資料流。 每個 Cmdlet 都會對應至 Functions 所使用的記錄層級。

函式記錄層級 記錄 Cmdlet
錯誤 Write-Error
警告 Write-Warning
資訊 Write-Information
Write-Host
Write-Output
寫入記錄 Information 層級。
偵錯 Write-Debug
追蹤 Write-Progress
Write-Verbose

除了這些 Cmdlet 之外,任何寫入管線的項目都會重新導向至 Information 記錄層級,並以預設 PowerShell 格式顯示。

重要

Write-Verbose使用 或 Write-Debug Cmdlet 不足以查看詳細資訊和偵錯層級記錄。 您也必須設定記錄層級閾值,這會宣告您實際關心的記錄層級。 若要深入瞭解,請參閱 設定函式應用程式記錄層級

設定函式應用程式記錄層級

Azure Functions 可讓您定義臨界值層級,讓您輕鬆控制 Functions 寫入記錄的方式。 若要設定寫入主控台之所有追蹤的臨界值,請使用 logging.logLevel.default 檔案中的 host.json 屬性。 這個設定適用於函式應用程式中的所有函式。

下列範例會設定臨界值以啟用所有函式的詳細信息記錄,但設定閾值以啟用名為 MyFunction的函式偵錯記錄:

{
    "logging": {
        "logLevel": {
            "Function.MyFunction": "Debug",
            "default": "Trace"
        }
    }
}  

如需詳細資訊,請參閱 host.json參考

檢視記錄

如果您的函式應用程式正在 Azure 中執行,您可以使用 Application Insights 來監視它。 若要深入了解檢視和查詢函式記錄,請參閱 監視 Azure Functions

如果您要在本機執行函式應用程式以進行開發,則記錄預設為檔案系統。 若要檢視控制台中的記錄,請在啟動函式應用程式之前, AZURE_FUNCTIONS_ENVIRONMENT 將環境變數設定為 Development

觸發程式和系結類型

有數個觸發程式和系結可供您搭配函式應用程式使用。 您可以在這裡找到觸發程式和系結的完整清單。

所有觸發程式和系結都會以一些實際資料類型在程式代碼中表示:

  • Hashtable
  • string
  • byte[]
  • int
  • double
  • HttpRequestContext
  • HttpResponseContext

此清單中的前五個類型是標準 .NET 類型。 最後兩個只供 HttpTrigger 觸發程式使用。

函式中的每個系結參數都必須是下列其中一種類型。

HTTP 觸發程式和系結

HTTP 和 Webhook 觸發程式和 HTTP 輸出系結會使用要求和回應物件來表示 HTTP 傳訊。

Request 物件

傳遞至文稿的要求物件的類型為 HttpRequestContext,其具有下列屬性:

屬性 描述 類型
Body 物件,包含要求的主體。 Body 會根據數據串行化為最佳類型。 例如,如果數據是 JSON,則會以哈希表的形式傳入。 如果數據是字串,則會以字串的形式傳入。 object
Headers 包含要求標頭的字典。 <字典字串,字串>*
Method 要求的 HTTP 方法。 string
Params 物件,包含要求的路由參數。 <字典字串,字串>*
Query 包含查詢參數的物件。 <字典字串,字串>*
Url 要求的 URL。 string

* 所有 Dictionary<string,string> 索引鍵不區分大小寫。

Response 物件

您應該傳回的回應物件屬於 類型 HttpResponseContext,其具有下列屬性:

屬性 描述 類型
Body 物件,包含響應的主體。 object
ContentType 用於設定回應內容類型的簡短手。 string
Headers 包含回應標頭的物件。 字典或哈希表
StatusCode 回應的 HTTP 狀態代碼。 字串或整數

存取要求和回應

當您使用 HTTP 觸發程式時,可以使用與任何其他輸入系結相同的方式來存取 HTTP 要求。 它位於區塊中 param

HttpResponseContext使用 物件傳回回應,如下所示:

function.json

{
  "bindings": [
    {
      "type": "httpTrigger",
      "direction": "in",
      "authLevel": "anonymous"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    }
  ]
}

run.ps1

param($req, $TriggerMetadata)

$name = $req.Query.Name

Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [System.Net.HttpStatusCode]::OK
    Body = "Hello $name!"
})

叫用此函式的結果為:

PS > irm http://localhost:5001?Name=Functions
Hello Functions!

觸發程式和系結的類型轉換

對於 Blob 系結之類的特定系結,您可以指定 參數的類型。

例如,若要將資料從 Blob 記憶體提供為字串,請將下列類型轉換新增至我的 param 區塊:

param([string] $myBlob)

PowerShell 設定檔

在 PowerShell 中,有 PowerShell 配置檔的概念。 如果您不熟悉 PowerShell 配置檔,請參閱 關於配置檔

在 PowerShell Functions 中,配置檔腳本會在第一次部署和閑置後,於應用程式中的每個 PowerShell 背景工作角色實例執行一次(冷啟動。 藉由設定 PSWorkerInProcConcurrencyUpperBound 值來啟用並行存取時,配置檔腳本會針對所建立的每個 Runspace 執行。

當您使用 Visual Studio Code 和 Azure Functions Core Tools 等工具建立函式應用程式時,會為您建立預設值 profile.ps1 。 預設配置檔會在 Core Tools GitHub 存放庫上維護,並包含:

  • 自動向 Azure 進行 MSI 驗證。
  • 如果您想要的話,能夠開啟 Azure PowerShell PowerShell AzureRM 別名。

PowerShell 版本

下表顯示每個主要版本的 Functions 執行時間可用的 PowerShell 版本,以及所需的 .NET 版本:

函式版本 PowerShell 版本 .NET 版本
4.x PowerShell 7.2 .NET 6

您可以從任何函式列印 $PSVersionTable 來查看目前的版本。

若要深入瞭解 Azure Functions 運行時間支持原則,請參閱這篇文章

在特定版本上執行本機

Azure Functions 中的 PowerShell 7.0 支援已於 2022 年 12 月 3 日結束。 若要在本機執行時使用PowerShell 7.2,您必須將設定 "FUNCTIONS_WORKER_RUNTIME_VERSION" : "7.2" 新增至 Values 專案根目錄中local.setting.json檔案中的陣列。 在 PowerShell 7.2 本機執行時,您的local.settings.json檔案看起來像下列範例:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "powershell",
    "FUNCTIONS_WORKER_RUNTIME_VERSION" : "7.2"
  }
}

注意

在 PowerShell Functions 中,FUNCTIONS_WORKER_RUNTIME_VERSION的值 “~7” 是指 “7.0.x”。 我們不會自動將具有 “~7” 的 PowerShell 函式應用程式升級為 “7.2”。 接下來,針對 PowerShell 函式應用程式,我們將要求應用程式同時指定他們想要鎖定的主要和次要版本。 因此,如果您想要以 「7.2.x」 為目標,就必須提及 「7.2」。

變更 PowerShell 版本

Azure Functions 中的 PowerShell 7.0 支援已於 2022 年 12 月 3 日結束。 若要將函式應用程式升級至 PowerShell 7.2,請確定 FUNCTIONS_EXTENSION_VERSION 的值設定為 ~4。 若要瞭解如何執行這項操作,請參閱 檢視和更新目前的運行時間版本

使用下列步驟來變更函式應用程式所使用的PowerShell版本。 您可以在 Azure 入口網站 或使用 PowerShell 來執行此動作。

  1. Azure 入口網站中,瀏覽至函式應用程式。

  2. 在 [設定] 底下,選擇 [組態]。 在 [ 一般設定] 索引標籤中 ,找出 PowerShell 版本

    image

  3. 選擇您想要的 PowerShell Core 版本 ,然後選取 [ 儲存]。 當系統警告擱置重新啟動時,請選擇 [ 繼續]。 函式應用程式會在所選的 PowerShell 版本上重新啟動。

函式應用程式會在對組態進行變更之後重新啟動。

相依性管理

Functions 可讓您利用 PowerShell 資源庫 來管理相依性。 啟用相依性管理後,會使用 requirements.psd1 檔案自動下載所需的模組。 您可以在 host.json 檔案根目錄中將 屬性設定managedDependencytrue ,以啟用此行為,如下列範例所示:

{
  "managedDependency": {
          "enabled": true
       }
}

當您建立新的 PowerShell 函式專案時,預設會啟用相依性管理,並包含 Azure Az 模組 。 目前支援的模組數目上限為 10。 支持的語法為 MajorNumber.* 或確切的模組版本,如下列 requirements.psd1 範例所示:

@{
	Az = '1.*'
	SqlServer = '21.1.18147'
}

當您更新 requirements.psd1 檔案時,會在重新啟動後安裝更新的模組。

以特定版本為目標

您可能想要以 requirements.psd1 檔案中的特定模組版本為目標。 例如,如果您想要使用舊版的 Az.Accounts,而不是包含在 Az 模組中的版本,則必須以特定版本為目標,如下列範例所示:

@{
	'Az.Accounts' = '1.9.5'
}

在此情況下,您也需要將 import 語句新增至 profile.ps1 檔案頂端,如下列範例所示:

Import-Module Az.Accounts -RequiredVersion '1.9.5'

如此一來,啟動函式時,會先載入舊版的 Az.Account 模組。

相依性管理考慮

使用相依性管理時,適用下列考慮:

  • 受控相依性需要存取才能 https://www.powershellgallery.com 下載模組。 在本機執行時,請確定運行時間可以藉由新增任何必要的防火牆規則來存取此 URL。

  • 受控相依性目前不支援要求使用者接受授權的模組,無論是以互動方式接受授權,或是在叫Install-Module用 時提供-AcceptLicense參數。

相依性管理應用程式設定

下列應用程式設定可用來變更如何下載及安裝受控相依性。

函式應用程式設定 預設值 說明
MDMaxBackgroundUpgradePeriod 7.00:00:00 (七天) 控制 PowerShell 函式應用程式的背景更新期間。 若要深入瞭解,請參閱 MDMaxBackgroundUpgradePeriod
MDNewSnapshotCheckPeriod 01:00:00 (一小時) 指定每個 PowerShell 背景工作角色檢查是否已安裝受控相依性升級的頻率。 若要深入瞭解,請參閱 MDNewSnapshotCheckPeriod
MDMinBackgroundUpgradePeriod 1.00:00:00 (一天) 在啟動另一個升級檢查之前,先前的升級檢查之後的期間。 若要深入瞭解,請參閱 MDMinBackgroundUpgradePeriod

基本上,您的應用程式升級會在內 MDMaxBackgroundUpgradePeriod開始,而升級程式大約會在 內 MDNewSnapshotCheckPeriod完成。

自訂模組

在 Azure Functions 中運用您自己的自定義模組,與 PowerShell 一般執行的方式不同。

在您的本機計算機上,模組會安裝在 您 $env:PSModulePath中其中一個全域可用的資料夾中。 在 Azure 中執行時,您無法存取電腦上安裝的模組。 這表示 $env:PSModulePath PowerShell函式應用程式的與一般PowerShell腳本不同 $env:PSModulePath

在 Functions 中, PSModulePath 包含兩個路徑:

  • Modules存在於函式應用程式根目錄的資料夾。
  • PowerShell 語言背景工作角色所控制之資料夾的路徑 Modules

函式應用層級 modules 資料夾

若要使用自定義模組,您可以放置函式相依於資料夾中的 Modules 模組。 從這個資料夾,模組會自動提供給函式運行時間。 函式應用程式中的任何函式都可以使用這些模組。

注意

requirements.psd1 檔案中指定的模組會自動下載並包含在路徑中,因此您不需要將它們包含在modules資料夾中。 這些會儲存在本機的 $env:LOCALAPPDATA/AzureFunctions 資料夾中,並在雲端執行時儲存在 /data/ManagedDependencies 資料夾中。

若要利用自定義模組功能,請在函式應用程式的根目錄中建立 Modules 資料夾。 將您想要在函式中使用的模組複製到此位置。

mkdir ./Modules
Copy-Item -Path /mymodules/mycustommodule -Destination ./Modules -Recurse

Modules使用資料夾時,您的函式應用程式應該具有下列資料夾結構:

PSFunctionApp
 | - MyFunction
 | | - run.ps1
 | | - function.json
 | - Modules
 | | - MyCustomModule
 | | - MyOtherCustomModule
 | | - MySpecialModule.psm1
 | - local.settings.json
 | - host.json
 | - requirements.psd1

當您啟動函式應用程式時,PowerShell 語言背景工作角色會將此 Modules 資料夾新增至 $env:PSModulePath ,讓您可以像在一般 PowerShell 腳本中一樣依賴模組自動載入。

語言背景工作層級模組資料夾

PowerShell 語言背景工作角色通常會使用數個模組。 這些模組會定義在 的最後一個位置 PSModulePath

目前的模組清單如下所示:

  • Microsoft.PowerShell.Archive:用於處理封存的模組,例如 .zip.nupkg和其他。
  • ThreadJob:P owerShell 作業 API 的線程型實作。

根據預設,Functions 會使用這些模組的最新版本。 若要使用特定模組版本,請將該特定版本 Modules 放在函式應用程式的資料夾中。

環境變數

在 Functions 中,應用程式設定,例如服務 連接字串,會在執行期間公開為環境變數。 您可以使用 存取這些設定 $env:NAME_OF_ENV_VAR,如下列範例所示:

param($myTimer)

Write-Host "PowerShell timer trigger function ran! $(Get-Date)"
Write-Host $env:AzureWebJobsStorage
Write-Host $env:WEBSITE_SITE_NAME

有數種方式可以新增、更新和刪除函式應用程式設定:

函式應用程式設定的變更需要重新啟動函式應用程式。

在本機執行時,應用程式設定會從 local.settings.json 項目檔讀取。

並行

根據預設,Functions PowerShell 運行時間一次只能處理一個函式調用。 不過,在下列情況下,此併行層級可能不足:

  • 當您嘗試同時處理大量調用時。
  • 當您有函式叫用相同函式應用程式內其他函式的函式時。

您可以根據工作負載類型來探索幾個並行模型:

  • 增加 FUNCTIONS_WORKER_PROCESS_COUNT。 這可讓處理相同實例內多個進程的函式調用,這會導致特定的CPU和記憶體額外負荷。 一般而言,I/O 系結函式不會因為此額外負荷而受到影響。 對於 CPU 系結函式,影響可能很大。

  • PSWorkerInProcConcurrencyUpperBound增加應用程式設定值。 這可讓在同一個進程中建立多個 Runspace,這可大幅降低 CPU 和記憶體額外負荷。

您可以在函式應用程式的應用程式設定中 設定 這些環境變數。

根據您的使用案例,Durable Functions 可能會大幅改善延展性。 若要深入瞭解,請參閱 Durable Functions 應用程式模式

注意

您可能會收到「要求已排入佇列,因為沒有可用的 Runspace」警告,請注意這不是錯誤。 訊息會告訴您要求已排入佇列,且會在先前的要求完成時進行處理。

使用並行的考慮

PowerShell 預設為 single_threaded 腳本語言。 不過,您可以在相同進程中使用多個 PowerShell Runspace 來新增並行存取。 建立的 Runspace 數目,因此每個背景工作角色的並行線程數目會受限於 PSWorkerInProcConcurrencyUpperBound 應用程式設定。 根據預設,Runspaces 在 Functions 運行時間 4.x 版中會設定為 1,000。 在 3.x 版和以下版本中,Runspace 數目上限設定為 1。 輸送量將受到所選方案中可用 CPU 和記憶體數量的影響。

Azure PowerShell 會使用一些 程式層級 的內容和狀態,協助您避免輸入過多。 不過,如果您在函式應用程式中開啟並行存取,並叫用變更狀態的動作,則最終可能會有競爭條件。 這些競爭條件很難偵錯,因為一個叫用依賴特定狀態,另一個叫用變更了狀態。

Azure PowerShell 的並行存取價值很大,因為某些作業可能需要相當長的時間。 不過,您必須謹慎行事。 如果您懷疑您遇到競爭狀況,請將 PSWorkerInProcConcurrencyUpperBound 應用程式設定設為 1 ,並改為使用 語言背景工作角色進程層級隔離 進行並行存取。

設定函式腳本File

根據預設,PowerShell 函式會從 run.ps1執行,該檔案會與其對應的 function.json共用同一個父目錄。

scriptFile中的 function.json 屬性可用來取得類似下列範例的資料夾結構:

FunctionApp
 | - host.json
 | - myFunction
 | | - function.json
 | - lib
 | | - PSFunction.ps1

在此情況下, function.jsonmyFunction 會包含 scriptFile 參考要執行之導出函式之檔案的屬性。

{
  "scriptFile": "../lib/PSFunction.ps1",
  "bindings": [
    // ...
  ]
}

藉由設定 entryPoint 來使用 PowerShell 模組

本文已在範本所產生的預設 run.ps1 腳本檔案中顯示PowerShell函式。 不過,您也可以在 PowerShell 模組中包含函式。 您可以使用 function.json 組態檔中的 和 entryPoint 欄位,在模組scriptFile中參考您的特定函式程式碼。

在此情況下, entryPoint 是 中參考 scriptFile之 PowerShell 模組中的函式或 Cmdlet 名稱。

請考慮下列資料夾結構:

FunctionApp
 | - host.json
 | - myFunction
 | | - function.json
 | - lib
 | | - PSFunction.psm1

其中 PSFunction.psm1 包含:

function Invoke-PSTestFunc {
    param($InputBinding, $TriggerMetadata)

    Push-OutputBinding -Name OutputBinding -Value "output"
}

Export-ModuleMember -Function "Invoke-PSTestFunc"

在此範例中,的 myFunction 組態包含 scriptFile 參考 PSFunction.psm1的屬性,這是另一個資料夾中的PowerShell模組。 屬性 entryPoint 會參考 函 Invoke-PSTestFunc 式,這是模組中的進入點。

{
  "scriptFile": "../lib/PSFunction.psm1",
  "entryPoint": "Invoke-PSTestFunc",
  "bindings": [
    // ...
  ]
}

使用此組態時, Invoke-PSTestFunc 會執行 的方式與會 run.ps1 一樣。

PowerShell 函式的考慮

當您使用PowerShell函式時,請注意下列各節中的考慮。

冷啟動

無伺服器裝載模型中開發 Azure Functions 時,冷啟動是現實。 冷啟動 是指函式應用程式開始執行以處理要求所需的時間。 非經常性啟動會在取用方案中發生,因為您的函式應用程式會在閑置期間關閉。

配套模組,而不是使用 Install-Module

您的文稿會在每次叫用時執行。 Install-Module避免在您的文稿中使用 。 請改為在發佈之前使用 Save-Module ,讓您的函式不必浪費時間下載模組。 如果冷啟動會影響您的函式,請考慮將函式應用程式部署至一律開啟或設定為 進階版 方案的 App Service 方案

下一步

如需詳細資訊,請參閱以下資源: