Azure Functions 開發人員指南
在 Azure Functions 中,不論您慣用的語言或開發環境為何,所有函式都會共用一些核心技術概念和元件。 本文為語言特定。 在文章頂端選擇慣用語言。
本文假設您已閱讀過 Azure Functions 開發人員概觀。
如果您想要直接進入,可以使用 Visual Studio、Visual Studio Code 或從命令提示字元完成快速入門教學課程。
如果您想要直接進入,可以使用 Maven (命令列)、Eclipse、IntelliJ IDEA、Gradle、Quarkus、Spring Cloud 或 Visual Studio Code 完成快速入門。
如果您想要直接進入,可以使用 Visual Studio Code 或從命令提示字元完成快速入門教學課程。
如果您想要直接進入,可以使用 Visual Studio Code 或從命令提示字元完成快速入門教學課程。
如果您想要直接進入,可以使用 Visual Studio Code 或從命令提示字元完成快速入門教學課程。
如果您想要直接進入,可以使用 Visual Studio Code 或從命令提示字元完成快速入門教學課程。
程式碼專案
Azure Functions 的核心是語言特定的程式碼專案,可實作一或多個稱為函式的程式碼執行單位。 函式只是根據事件、回應 HTTP 要求或排程在 Azure 雲端中執行的方法。 將 Azure Functions 程式碼專案視為一種機制,在 Azure 中執行時,會組織、部署及共同管理專案中個別的函式。 如需詳細資訊,請參閱組織您的函式。
您配置程式碼專案的方式,以及指出專案中哪些方法是函式的方式,取決於您專案的開發語言。 如需詳細的語言特定指引,請參閱 C# 開發人員指南。
您配置程式碼專案的方式,以及指出專案中哪些方法是函式的方式,取決於您專案的開發語言。 如需語言特定指引,請參閱 Java 開發人員指南。
您配置程式碼專案的方式,以及指出專案中哪些方法是函式的方式,取決於您專案的開發語言。 如需語言特定指引,請參閱 Node.js 開發人員指南。
您配置程式碼專案的方式,以及指出專案中哪些方法是函式的方式,取決於您專案的開發語言。 如需語言特定指引,請參閱 PowerShell 開發人員指南。
您配置程式碼專案的方式,以及指出專案中哪些方法是函式的方式,取決於您專案的開發語言。 如需語言特定指引,請參閱 Python 開發人員指南。
所有函式都必須有觸發程序,其會定義函式的啟動方式,並且可以提供函式的輸入。 您的函式可以選擇性地定義輸入和輸出繫結。 這些繫結可簡化與其他服務的連線,而無須使用用戶端 SDK。 如需詳細資訊,請參閱 Azure Functions 觸發程序和繫結概念。
Azure Functions 提供一組語言特定的專案和函式範本,可讓您輕鬆地建立新的程式碼專案,並將函式新增至您的專案。 您可以使用任何支援 Azure Functions 開發的工具,使用這些範本來產生新的應用程式和函式。
開發工具
下列工具會以慣用的語言來提供 Azure Functions 的整合開發和發佈體驗:
這些工具與 Azure Functions Core Tools 整合,讓您可以使用 Functions 執行階段在本機電腦上執行及偵錯。 如需詳細資訊,請參閱如何在本機撰寫 Azure Functions 程式碼並進行測試。
Azure 入口網站中也有一個編輯器,可讓您直接在入口網站中更新程式碼和 function.json 定義檔案。 您應該僅使用此編輯器進行小型變更,或建立概念證明函式。 可能的話,您應該一律在本機開發函式。 如需詳細資訊,請參閱在 Azure 入口網站中建立您的第一個函式。
只有使用 function.json 檔案的 Node.js 第 3 版才支援入口網站編輯。
部署
當您將程式碼專案發佈至 Azure 時,基本上會將專案部署到現有的函式應用程式資源。 函數應用程式在 Azure 中提供函式執行所在的執行內容。 這是部署及管理函式的單位。 從 Azure 資源的觀點來看,函數應用程式相當於 Azure App Service 中的網站資源 (Microsoft.Web/sites
),這相當於 Web 應用程式。
函數應用程式是由一或多個共同管理、部署和調整的個別函式所組成。 函數應用程式中的所有函式都會共用相同的定價方案、部署方法和執行階段版本。 如需詳細資訊,請參閱如何管理函數應用程式。
當 Azure 中還沒有函數應用程式和任何其他必要資源時,您必須先建立這些資源,才能部署專案檔。 您可以使用下列其中一種方式來建立這些資源:
- 在 Visual Studio 發佈期間
以程式設計方式使用 Azure CLI、Azure PowerShell、ARM 範本 或 Bicep 範本
在 Azure 入口網站中
除了工具式發佈之外,Functions 還支援將原始程式碼部署到現有函數應用程式的其他技術。 如需詳細資訊,請參閱 Azure Functions 中的部署技術。
連線到伺服器
任何雲端式計算服務的主要需求是讀取資料,並將資料寫入其他雲端服務。 函式提供一組廣泛的繫結,可讓您更輕鬆地連線到服務,而無須使用用戶端 SDK。
不論您使用 Functions 所提供的繫結延伸模組,還是直接使用用戶端 SDK,都會安全地儲存連線資料,而且不會包含在程式碼中。 如需詳細資訊,請參閱連線。
繫結
Functions 提供許多 Azure 服務和少數第三方服務的繫結,這些服務會實作為延伸模組。 如需詳細資訊,請參閱支援繫結的完整清單。
繫結延伸模組可以同時支援輸入和輸出,且許多觸發程序也會做為輸入繫結。 繫結可讓您設定與服務的連線,讓 Functions 主機可以為您處理資料存取。 如需詳細資訊,請參閱 Azure Functions 觸發程序和繫結概念。
如果您在繫結發生錯誤時發生問題,請參閱 Azure Functions 繫結錯誤碼文件。
用戶端 SDK
雖然 Functions 提供繫結來簡化函式程式碼中的資料存取,但如果您偏好,仍可以在專案中使用用戶端 SDK 直接存取指定的服務。 如果函式需要繫結延伸模組所不支援的基礎 SDK 功能,您可能需要直接使用用戶端 SDK。
使用用戶端 SDK 時,您應該使用相同的程序來儲存及存取繫結延伸模組所使用的連接字串。
當您在函式中建立用戶端 SDK 執行個體時,應該會從環境變數取得用戶端所需的連線資訊。
當您在函式中建立用戶端 SDK 執行個體時,應該會從環境變數取得用戶端所需的連線資訊。
當您在函式中建立用戶端 SDK 執行個體時,應該會從環境變數取得用戶端所需的連線資訊。
當您在函式中建立用戶端 SDK 執行個體時,應該會從環境變數取得用戶端所需的連線資訊。
當您在函式中建立用戶端 SDK 執行個體時,應該會從環境變數取得用戶端所需的連線資訊。
連線
做為安全性最佳做法,Azure Functions 會利用 Azure App Service 的應用程式設定功能,協助您更安全地儲存連線至其他服務所需的字串、金鑰和其他權杖。 Azure 中的應用程式設定會加密儲存,而且可在運行時間由您的應用程式存取為環境變數 name
value
組。 針對需要連線屬性的觸發程序和繫結,您可以設定應用程式設定名稱,而不是實際的連接字串。 您無法直接使用連接字串或金鑰來設定繫結。
例如,請考慮具有 connection
屬性的觸發程序定義。 您並非設定連接字串,而是將 connection
設定為包含連接字串的環境變數名稱。 使用此秘密存取策略可讓應用程式更安全,並且讓您更輕鬆地變更環境之間的連線。 為了獲得更高的安全性,您可以使用身分識別型連線。
預設設定提供者會使用環境變數。 在 Azure 中執行時,這些變數是在應用程式設定中進行定義,而在本機開發時,這些變數則是在本機設定檔中進行定義。
連接值
連接名稱解析為單一確切值時,執行時間會將此值視為連接字串,這通常包含秘密。 連接字串的詳細資料取決於您連線的服務。
但連接名稱也可以參考多個設定項目,在設定識別型連線會很有用處。 您可以使用以雙底線 __
結尾的共用前置詞,將環境變數當作集合。 接著,可以將連接名稱設定為這個前置詞來參考群組。
例如,Azure Blob 觸發程序定義的 connection
屬性可能為 Storage1
。 只要沒有名為 Storage1
環境變數所設定的單一字串值,名為 Storage1__blobServiceUri
的環境變數就可用來通知連線的 blobServiceUri
屬性。 每個服務的連接屬性不同。 關於使用連線的元件,請參閱文件。
注意
使用 Azure 應用程式組態或 Key Vault 來提供「受控識別」連線的設定時,設定名稱應使用有效的索引鍵分隔符號,例如::
或 /
取代 __
,以確保正確解析名稱。
例如: Storage1:blobServiceUri
。
設定以身分識別為基礎的連接
Azure Functions 中的部分連接可設定為使用身分識別,而非秘密。 支援取決於使用連線的運行時間版本和擴充功能。 在某些情況下,即使您連線的服務支援以身分識別為基礎的連線,Functions 中仍可能需要連接字串。 如需使用受控識別設定函數應用程式的教學課程,請參閱使用身分識別型連線建立函數應用程式的教學課程。
注意
在取用或彈性進階方案中執行時,您的應用程式在函數應用程式所使用的儲存體帳戶上連線到 Azure 檔案儲存體時,會使用 WEBSITE_AZUREFILESCONNECTIONSTRING
和 WEBSITE_CONTENTSHARE
設定。 存取檔案共用時,Azure 檔案儲存體不支援使用受控識別。 如需詳細資訊,請參閱 Azure 檔案儲存體支援的驗證案例
只有 Functions 4.x 支援以身分識別為基礎的連線:如果您使用 1.x 版,您必須先 移轉至 4.x 版。
下列元件支援身分識別型連線:
連線來源 | 支援的方案 | 深入了解 |
---|---|---|
Azure Blob 觸發程序和繫結 | 全部 | Azure Blob 延伸模組 5.0.0 版或更新版本, 延伸模組套件組合 3.3.0 或更新版本 |
Azure 佇列觸發程序和繫結 | 全部 | Azure 佇列延伸模組 5.0.0 版或更新版本, 延伸模組套件組合 3.3.0 或更新版本 |
Azure 資料表 (使用 Azure 儲存體時) | 全部 | Azure 資料表延伸模組 1.0.0 版或更新版本, 延伸模組套件組合 3.3.0 或更新版本 |
Azure SQL Database | 全部 | 使用受控識別和 SQL 繫結將函數應用程式連線至 Azure SQL |
Azure 事件中樞觸發程序和繫結 | 全部 | Azure 事件中樞延伸模組 5.0.0 版或更新版本, 延伸模組套件組合 3.3.0 或更新版本 |
Azure 服務匯流排觸發程序和繫結 | 全部 | Azure 服務匯流排延伸模組 5.0.0 版或更新版本, 延伸模組套件組合 3.3.0 或更新版本 |
Azure 事件方格輸出繫結 | 全部 | Azure 事件方格延伸模組 3.3.0 版或更新版本, 延伸模組套件組合 3.3.0 或更新版本 |
Azure Cosmos DB 觸發程序和繫結 | 全部 | Azure Cosmos DB 延伸模組 4.0.0 版或更新版本, 延伸模組套件組合 4.0.2 或更新版本 |
Azure SignalR 觸發程序和繫結 | 全部 | Azure SignalR 延伸模組 1.7.0 版或更新版本 延伸模組套件組合 3.6.1 或更新版本 |
Durable Functions 儲存體提供者 (Azure 儲存體) | 全部 | Durable Functions 延伸模組 2.7.0 版或更新版本, 延伸模組套件組合 3.3.0 或更新版本 |
主機必要儲存體 ("AzureWebJobsStorage") | 全部 | 使用身分識別連線到主機儲存體 |
主控於 Azure Functions 服務時,以身分識別為基礎的連接會使用受控識別。 雖然可以使用 credential
和 clientID
屬性指定使用者指派的身分識別,但預設會使用系統指派的身分識別。 請注意,不支援以資源識別碼來設定使用者指派的身分識別。 在本機開發等其他內容中執行時,雖然這可以自訂,但仍會改用您的開發人員身分識別。 請參閱使用身分識別型連線進行本機開發。
授與權限給身分識別
正在使用的任何身分識別,都必須具有執行預期動作的權限。 有關大多數 Azure 服務,意即您需要指派 Azure RBAC 的角色,利用提供這些權限的內建或自訂角色。
重要
部分權限可能會由所有內容都不需要的目標服務公開。 可以的話,請遵循最低權限原則,只授與身分識別所需的權限。 例如,如果應用程式只需要能夠讀取資料來源,請使用只有讀取權限的角色。 不宜指派也允許寫入該服務的角色,因為讀取作業不需要這麼多權限。 同樣地,您會想要確保角色指派的範圍僅限於需要讀取的資源。
選擇下方其中一個索引標籤,以了解每個元件的權限:
- Azure Blob 延伸模組
- Azure 佇列延伸模組
- Azure 資料表延伸模組
- 事件中樞延伸模組
- 服務匯流排延伸模組
- 事件方格延伸模組
- Azure Cosmos DB 延伸模組
- Azure SignalR 延伸模組
- Durable Functions 儲存提供者
- Functions 主機記憶體
您必須建立可在執行階段存取 Blob 容器的角色指派。 擁有者之類的管理角色不足夠。 下表顯示在一般作業中使用 Blob 儲存體延伸模組時建議的內建角色。 您的應用程式可能會根據您撰寫的程式碼而要求進一步權限。
繫結類型 | 內建角色範例 |
---|---|
觸發程序 | 儲存體 Blob 資料擁有者和 儲存體佇列資料參與者1 也必須將額外權限授予 AzureWebJobsStorage 連線。2 |
輸入繫結 | 儲存體 Blob 資料讀者 |
輸出繫結 | 儲存體 Blob 資料擁有者 |
1 Blob 觸發程序會藉由將有害 Blob 寫入儲存體帳戶中由連線所指定的佇列,來處理多個重試失敗。
2 AzureWebJobsStorage 連線會針對啟用觸發程序的 Blob 和佇列在內部使用。 如果將其設定成使用身分識別型連線,則需要超出預設需求的額外權限。 所需的權限是由儲存體 Blob 資料擁有者、儲存體佇列資料參與者和儲存體帳戶參與者的角色所涵蓋。 如需深入了解,請參閱使用身分識別連線到主機儲存體。
身分識別型連線的通用屬性
Azure 服務的身分識別型連線接受下列通用屬性,其中 <CONNECTION_NAME_PREFIX>
是觸發程序或繫結定義中 connection
屬性的值:
屬性 | 環境變數範本 | 描述 |
---|---|---|
權杖認證 | <CONNECTION_NAME_PREFIX>__credential |
定義如何為連線取得權杖。 如果您已部署的 Azure 函式想要使用受控識別驗證,則此設定應設定為 managedidentity 。 僅在裝載環境中有受控識別可用時,這個值才有效。 |
Client ID | <CONNECTION_NAME_PREFIX>__clientId |
當 credential 設定為 managedidentity 時,可將這個屬性設定為指定在取得權杖時要使用的使用者指派身分識別。 屬性接受的用戶端識別碼,對應至指派給應用程式的使用者指派身分識別。 指定資源識別碼和用戶端識別碼無效。 如果沒有指定,則會使用系統指派的身分識別。 不應該設定 credential 時,這個屬性會以不同的方式用於本機開發案例。 |
資源識別碼 | <CONNECTION_NAME_PREFIX>__managedIdentityResourceId |
當 credential 設定為 managedidentity 時,可將這個屬性設定為指定在取得權杖時所要使用的資源身分識別。 屬性會接受的資源識別碼是對應至使用者定義受控識別的資源識別碼。 指定資源識別碼和用戶端識別碼無效。 如果未指定這兩個身分識別,則會使用系統指派的身分識別。 不應該設定 credential 時,這個屬性會以不同的方式用於本機開發案例。 |
指定連線類型可能支援其他選項。 關於執行連線的元件,請參閱文件。
Azure SDK 環境變數
警告
不建議使用 Azure SDK 的 EnvironmentCredential
環境變數,因為可能會對其他連線造成意外影響。 部署至 Azure Functions 時,也不完全支持它們。
您也可以設定與 Azure SDK EnvironmentCredential
相關聯的環境變數,但這些環境變數不會由 Functions 服務處理,以在取用方案中進行調整。 這些環境變數不是任何一個連線特有的,除非未為指定的連接設定對應的屬性,否則會套用為預設值。 例如,如果 AZURE_CLIENT_ID
已設定,則會使用此選項,就像 <CONNECTION_NAME_PREFIX>__clientId
已設定一樣。 明確設定 <CONNECTION_NAME_PREFIX>__clientId
會覆寫此預設值。
使用身分識別型連線進行區域開發
注意
使用身分識別型連線的本機開發需要 Azure Functions Core Tools 的 4.0.3904
版或更新版本。
當您在本機執行函式專案時,上述設定會告知執行階段使用您的本機開發人員身分識別。 連線會依序嘗試從下列位置取得權杖:
- Microsoft 應用程式之間共用的本機快取
- Visual Studio 中的目前使用者內容
- Visual Studio Code 中的目前使用者內容
- Azure CLI 中的目前使用者內容
如果這些選項都沒有成功,就會發生錯誤。
您的身分識別可能已經針對用於開發的 Azure 資源進行一些角色指派,但那些角色可能無法提供必要的資料存取權。 擁有者之類的管理角色不足夠。 請仔細檢查每個元件連線所需的權限,並確定您已將元件指派給自己。
在某些情況下,您可能想要指定使用不同的身分識別。 您可以根據 Microsoft Entra 服務主體的用戶端識別碼與用戶端密碼,為指向替代身分識別的連線新增組態屬性。 裝載於 Azure Functions 服務時,不支援此組態選項。 若要在本機電腦上使用識別碼和密碼,請使用下列額外屬性定義連線:
屬性 | 環境變數範本 | 描述 |
---|---|---|
租用戶識別碼 | <CONNECTION_NAME_PREFIX>__tenantId |
Microsoft Entra 租用戶 (目錄) 識別碼。 |
Client ID | <CONNECTION_NAME_PREFIX>__clientId |
租用戶中應用程式註冊的用戶端 (應用程式) 識別碼。 |
用戶端密碼 | <CONNECTION_NAME_PREFIX>__clientSecret |
為應用程式註冊產生的用戶端密碼。 |
以下是身分識別型 Azure Blob 連線所需的 local.settings.json
屬性範例:
{
"IsEncrypted": false,
"Values": {
"<CONNECTION_NAME_PREFIX>__blobServiceUri": "<blobServiceUri>",
"<CONNECTION_NAME_PREFIX>__queueServiceUri": "<queueServiceUri>",
"<CONNECTION_NAME_PREFIX>__tenantId": "<tenantId>",
"<CONNECTION_NAME_PREFIX>__clientId": "<clientId>",
"<CONNECTION_NAME_PREFIX>__clientSecret": "<clientSecret>"
}
}
使用身分識別連線到主機儲存體
Azure Functions 主機會使用 AzureWebJobsStorage
中設定的儲存體連線來啟用核心行為,例如協調計時器觸程序和預設應用程式金鑰儲存體的單一資料庫。 您也可以將此連線設定為使用身分識別。
警告
Functions 中的其他元件依賴 AzureWebJobsStorage
做為預設行為。 如果您使用不支援這種連線類型的舊版延伸模組,則不應該將它移至身分識別型連線,包括 Azure Blob、事件中樞和 Durable Functions 的觸發程序和繫結。 同樣地,使用 Linux 使用量中的伺服器端組件時,AzureWebJobsStorage
會用於部署成品,而如果您啟用此功能,則必須透過外部部署套件進行部署。
此外,您的函數應用程式可能會針對觸發程序、繫結和/或函式程式碼中的其他儲存體連線重複使用 AzureWebJobsStorage
。 請確定所有 AzureWebJobsStorage
的用途都能夠使用身分識別型連線格式,再從連接字串變更此連線。
若要針對 AzureWebJobsStorage
使用身分識別型連線,請進行下列應用程式設定:
設定 | 描述 | 範例值 |
---|---|---|
AzureWebJobsStorage__blobServiceUri |
儲存體帳戶 Blob 服務的資料平面 URI,使用 HTTPS 配置。 | https://<storage_account_name>.blob.core.windows.net |
AzureWebJobsStorage__queueServiceUri |
使用 HTTPS 配置儲存體帳戶之佇列服務的資料平面 URI。 | https://<storage_account_name>.queue.core.windows.net |
AzureWebJobsStorage__tableServiceUri |
使用 HTTPS 配置儲存體帳戶之資料表服務的資料平面 URI。 | https://<storage_account_name>.table.core.windows.net |
身分識別型連線的通用屬性也能進行設定。
如果您要使用使用全域 Azure 的預設 DNS 尾碼和服務名稱的儲存體帳戶來設定 AzureWebJobsStorage
,請遵循 https://<accountName>.[blob|queue|file|table].core.windows.net
格式,改為將 AzureWebJobsStorage__accountName
設定為儲存體帳戶的名稱。 系統會針對此帳戶推斷每個儲存體服務的端點。 當儲存體帳戶位於主權雲端或具有自訂 DNS 時,這會無法運作。
設定 | 描述 | 範例值 |
---|---|---|
AzureWebJobsStorage__accountName |
儲存體帳戶的帳戶名稱,僅在帳戶不在主權雲端中且沒有自訂 DNS 時才有效。 此語法獨屬於 AzureWebJobsStorage ,且無法用於其他身分識別型連線。 |
<storage_account_name> |
您必須建立角色指派,以在執行時間存取 "AzureWebJobsStorage" 的儲存體帳戶。 擁有者等的管理角色不足。 儲存體 Blob 資料擁有者角色涵蓋 Functions 主機儲存體的基本需求 - 執行時間需要 Blob 的讀取和寫入存取權,以及建立容器的能力。 數個延伸模組會使用此連線做為 Blob、佇列和資料表的預設位置,而這些延伸模組可能會新增下表中所述的需求。 如果您使用 "AzureWebJobsStorage" 做為任何其他用途,可能需要額外的權限。
副檔名 | 需要的角色 | 說明 |
---|---|---|
沒有延伸模組 (僅限主機) | 儲存體 Blob 資料擁有者 | 用於一般協調、預設金鑰存放區 |
Azure Blob (僅限觸發程序) | 所有: 儲存體帳戶參與者、 儲存體 Blob 資料擁有者、 儲存體佇列資料參與者 |
Blob 觸發程序會在內部使用 Azure 佇列,並寫入 Blob 收據。 無論觸發程式設定的連線為何,都會針對這些使用 AzureWebJobsStorage。 |
Azure 事件中樞 (僅限觸發程序) | (預設需求沒有任何變更) 儲存體 Blob 資料擁有者 |
檢查點會使用 AzureWebJobsStorage 連線維持在 Blob 中。 |
計時器觸發程序 | (預設需求沒有任何變更) 儲存體 Blob 資料擁有者 |
為了確保每個事件只有一個執行,會使用 AzureWebJobsStorage 連線鎖定 Blob。 |
長期函式 | 所有: 儲存體 Blob 資料參與者、 儲存體佇列資料參與者、 儲存體資料表資料參與者 |
Durable Functions 會使用 Blob、佇列和資料表來協調活動函式,並維護協調流程狀態。 根據籲社會針對所有這些項目使用 AzureWebJobsStorage 連線,但您可以在 Durable Functions 延伸模組組態中指定不同的連線。 |
回報問題
項目 | 說明 | 連結 |
---|---|---|
執行階段 | Script Host、觸發程序和繫結、語言支援 | 提出問題 |
範本 | 建立範本的程式碼問題 | 提出問題 |
入口網站 | 使用者介面或經驗問題 | 提出問題 |
開放原始碼存放庫
Azure Functions 的程式碼是開放原始碼,您可以在這些 GitHub 存放庫中找到金鑰元件:
下一步
如需詳細資訊,請參閱以下資源: