本文是 Azure Functions 如何連接遠端服務的主要參考資料。 它根據連線類型和認證方法提供具體指引。
Important
盡可能使用帶有 Microsoft Entra ID 的管理身份。 此認證方法消除機密並提供最高安全性。
連接類別
Azure Functions 連線可分為以下基本類別:
- 所需主機:功能主機需要運作的連接,例如儲存與監控。
- 繫結:主機為您的觸發程序和繫結所管理的連線。
- 客戶端 SDK:你在自己的函式程式碼中建立和管理的連線。
提示
Functions 也支援受管理連接器(預覽版),讓你透過連接器命名空間連接 Office 365、Teams 和 SharePoint 等服務,並內建 OAuth 與 webhook 處理。 欲了解更多資訊,請參閱 Use connectors in Azure Functions。
Functions 主機要求你的應用程式擁有以下特定命名的連線,這些連線同時支援函式執行與日誌記錄:
AzureWebJobsStorage: Functions 使用此預設儲存帳號來啟用核心行為,例如協調計時器觸發器的單例執行,以及功能存取鍵的預設儲存。 主機要求此連線連接到受支援的儲存體帳戶。 你的函式應用程式沒有這個連線設定就無法啟動。 如需詳細資訊,請參閱 Azure Functions 的儲存體考量。APPLICATIONINSIGHTS_CONNECTION_STRING:您也應該將主機設定為把記錄寫入 Application Insights 執行個體。WEBSITE_CONTENTAZUREFILECONNECTIONSTRING:僅供運行於消費型或彈性高級方案的應用程式使用。 定義包含維護你應用程式部署套件的 Azure 檔案儲存體 共享的儲存帳號。
驗證方法
Important
如果可能,請使用受管理身份來管理你的連線。 這種方法完全消除了秘密。 當目標服務不支援 Microsoft Entra ID 認證時,請使用 Azure Key Vault 集中管理秘密。 只有在最後手段時,才會直接在應用程式設定中使用共享秘密。
功能支援連接遠端服務時的以下認證方法:
| 驗證方法 | 安全性 | 何時使用 |
|---|---|---|
| 受控識別 | 最高 | 目標服務支援 Microsoft Entra ID。 沒有需要管理的秘密。 |
| Azure Key Vault | 高 | 服務不支援受控識別,或是你需要集中式的祕密管理及輪替功能。 |
| 共享秘密 | 低 | 舊版預設。 盡快遷移到受管理身份或 金鑰保存庫。 |
請在 文章頂部 選擇您偏好的認證方式,以查看詳細的設定指引。
定義連結
執行時,你的函式應用程式會從以下位置以環境變數的形式存取連線資訊:
| 環境 | 設定儲存地點 |
|---|---|
| Azure | 應用程式設定 (靜態加密) |
| 本機開發 | local.settings.json (可選加密) |
在這兩種環境中,設定都會以環境變數的形式暴露給你的程式碼。 你需要的具體設定取決於 連線類型 和你選擇的 認證方式 。
當你使用 Microsoft Entra 認證連接 Azure 服務時,你使用的具體應用程式設定取決於所連接的服務,以及你是使用系統指派還是使用者指派的身份來驗證連線。
你用於連線的身份必須擁有執行預期動作的權限。 對大多數 Azure 服務來說,這個要求意味著你需要在 Azure RBAC 中指派一個角色,使用內建或自訂的角色來提供這些權限。 欲了解更多,請參閱 「授予身份權限」。
使用基於身份的連結時,請牢記以下考量:
在 Functions 託管的應用程式中,以身分識別為基礎的連線會使用 受控識別。 系統指派的身分識別是您應用程式專用的,預設會使用此身分識別。 然而,使用者指派身份(同樣需要
*__credential和*__clientID屬性)則更靈活且建議使用。當你的應用程式在其他環境中執行時,例如在本地開發時,會改用你的開發人員身分。 欲了解更多資訊,請參閱 地方發展 條目。
基於身份的連線僅支援於 Functions 執行時的 4.x 版本及以上版本。 如果你在 Functions 執行環境的 1.x 版本上運行舊版 C# 應用程式,必須先 遷移到 4.x 版本。
你可以將函式應用程式設定為在連線至預設儲存體帳戶 (AzureWebJobsStorage) 和其他主機所需的連線時,使用身分識別而非連接字串。
AzureWebJobsStorage 的受控識別支援會因託管方案而異:
| 主機方案 | 用於主機儲存體的 MI | Azure 檔案需求 | Recommendation |
|---|---|---|---|
| 彈性消費 | 完整支援 | 無 (沒有 Azure 檔案儲存體) | 推薦用於心肌梗塞 |
| 專用 (App Service) | 完整支援 | 無(無動態縮放) | 完整 MI,無需變通方案 |
| 消費 | Blob、佇列、資料表 | 金鑰保存庫 或移除 Azure 檔案 | 存放WEBSITE_CONTENTAZUREFILECONNECTIONSTRING於 金鑰保存庫 |
| 彈性進階版 | Blob、佇列、資料表 | 金鑰保存庫 或移除 Azure 檔案 | 存放WEBSITE_CONTENTAZUREFILECONNECTIONSTRING於 金鑰保存庫 |
在使用託管身份處理主機所需連線前,請考慮以下限制:
對於消費型和高級方案,請為 Azure 檔案儲存體 實作以下一種變通方法:
- 僅將
WEBSITE_CONTENTAZUREFILECONNECTIONSTRING連線字串儲存在 金鑰保存庫 中,這是安全性次高的選項。 - 建立一個不使用 Azure 檔案儲存體 的 Consumption 或 Premium 方案應用程式。 當沒有 Azure 檔案儲存體 時,效能會有影響。 如需詳細資訊,請參閱建立沒有 Azure 檔案儲存體的應用程式。
- 僅將
這些觸發器依賴
AzureWebJobsStorage以下條件才能正常運作:- Azure Blob 儲存體
- Azure 事件中樞
- 持久函式 (預設)
- Timer
如果你的應用程式使用這些擴充功能,請確認其版本也支援受管理身份。
AzureWebJobsStorage在 Linux 使用量方案中維護伺服器端 (遠端) 建置中的部署成品。 在這種情況下,你必須從 外部部署套件部署並執行應用程式。你的函式應用程式的其他元件可能會重複使用該
AzureWebJobsStorage連線,這些元件可能包括使用 Azure SDK 建立的儲存綁定擴充或儲存用戶端。 使用受管理身份時,請為這些非主機元件建立新的應用程式設定,即使它們支援受管理身份。
這些特定的應用程式設定會定義與 AzureWebJobsStorage 和 APPLICATIONINSIGHTS_CONNECTION_STRING 兩者之間以身分識別為基礎的連線。 對於使用標準 Azure DNS 端點的儲存帳號,設定 AzureWebJobsStorage__accountName。 若儲存體帳戶位於主權雲端,或使用自訂 DNS,則請改為設定三個各服務專用的 URI 設定。
| Setting | Description |
|---|---|
AzureWebJobsStorage__accountName |
預設儲存帳號的名稱。 當帳號使用標準 Azure DNS 端點時,請使用此設定。 這種語法是 AzureWebJobsStorage 所獨有的。 |
AzureWebJobsStorage__blobServiceUri |
預設儲存帳號裡的 Blob 儲存體 URI。 對於主權雲或自訂儲存 DNS(例如: https://mystorageaccount.blob.contoso.com)是必備的。
HTTPS 是必要的。 |
AzureWebJobsStorage__queueServiceUri |
預設儲存帳戶中的佇列儲存體 URI。 對於主權雲或自訂儲存 DNS(例如: https://mystorageaccount.queue.contoso.com)是必備的。
HTTPS 是必要的。 |
AzureWebJobsStorage__tableServiceUri |
預設儲存體帳戶中資料表儲存體的 URI。 對於主權雲或自訂儲存 DNS(例如: https://mystorageaccount.table.contoso.com)是必備的。
HTTPS 是必要的。 |
AzureWebJobsStorage__credential |
設定為 managedidentity 使用受管理身份驗證。 託管環境必須有管理身份。 |
AzureWebJobsStorage__clientId 或AzureWebJobsStorage__managedIdentityResourceId |
回傳一個特定由使用者指派的身分,用於取得管理身分驗證的存取權杖。 若兩者皆未設定,則使用系統指派的應用程式身份。 |
APPLICATIONINSIGHTS_AUTHENTICATION_STRING |
啟用使用 Microsoft Entra 驗證連線至 Application Insights。 設定為 Authorization=AAD (系統指派)或 ClientId=<YOUR_CLIENT_ID>;Authorization=AAD (使用者指派)。 |
由於雙重底線值(__)在執行時被解讀為冒號(:),這一系列設定被解釋為物件的 AzureWebJobsStorage 屬性。 請選擇與你儲存帳號設定相符的範例。
使用 AzureWebJobsStorage 的標準 Azure DNS 端點
對於使用標準 Azure DNS 端點的儲存帳號,請使用以下應用程式設定:
AzureWebJobsStorage__accountName=<ACCOUNT_NAME>AzureWebJobsStorage__credential=managedidentityAzureWebJobsStorage__clientId=<MY_USER_ASSIGNED_IDENTITY_ID>
執行時,主機將這些設定解讀為複雜的 AzureWebJobsStorage 設定:
"AzureWebJobsStorage":
{
"accountName": "<ACCOUNT_NAME>",
"credential": "managedidentity",
"clientId": "<MY_USER_ASSIGNED_IDENTITY_ID>"
}
使用自訂 DNS 或主權雲端端點來管理 AzureWebJobsStorage
對於使用自訂 DNS 或位於主權雲端的儲存帳號,請使用以下應用程式設定:
AzureWebJobsStorage__blobServiceUri=https://<ACCOUNT_NAME>.blob.contoso.comAzureWebJobsStorage__queueServiceUri=https://<ACCOUNT_NAME>.queue.contoso.comAzureWebJobsStorage__tableServiceUri=https://<ACCOUNT_NAME>.table.contoso.comAzureWebJobsStorage__credential=managedidentityAzureWebJobsStorage__clientId=<MY_USER_ASSIGNED_IDENTITY_ID>
執行時,主機將這些設定解讀為複雜的 AzureWebJobsStorage 設定:
"AzureWebJobsStorage":
{
"blobServiceUri": "https://<ACCOUNT_NAME>.blob.contoso.com",
"queueServiceUri": "https://<ACCOUNT_NAME>.queue.contoso.com",
"tableServiceUri": "https://<ACCOUNT_NAME>.table.contoso.com",
"credential": "managedidentity",
"clientId": "<MY_USER_ASSIGNED_IDENTITY_ID>"
}
你也必須在預設儲存帳號中授予該身份的權限,讓主機能夠以足夠的權限連線完成所需的任務。 想了解如何操作,請參閱 「授予身份權限」。
授與身分權限
當你使用帶有 Microsoft Entra ID 認證的受管理身份時,必須特別為應用程式在連接遠端服務時所使用的身份分配權限。 授予應用程式最低權限最簡單的方法是指派內建角色。
在授與應用程式身分 RBAC 權限時,請牢記以下建議:
- 盡可能遵守 最小權限原則 ,只授予身份最低要求的權限。 例如,如果應用程式只需要從資料來源讀取,就使用一個只允許讀取資料、不能寫入資料的角色。
- 不要用像 擁有者這種廣泛的內建角色,即使只是為了讓應用程式運作。
- 建立或修改角色分配後,變更可能要花最多 10 分鐘才能完成。 在此期間,即使角色正確指派,您的函式仍可能收到授權錯誤 (403)。 如果你在建立角色分配後立刻遇到錯誤,請等幾分鐘再重試。
- 當多個連線需要存取同一項服務的權限時,請使用涵蓋該服務所有連線所需權限之最小子集的角色。
- 有些繫結在您的儲存體帳戶中需要的權限範圍,比
AzureWebJobsStorage連線所需的更廣。 - 若要使用受管理身份存取 金鑰保存庫 中的金鑰,請將您的應用程式指定為 金鑰保存庫 秘密使用者角色。 你也可以使用 金鑰保存庫 存取政策,將 Get secrets 權限指派給受管理身份。 如需詳細資訊,請參閱 授與您應用程式中的身分識別存取您金鑰保存庫的權限。
- 本文僅提及提供最低權限的 內建角色 。 根據你的應用程式需求,你可能需要自己建立 自訂角色。
你需要的權限取決於連線類型:
AzureWebJobsStorage: 儲存區資料擁有者 角色提供主機所需AzureWebJobsStorage連線的最低儲存帳號權限。 此角色提供函式主機所需的儲存存取權限,同時遵循 最小權限原則。對於某些類型的問題,Functions 可以觸發診斷事件,幫助你排除故障,即使應用程式無法啟動。 你還必須新增 資料表儲存體資料參與者 角色,這個角色可提供對資料表儲存體的存取權,而這些診斷事件會保存於其中。 沒有這些額外權限,你可能會在日誌中看到無法寫入這些事件的警告。
其他一些繫結可能需要使用權限稍微更廣的角色。 在 繫結索引標籤的表格中,主機所需儲存體欄位會列出這些角色需求。
APPLICATIONINSIGHTS_AUTHENTICATION_STRING:監視計量發佈者角色會授予主機連線到 Application Insights 以進行記錄所需的最低權限。
注意
使用 APPLICATIONINSIGHTS_AUTHENTICATION_STRING 透過 Microsoft Entra 認證連接 Application Insights,也應關閉 Application Insights 的本地認證。 此設定需要 Microsoft Entra 認證,才能將遙測資料匯入您的工作空間。
注意
請只在目前不支援 Microsoft Entra ID 且 Azure 受控的身分識別的連線時使用 金鑰保存庫。
由於部分服務尚未支援 Microsoft Entra 認證,在某些情況下你的應用程式可能仍需使用秘密資料。 在這些情況下,Azure Key Vault 可以幫助簡化基於秘密的認證管理生命週期。 您的應用程式可以使用 金鑰保存庫,更安全地儲存及存取共用祕密,包括預設儲存體帳戶的連接字串。 雖然連線仍使用共享秘密,金鑰保存庫 為你的秘密提供更高層級的安全防護,包括金鑰維護與輪替。 即使服務本身尚未支援基於管理身份的連線,您的應用程式仍可透過受管理身份連接到 金鑰保存庫。
使用 金鑰保存庫 時,請用 金鑰保存庫 參考來建立連接的應用程式設定,而不是實際的秘密。 欲了解更多資訊,請參閱 Key Vault 中的 Source 應用程式設定。
在維持 金鑰保存庫 連線時,請考慮以下事項:
要存取保險庫中的金鑰,您必須 在應用程式中授予身份,才能存取您的金鑰庫。
你可以使用 金鑰保存庫 來儲存基於管理身份的連線設定。 當您的應用程式使用 金鑰保存庫 時,參考必須使用
:或/作為金鑰分隔符,例如Storage1:blobServiceUri。 當你使用一般應用程式設定的分隔符__時,參考名稱無法正確解析。
你可以設定 AzureWebJobsStorage,使其傳回包含連接字串的 金鑰保存庫 參考,而不是直接傳回連接字串本身。 想了解如何操作,請參閱「使用 金鑰保存庫 參考作為應用程式設定」。
Azure 檔案儲存體 目前不支援管理身份連線。 由於這項限制,請使用 金鑰保存庫 保護 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING 設定,因為使用量方案和進階版方案都需要此設定才能進行動態調整。
Flex Consumption 方案也是動態方案,不使用 Azure 檔案儲存體,且完全支援管理身份連線。
Caution
避免直接接觸共享的秘密。 盡可能使用更安全的連線認證方式。
透過使用 Microsoft Entra ID 認證的託管身份,降低機密遺失或外洩的潛在風險。 當遠端服務不支援管理身份時,至少使用 Azure Key Vault,因為它更能安全地維護共享秘密。
如果因某些原因您無法使用更安全的驗證方法,平台仍會對您應用程式設定中的靜態資料進行加密。 盡快將應用程式從共享秘密轉移到更安全的認證方式。
在 AzureWebJobsStorage 設定中,設定預設儲存帳戶的連接字串。 這個設定是你建立函式應用程式時的預設連線行為。
管理 SDK 用戶端連線
當你在函式碼中建立自己的客戶端 SDK 連線時,務必在呼叫間重複使用客戶端實例,而非建立新的。 這項最佳做法適用於所有主機方案,能降低延遲、避免套接字耗盡,並提升資源效率。
重用用戶端實例
在 Azure Functions 應用程式中使用服務專用客戶端時,請遵循以下指引:
- 不要在每次函式呼叫時建立新的用戶端。
- 請建立 一個單一的共享客戶端,讓每個函式呼叫都能重複使用。
- 如果不同函式使用相同服務,考慮在輔助類別中建立單一的共享客戶端。
建議的做法取決於你的語言:
使用相依性注入來註冊單例或有範圍的用戶端。
請參閱 客戶端程式碼範例 以了解每種語言的完整模式。
使用量方案中的連線限制
在舊有的 Consumption 方案中,函式應用程式運行於 沙盒環境中 ,每個實例的出站連線數限制為 600 個活躍連線(總共 1,200 個)。 當你達到這個限制時,函式主機會寫入以下訊息給日誌: Host thresholds exceeded: Connections。 如需詳細資訊,請參閱函數服務限制。
此限制是以每個執行個體為單位。 當擴展控制器加入函式應用程式的實例以處理更多請求時,每個實例都有其獨立的連接限制。 這表示沒有全域連線限制,且所有活躍實例中可有超過 600 個活躍連線。
在排解連線問題時,請確保你的函式應用程式已啟用 Application Insights。 Application Insights 可讓您檢視函數應用程式的度量,例如執行次數。 如需詳細資訊,請參閱檢視 Application Insights 中的遙測。
用戶端程式碼範例
本節示範如何從您的函式程式碼建立和使用用戶端的最佳做法。
HTTP 請求
透過依賴注入註冊共享 HttpClient ,使所有函式調用重複使用同一個實例。 在這種情況下,你不必丟棄客戶端,因為執行時會管理它的壽命。
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace;
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddHttpClient();
}
}
接著在你的函式類別中注入 IHttpClientFactory 或 HttpClient :
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
namespace MyNamespace;
public class MyFunction(HttpClient httpClient, ILogger<MyFunction> logger)
{
[Function("MyFunction")]
public async Task Run([TimerTrigger("0 */5 * * * *")] TimerInfo timer)
{
var response = await httpClient.GetAsync("https://example.com");
logger.LogInformation("Response status: {Status}", response.StatusCode);
}
}
Azure Cosmos DB clients
在你的新創公司註冊一個單例 CosmosClient ,讓所有功能共用同一個連線。 Azure Cosmos DB 文件建議你在應用程式的整個生命週期內都使用單例用戶端。
using Microsoft.Azure.Cosmos;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace;
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddSingleton(_ =>
{
var connectionString = Environment.GetEnvironmentVariable("CosmosDBConnection");
return new CosmosClient(connectionString);
});
}
}
然後在你的函數類別中注入 CosmosClient :
using Microsoft.Azure.Cosmos;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
namespace MyNamespace;
public class MyCosmosFunction(CosmosClient cosmosClient, ILogger<MyCosmosFunction> logger)
{
private readonly Container _container = cosmosClient.GetContainer("mydb", "mycontainer");
[Function("MyCosmosFunction")]
public async Task Run([TimerTrigger("0 */5 * * * *")] TimerInfo timer)
{
var item = new { id = "myId", partitionKey = "myPartitionKey", data = "example" };
await _container.UpsertItemAsync(item, new PartitionKey("myPartitionKey"));
logger.LogInformation("Item upserted");
}
}
SqlClient 連線
函數程式碼可能會使用 .NET Framework Data Provider for SQL Server (SqlClient) 來連線到 SQL 關聯式資料庫。 此提供者同時也是依賴 ADO.NET 的資料框架底層提供者,例如 Entity Framework。 不同於 HttpClient \(英文\) 和 DocumentClient \(英文\) 連線,ADO.NET 預設會實作連線共用。 但因為您仍可能耗盡連線,所以應最佳化資料庫連線。 如需詳細資訊,請參閱 SQL Server 連線共用 (ADO.NET)。
提示
部分資料架構 (例如 Entity Framework) 通常會從設定檔的 ConnectionStrings 區段取得連接字串。 在此情況下,您必須明確地將 SQL 資料庫連接字串新增至函數應用程式設定的連接字串集合,以及您本機專案的 local.settings.json 檔案中。 如果你在函式程式碼中建立 SqlConnection 實例,請將 連接字串 值與其他連線一起存放在應用程式設定中。
Azure 應用程式組態
Azure 應用程式組態 是一個 Azure 服務,可以用來集中管理應用程式設定。 App Configuration 支援階層式鍵值對與版本控制,並與 Azure Key Vault 整合,提供更安全的秘密管理。 欲了解更多資訊,請參閱 Azure 應用程式配置是什麼?
為了提升安全性,你的函式應用程式使用管理身份並使用 Microsoft Entra 認證來存取應用程式商店的設定。 欲了解更多資訊,請參閱 Azure Functions 的 App Configuration 參考使用方式。
注意
當使用 Azure 應用程式組態 來儲存受控識別型連線的設定時,參考必須使用 : 格式中以 / 或 <CONNECTION_NAME_PREFIX>:fullyQualifiedNamespace 作為金鑰分隔符。 當你使用一般應用程式設定的分隔符 __時,參考名稱無法正確解析。
相關內容
在 Azure Functions 中使用連接器 — 透過內建 OAuth 和 webhook 處理的管理連接器,連接 Office 365、Teams 和 SharePoint 等服務。
關於為何使用靜態客戶端的更多資訊,請參閱 不當實例化反模式。
如需更多 Azure Functions 效能祕訣,請參閱將 Azure Functions 效能和可靠性最佳化。