當你在 Azure 建立函式應用實例時,必須提供預設 Azure 儲存體 帳號的存取權限。 以下圖表與表格說明 Azure Functions 如何在預設儲存帳號中使用服務:
請在本文頂端選擇您的主機方案,查看適用於您功能應用程式的儲存指引。
| 儲存體服務 | 函式使用方式 |
|---|---|
| Azure Blob storage | 維護繫結狀態和函式金鑰1。 在 Flex 取用方案 中執行應用程式的部署來源。 預設用於 Durable Functions 中的工作中樞。 可用來儲存 Linux 使用量遠端組建的函數應用程式程式碼,或做為外部套件 URL 部署的一部分。 |
| Azure 檔案儲存體2 | 檔案共用,用於儲存和執行使用情況方案和進階方案中的函數應用程式程式碼。 維護 擴充套件組合。 儲存部署記錄。 支援 PowerShell 中的受控相依性。 |
| Azure Queue Storage | 預設用於 Durable Functions 中的工作中樞。 用於特定 Azure Functions 觸發程序的失敗與重試處理。 用於 Blob 儲存體觸發程序的物件追蹤。 |
| Azure 表格儲存 | 預設用於 Durable Functions 中的工作中樞。 用於追蹤 診斷事件。 |
- Blob 儲存體是函式金鑰的預設存放區,但您可以設定替代存放區。
- Azure 檔案儲存體預設是設定好的,但在特定條件下,你可以建立應用程式而不使用 Azure 檔案儲存體。
重要考量︰
請考慮以下關於你工作應用程式所使用的儲存帳號的事實:
當你在 Consumption Plan(Windows)或 Premium 方案上架設函式應用程式時,你會將函式程式碼和設定檔存到 Azure 檔案儲存體 裡的連結儲存帳號。 如果你刪除這個儲存帳號,內容就會永久刪除。 如需詳細資訊,請參閱 已刪除儲存體帳戶。
儲存帳號會保存重要資料,例如功能程式碼、 存取鍵及其他重要的服務相關資料。 您必須以下列方式仔細管理函數應用程式所使用的儲存體帳戶存取權:
根據最低權限模型稽核及限制應用程式和使用者的儲存體帳戶存取權。 儲存體帳戶的權限可以來自指派角色中的資料動作,或透過執行 listKeys 作業的權限提供。
監視儲存體帳戶中的控制平面活動 (例如擷取金鑰) 和資料平面作業 (例如寫入 Blob)。 考慮將儲存日誌保存在 Azure 儲存體 以外的地方。 如需詳細資訊,請參閱儲存記錄。
如果你使用 Durable Functions,任務中心儲存特別安全敏感,因為寫入存取可能會被用來改變應用程式行為,包括觸發任意程式碼執行。 欲了解更多資訊,請參閱 「保護你的任務中心儲存」。
儲存體帳戶的需求
你在 Azure 入口網站建立函式應用程式時建立的儲存帳號,會與新的函式應用程式相容。 當您選擇使用現有的儲存體帳戶時,所提供的清單不包含特定不支援的儲存體帳戶。 您的函式應用程式所使用的儲存體帳戶適用下列限制。 確保現有的儲存帳戶符合以下要求:
- 當函數應用程式裝載於使用量方案時,您無法使用網路保護的儲存體帳戶。
帳戶類型必須支援 Blob、佇列和資料表儲存體。 某些儲存體帳戶不支援佇列和資料表。 這些帳戶包括僅限 Blob 的儲存帳戶和 Azure 進階儲存體。 若要深入了解儲存體帳戶類型,請參閱儲存體帳戶概觀。
當你在 Azure 入口網站建立 function 應用程式時,你只能選擇與該功能應用程式同一區域內的現有儲存帳號。 此需求是效能最佳化,而不是嚴格的限制。 若要深入了解,請參閱儲存體帳戶位置。
當你使用部署自動化建立帶有網路安全的儲存帳號的功能應用程式時,必須在 ARM 範本或 Bicep 檔案中包含特定的網路配置。 如果你沒有包含這些設定和資源,你的自動部署可能會在驗證中失敗。 關於 ARM 範本及 Bicep 指引,請參見 安全部署。 關於設定儲存體帳戶與網路的概觀,請參閱 如何在 Azure Functions 中使用安全的儲存體帳戶。
儲存體帳戶指引
每個函式應用程式都需要有儲存體帳戶才能運作。 當你刪除那個帳號時,你的功能應用程式就會停止執行。 若要為儲存體相關問題疑難排解,請參閱如何為儲存體相關問題疑難排解。 以下考量適用於功能應用程式所使用的儲存帳號。
儲存體帳戶位置
為獲得最佳效能,您的函數應用程式應該使用同一區域中的儲存體帳戶,以減少延遲。 Azure 入口網站則強制執行這項最佳實務。 如果你需要在與功能應用程式不同的區域使用儲存帳號,必須在 Azure 入口外建立功能應用程式。
函數應用程式必須能夠存取儲存體帳戶。 如果您需要使用安全的儲存體帳戶,請考慮將儲存體帳戶限制為虛擬網路。
儲存體帳戶連線設定
預設情況下,函式應用程式會將 AzureWebJobsStorage 連線設定為儲存在 AzureWebJobsStorage 應用程式設定 中的連接字串。 你也可以 設定 AzureWebJobsStorage 使用不需要憑證的身份驗證連線。
在 Consumption 方案(僅限 Windows)或 Elastic Premium 方案(Windows 或 Linux)中運行的功能應用程式,可以使用 Azure 檔案儲存體 來儲存啟用動態縮放所需的映像檔。 對於這些方案,請在 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING 設定中設定儲存帳號的連接字串,並在 WEBSITE_CONTENTSHARE 設定中設定檔案共用名稱。 此值通常與用於AzureWebJobsStorage的帳戶相同。 你也可以建立一個不使用 Azure 檔案儲存體 的函式應用程式,但縮放可能有限制。
附註
你必須在重新產生儲存金鑰時更新儲存帳戶的連接字串。 更多資訊請參見 建立Azure儲存帳戶。
共用的儲存體帳戶
多個功能的應用程式可以毫無問題地共用同一個儲存帳號。 例如,在Visual Studio中,你可以使用 Azurite 儲存模擬器來開發多個應用程式。 在此情況下,模擬器的作用就像單一儲存體帳戶。 你功能應用程式使用的同一個儲存帳號也可以儲存你的應用程式資料。 不過,在實際執行環境中,這個方法不一定理想。
您可能需要使用不同的儲存體帳戶,以避免主機識別碼衝突。
生命週期管理原則考量
不要對你功能應用程式使用的Blob 儲存體帳號套用生命週期管理政策。 Functions 會使用 Blob 儲存體來保存重要資訊,例如 函式存取金鑰。 原則可以移除 Functions 主機所需的 Blob,例如金鑰。 如果您必須使用原則,請排除 Functions 所使用的容器,其前面加上 azure-webjobs 或 scm。
儲存體記錄
因為函式程式碼和金鑰可能會儲存在儲存體帳戶中,因此針對儲存體帳戶的活動記錄是監視未經授權存取的絕佳方法。 Azure 監視器 資源日誌可以用來追蹤儲存資料平面的事件。 請參閱 Monitoring Azure 儲存體 了解如何配置與檢視這些日誌。
Azure 監視器 活動日誌記錄了控制平面的事件,其中包括 listKeys 操作。 不過,您也應該設定儲存體帳戶的資源記錄,以追蹤金鑰或其他身分識別型資料平面作業的後續使用情況。 您應該至少啟用 StorageWrite 記錄類別,才能識別對一般 Functions 作業外部資料所進行的修改。
為了限制範圍過廣的儲存權限可能帶來的影響,建議使用非儲存的目的地來存放這些日誌,例如 Log Analytics。 詳細資訊請參見監控 Azure Blob 儲存體。
最佳化儲存體效能
若要將效能最大化,請針對每個函式應用程式使用個別的儲存體帳戶。 在使用 Durable Functions 或 Event Hubs 觸發的函數時,這種方法尤為重要,因為它們都會產生大量的儲存體交易。 當你的應用程式邏輯直接與 Azure 儲存體 互動時,不論是直接(使用 Storage SDK)或透過其中一處儲存綁定,你應該使用專用的儲存帳號。 例如,若有事件中樞觸發的函式將一些資料寫入 Blob 儲存體,請使用兩個儲存體帳戶,一個用於函數應用程式,另一個用於函式所儲存的 Blob。
透過虛擬網路的一致路由
同一方案中託管的多個功能應用程式,也可以使用同一個儲存帳號來進行Azure 檔案儲存體內容分享,定義為 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING。 當您使用虛擬網路來保護此儲存體帳戶時,所有這些應用程式 (包含部署位置) 都應使用相同的 vnetContentShareEnabled 值 (先前為 WEBSITE_CONTENTOVERVNET),並採用相同的虛擬網路整合設定,以確保流量能一致地經由預期的虛擬網路進行路由。 使用相同 Azure 檔案儲存體 儲存帳號的應用程式設定不符,可能導致流量流經公共網路。 在此設定中,儲存體帳戶網路規則會封鎖存取。
該 vnetContentShareEnabled 指引不適用於彈性消費、專用、容器應用程式或消費型主機。
使用 Blob
Functions 的主要案例是處理 Blob 容器中的檔案,例如映像處理或情感分析。 若要深入了解,請參閱處理檔案上傳。
在 Blob 容器上觸發
有數種方式可根據儲存體容器中 Blob 的變更來執行函式程式碼,如下圖所示:
使用下表來判斷哪個函式觸發程式最適合您處理容器中新增或更新的 Blob 的需求:
| 策略 | Blob 觸發程序 (輪詢) | Blob 觸發器(事件驅動) | 佇列觸發程序 | 事件方格觸發程序 |
|---|---|---|---|---|
| 延遲 | 高 (最多 10 分鐘) | 低 | 中 | 低 |
| 儲存體帳戶限制 | 不支援僅限 Blob 的帳戶¹,以及已啟用階層命名空間(HNS)的帳戶,例如 Azure Data Lake Storage Gen2 帳戶 | 不支援一般用途 v1 帳戶 | 沒有 | 不支援一般用途 v1 帳戶 |
| 觸發程序類型 | Blob 儲存體 | Blob 儲存體 | 佇列儲存體 | 事件方格 |
| 延伸模組版本 | 任意 | 儲存體 v5.x+ | 任意 | 任意 |
| 處理現有的 Blob | 是 | 否 | 否 | 否 |
| 篩選器 | Blob 名稱模式 | 事件篩選器 | 不適用 | 事件篩選器 |
| 需要事件訂用帳戶 | 否 | 是 | 否 | 是 |
| 支援 Flex 取用方案 | 否 | 是 | 是 | 是 |
| 支援高延展性² | 否 | 是 | 是 | 是 |
| 適用於 入站存取限制 | 是 | 否 | 是 | 是3 |
| 描述 | 預設觸發程序行為,其依賴輪詢容器以進行更新。 如需詳細資訊,請參閱 Blob 儲存體觸發程序參考中的範例。 | 從事件訂用帳戶取用 Blob 儲存體事件。 需要 Source 的 EventGrid 參數值。 更多資訊請參閱 教程:使用事件訂閱觸發 Azure Functions 於 blob 容器。 |
將 Blob 新增至容器時,Blob 名稱字串會手動新增至儲存體佇列。 佇列儲存體觸發程序會將此值直接傳遞至相同函式上的 Blob 儲存體輸入繫結。 | 除了來自儲存體容器的事件之外,提供觸發事件的彈性。 當需要同時有非儲存體事件觸發您的函式時,請使用此項目。 欲了解更多資訊,請參閱如何在Azure Functions中使用事件格子觸發器與綁定。 |
- 僅 Blob 帳戶的限制只適用於輪詢式 Blob 儲存體觸發程序。 Blob 儲存體輸入和輸出繫結支援僅限 Blob 的帳戶。
- 可將高延展性寬鬆地定義為可容納超過 100,000 個 Blob 的容器,或每秒 Blob 更新超過 100 次的儲存體帳戶。
- 您可以讓事件訂閱使用已知的使用者身分,透過公用 IP 空間中的加密通道遞送事件,以解決入埠存取限制。 如需詳細資訊,請參閱 使用受控識別安全地傳遞事件。
儲存體資料加密
Azure 儲存體 會加密儲存帳號中所有資料的靜態狀態。 欲了解更多資訊,請參見Azure 儲存體 靜止資料加密(encryption for data at rest。
預設情況下,資料會用 Microsoft 管理的金鑰加密。 若要進一步控制加密金鑰,您可以提供客戶管理的金鑰,以用於 Blob 和檔案資料的加密。 這些金鑰必須存在於 Azure Key Vault 中,Functions 才能存取儲存帳號。 若要深入瞭解,請參閱 使用客戶管理的密鑰加密待用應用程式數據。
區域內資料落地
當所有客戶資料必須停留在同一區域時,請使用與功能應用程式綁定且具有 區域內冗餘功能的儲存帳號。 也可以用區域內備援儲存體帳戶搭配 Azure Durable Functions。
當您在內部負載平衡的 App Service 環境 (ASE) 中託管時,平台僅會在該區域內儲存其他由平台管理的客戶資料。 若要深入了解,請參閱 ASE 區域備援。
主機識別碼考量
本節中關於主機識別碼的考量不適用於彈性取用。 在此主機計畫中,主機 ID 值會以避免這些潛在問題的方式建立。
函式會使用主機 ID 值來唯一識別儲存產物中的特定函式應用程式。 預設情況下,執行時會自動從函式應用程式名稱(縮短至前 32 個字元)產生此 ID。 執行時在連結的儲存帳號中儲存每個應用程式的關聯與追蹤資訊時,會使用此 ID。 當函式應用程式名稱超過32個字元且前32個字元相同時,這種截斷可能導致主機ID值重複。 當兩個擁有相同主機 ID 的功能應用程式使用相同的儲存帳號時,會發生主機 ID 衝突,因為儲存的資料無法唯一連結到正確的功能應用程式。
附註
當同一個函式應用程式的生產插槽與預備插槽共用相同的儲存體帳戶時,也可能發生相同類型的主機識別碼衝突。
在 Functions 執行階段 4.x 版中,系統會記錄錯誤,且主機會停止運作,造成嚴重失敗。 欲了解更多資訊,請參見HostID 截斷可能導致碰撞。
避免主機識別碼衝突
使用以下策略避免主機 ID 衝突:
- 使用不同的儲存體帳戶,讓每個發生衝突的主機寫入不同的儲存體帳戶。
- 將其中一個函式應用程式重新命名,使其名稱少於 32 個字元,這會變更該應用程式計算出的主機識別碼,並消除衝突。
- 為一或多個衝突的應用程式設定明確的主機識別碼。 若要深入瞭解,請參閱 覆寫主機 ID。
重要事項
變更與現有函式應用程式相關聯的儲存體帳戶或變更應用程式的主機識別碼可能會影響現有函式的行為。 例如,Blob 儲存體觸發程序會藉由在儲存體中特定主機 ID 路徑下寫入收據,追蹤是否已處理個別 blob。 當主機識別碼變更或您指向新的儲存體帳戶時,可能會重新處理以前處理過的 Blob。
覆寫主機識別碼
你可以在應用程式設定中,透過這個 AzureFunctionsWebHost__hostid 設定為你的功能應用程式設定明確的主機 ID。 如需詳細資訊,請參閱 AzureFunctionsWebHost__hostid。
建立一個沒有 Azure 檔案儲存體 的應用程式
Azure 檔案儲存體 服務提供支援高規模情境的共享檔案系統。 當您的函式應用程式在彈性進階方案或 Windows 的使用量方案中執行時,系統會在您的儲存體帳戶中預設建立 Azure 檔案儲存體共用。 功能可以利用此共享功能,例如日誌串流及共享應用程式內容位置。 部署地點取決於部署技術與應用程式設定。 例如,使用外部套件 URL 的應用程式會從設定的 URL 執行套件,而非 Azure 檔案儲存體 共享。
使用 Azure 檔案儲存體 需要一個 連接字串,這個字串會儲存在你的應用程式設定中。WEBSITE_CONTENTAZUREFILECONNECTIONSTRING Azure 檔案儲存體 目前不支援基於身份的連線。 如果你的情境要求應用程式設定中不能儲存任何秘密,你必須移除應用程式對 Azure 檔案儲存體 的依賴。 你可以透過建立不依賴預設 Azure 檔案儲存體 的應用程式來避免這種依賴。
附註
你也應該考慮在 Flex Consumption 計畫中執行函式應用程式,這能提供對部署套件更強的控制,包括可以使用受管理身份連線的能力。 如需詳細資訊,請參閱設定部署設定。
若要在沒有 Azure 檔案儲存體 分享的情況下執行應用程式,您必須符合以下條件:
你必須將套件部署到不允許匿名存取的 Azure Blob 儲存體 容器,並將該套件的 Blob 儲存體 URL 設為
WEBSITE_RUN_FROM_PACKAGE應用程式設定。為避免在套件 URL 中儲存部署憑證,請 授予函式應用程式對該套件的管理身份存取權。 使用使用者指派的身分識別時,也請設定
WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID。 如果你無法使用管理身份,請使用共享存取簽章(SAS)網址,並在 SAS 到期前續約。若要從應用程式設定中移除預設主機儲存體帳戶的連接字串,請將
AzureWebJobsStorage設定為使用受控識別。你必須手動更新部署套件並維護部署套件的網址。 關於重新啟動應用程式及更新套件時同步觸發器的資訊,請參見 「從外部套件執行」網址。
您也應該注意下列考慮:
- 你的應用程式不能依賴共用的可寫檔案系統。
- 不支援入口網站編輯。
- 像 Azure 入口網站這類客戶端的日誌串流體驗預設會使用檔案系統日誌。 建議改為依賴 Application Insights 記錄。
如果上述需求符合你的情況,你可以繼續建立一個不含 Azure 檔案儲存體 的功能應用程式。 建立一個沒有WEBSITE_CONTENTAZUREFILECONNECTIONSTRING和WEBSITE_CONTENTSHARE應用程式設定的應用程式,方法如下:
- Bicep/ARM 範本:從 ARM 範本或 Bicep 檔案中移除兩個應用程式設定,然後使用修改過的範本部署應用程式。
- Azure 入口網站:在 Azure 入口網站中建立應用程式時,請在儲存體索引標籤中清除 新增 Azure 檔案儲存體 連線。
Azure 檔案儲存體 用於啟用 Functions 的動態擴展功能。 當你在 Windows 上以不使用 Azure 檔案儲存體 的方式,於 Elastic Premium 方案和 Consumption 方案中運行應用程式時,擴展可能會受到限制。
Flex Consumption 並不依賴於 Azure 檔案儲存體 的內容分享。 它使用可配置的 Blob 部署儲存空間,並支援管理身份連線。 如需詳細資訊,請參閱設定部署設定。
專用方案應用程式沒有本節所述的預設 Azure 檔案儲存體 內容共享依賴。
Azure 容器應用程式 上的函數沒有本節所述的預設 Azure 檔案儲存體 內容共享依賴關係。
掛接檔案共用
此功能僅在 Linux 上運行時可用。
你可以將 Azure 檔案儲存體 分享掛載到 Linux 函式應用程式,利用這些應用程式存取現有檔案、機器學習模型或函式中的大型二進位檔。 關於選擇儲存掛載、綁定與外部資料庫的概念性指引,請參閱 選擇適用於 Azure Functions 的檔案存取策略。
Flex Consumption 僅支援伺服器訊息區塊通訊協定(SMB)的 Azure 檔案儲存體 掛接。
請使用以下指令將現有的分享掛載到你的 Linux 函式應用程式。
az webapp config storage-account add
在此指令中,share-name 是現有Azure 檔案儲存體份額的名稱。
custom-id 可以是掛接至函式應用程式時唯一定義共用的任何字串。 此外,mount-path 是在函數應用程式中存取共用的路徑。
mount-path 的格式必須是 /dir-name,而且開頭不可為 /home。
完整範例請參見 建立一個Python函式應用程式並掛載Azure 檔案儲存體共享。
對於 Functions on Azure 容器應用程式,請在容器應用程式上設定 Azure 檔案儲存體 磁碟區。 更多資訊請參見在 Azure 容器應用中使用儲存裝載。
Consumption 方案不支援儲存支架。
重要事項
在 Linux 上使用 Consumption 計劃且仍使用已到期的 v3 執行階段 的函式應用程式,在 2026 年 9 月 30 日後將停止運行。 為避免服務中斷,請將 應用程式遷移到 v4 執行環境。
在 Linux 上以 Consumption 方案託管功能應用程式的選項將於 2028 年 9 月 30 日終止。 Linux 消費方案沒有新增功能或 語言版本。 在 Windows 上運行的 Consumption 方案應用程式目前不受影響。 在退休日前將應用程式遷移到 Flex Consumption 計畫。