將使用 Amazon Web Services (AWS) Lambda 的無伺服器工作負載移轉至 Azure Functions 需要仔細規劃和實作。 本文提供可協助您的基本指引:
- 在現有的工作負載上執行探索程序。
- 瞭解如何執行重要的移轉活動,例如預先移轉規劃和工作負載評估。
- 評估並優化已移轉的工作負載。
Scope
本文說明如何將 AWS Lambda 實例移轉至 Azure Functions。
本文未涉及:
- 移轉至您自己的容器裝載解決方案,例如透過 Azure Container Apps。
- 在 Azure 中裝載 AWS Lambda 容器。
- 貴組織的基本 Azure 採用方法,例如 Azure 登陸區域 或雲端採用架構移轉 方法中解決的其他主題。
移轉自訂聊天模式
為了讓您更輕鬆地使用 Visual Studio Code 將 AWS Lambda 應用程式移轉至 Azure,Azure Functions 在 GitHub Copilot 中提供 自訂聊天模式 。 使用下列步驟,將自訂聊天模式新增至 LambdaToFunctionMigration Visual Studio Code 中的專案:
如果您還沒有適用於 Azure Visual Studio Code 的 GitHub Copilot 延伸模組,請立即安裝。
在 Visual Studio Code 中開啟 Lambda 專案作為工作區。
在 GitHub Copilot 的 代理程式 模式中執行此提示:
Help me migrate my Lambda app to Azure當通知區域出現提示時,選取 安裝 以 將自訂聊天模式新增至
LambdaToFunctionMigration您的專案。
您現在可以針對移轉的每個階段使用此自訂聊天中定義的引導式提示。 開始在聊天中輸入 /LambdaMigration 以查看可用命令的完整清單。
比較功能
本文會將 AWS Lambda 功能對應至 Azure Functions 對等專案,以協助確保相容性。
這很重要
您可以選擇在移轉計劃中納入優化,但Microsoft建議進行雙步驟程式。 先移轉「類似」的功能,然後在 Azure 上評估優化機會。
優化工作應該是連續的,並透過工作負載小組的變更控制程序執行。 在移轉期間新增更多功能的移轉會產生風險,並會不必要地延長程序。
工作負載檢視方塊
本文著重於如何將 AWS Lambda 工作負載移轉至 Azure Functions,以及無伺服器工作負載的常見相依性。 此程式可能涉及數個服務,因為工作負載包含許多資源與程式來管理這些資源。 若要有完整的策略,您必須將本文中提供的建議與包含工作負載中其他元件和程式的大型方案結合。
在現有的工作負載上執行探索程序
第一個步驟是執行詳細的探索程式,以評估您現有的 AWS Lambda 工作負載。 目標是要瞭解工作負載所依賴的 AWS 功能與服務。 使用服務專屬的 SDK、API、CloudTrail 和 AWS CLI 等 AWS 工具,編譯您 AWS Lambda 函式的完整清單,並評估 AWS 上的工作負載。 您應該瞭解 AWS Lambda 清查的下列重要層面:
- 使用案例
- 組態
- 安全性和網路設定
- 工具、監視、記錄和可觀察性機制
- 依賴
- 可靠性目標和目前的可靠性狀態
- 擁有權成本
- 效能目標和目前的效能
小提示
使用此自訂聊天模式提示,為您的 AWS Lambda 設定產生評估報告:
/LambdaMigration-Phase1-AssessLambdaProject
執行預先移轉規劃
開始移轉工作負載之前,您必須將 AWS Lambda 功能對應至 Azure Functions,以確保相容性並開發移轉計劃。 然後,您可以選取重要工作負載,以取得概念證明。
您也需要將 Lambda 相依的 AWS 服務對應至 Azure 中的對等相依性。
將 AWS Lambda 功能對應至 Azure Functions
下表比較 AWS Lambda 的概念、資源和屬性與它們在 Azure Functions 上的相應等值,特別是在 Flex Consumption 主控方案中。
- 支援的語言
- 程序設計模型
- 事件觸發程式和系結
- 許可
- 函式 URL
- 網路
- 可檢視性和監視
- 調整和并行
- 冷啟動保護
- 定價
- 原始程式碼記憶體
- 本機開發
- 部署
- 逾時和記憶體限制
- 祕密管理
- 狀態管理
- 具狀態協調流程
- 其他差異和考慮
支援的語言
| 程式設計語言 | AWS Lambda 支援的版本 | Azure Functions 支援的版本 |
|---|---|---|
| Node.js | 20、22 | 20、22 |
| Python | 3.9, 3.10, 3.11, 3.12, 3.13 | 3.9, 3.10, 3.11, 3.12, 3.13 |
| JAVA | 8, 11, 17, 21 | 8, 11, 17, 21 |
| PowerShell | 不支援 | 7.4 |
| .NET | .NET 8 | .NET 8、.NET 9、.NET Framework 4.8.1 |
| Ruby | 3.2, 3.3 | 自訂處理程式 |
| Go | 僅有操作系統的執行環境 | 自訂處理程式 |
| Rust | 僅有操作系統的執行環境 | 自訂處理程式 |
程式設計模型
| 特徵 / 功能 | AWS Lambda | Azure Functions |
|---|---|---|
| 觸發器 | 透過事件來源與其他 AWS 服務整合。 提供自動和程序設計的方式,以連結 Lambda 函式與事件來源。 | 根據特定事件觸發函式,例如資料庫中的更新或佇列中的新訊息。 例如,Azure Cosmos DB 觸發程式可讓函式自動回應 Azure Cosmos DB 容器中的插入和更新。 此動作可即時處理數據變更。 Functions 也會與 Azure 事件方格整合,因此它可以處理來自 Azure 服務的事件,例如 Azure 記憶體和 Azure 媒體服務,以及外部事件來源。 Event Grid 作為集中式、可擴展的事件路由服務,補充了 Functions 觸發器,並實現高延展性和廣泛的事件來源涵蓋。 |
| 繫結 | 沒有繫結。 使用 Lambda 函式內的 AWS SDK,手動管理與其他 AWS 服務的互動。 | 設定為輸入或輸出的繫結啟用了至服務的宣告式連線,從而最小化對明確 SDK 程式碼的需求。 例如,您可以設定系結以從 Blob 記憶體讀取、寫入 Azure Cosmos DB,或透過 SendGrid 傳送電子郵件,而不需手動管理整合。 |
事件觸發和綁定
| AWS Lambda 觸發程式或服務 | Azure Functions 觸發程序 (機器翻譯) | 說明 |
|---|---|---|
| API 閘道:HTTP 要求 | HTTP 觸發程序 | 這些觸發程式可讓您直接處理 HTTP 要求。 |
| 簡易佇列服務 (SQS) | Azure 佇列記憶體觸發程式 或 Azure 服務總線觸發程式 | 這些觸發程式可以處理佇列中的訊息。 |
| 簡單通知服務 (SNS) | 事件方格觸發程序或服務匯流排觸發程序 | 這些觸發條件會啟用通知處理。 |
| Kinesis (數據流) | 事件中樞觸發程序 | 這些觸發程式會取用數據流。 |
| DynamoDB (資料表變更) | Azure Cosmos DB 變更摘要觸發程序 | 這些觸發程式會監聽數據表中的變更。 |
| CloudWatch Events 或 EventBridge Scheduler | 定時器觸發 | 這些觸發程式會處理排程或以時間為基礎的函式。 |
| S3 (物件事件) | Blob 儲存體觸發程序 | 這些觸發程式會回應 Blob 記憶體中的事件。 |
| Amazon Relational Database Service (RDS) | Azure SQL 觸發程式 | 這些觸發程式會回應資料庫變更。 |
| Apache Kafka 的受控串流 (MSK) | Apache Kafka 觸發程序 | 這些觸發程式會回應 Kafka 主題訊息。 |
| Amazon ElastiCache(亞馬遜彈性緩存服務) | Azure Redis 觸發器 | 這些觸發程式會回應 Redis 中的訊息。 |
| 亞馬遜MQ | RabbitMQ 觸發器 | 這些觸發程式會回應 RabbitMQ 中的訊息。 |
權限
| AWS Lambda | Azure Functions |
|---|---|
| Lambda 執行角色會授與 Lambda 函式許可權,以與其他 AWS 服務互動。 每個 Lambda 函式都有相關聯的身分識別和存取管理 (IAM) 角色,可在執行時判斷其許可權。 | 受控識別會提供函式應用程式的身分識別,以允許它與其他 Azure 服務進行驗證,而不需將認證儲存在程式碼中。 角色型訪問控制會將適當的角色指派給 Microsoft Entra ID 中的受控識別,以授與其所需資源的存取權。 |
| 以資源為基礎的政策聲明: - AWSLambda_FullAccess提供所有 Lambda 作業的完整存取權,包括建立、更新和刪除函式。 - AWSLambda_ReadOnlyAccess提供唯讀存取權,以檢視 Lambda 函式及其設定。 - 自定義 IAM 原則。 |
以資源為基礎的內建角色: - 擁有者角色提供完整存取權,包括訪問許可權管理。 - 參與者角色可以建立和刪除函式應用程式、設定設定及部署程序代碼。 它無法管理存取權。 - 監視讀取者角色可以授與監視數據和設定的唯讀存取權。 它也可以配置自定義角色。 |
函式 URL
| AWS Lambda | Azure Functions |
|---|---|
https://<url-id>.lambda-url.<region>.on.aws |
-
<appname>.azurewebsites.net (原始的全域預設主機名) - <appname>-<randomhash>.<Region>.azurewebsites.net (新增,唯一的預設主機名) |
網路
| AWS Lambda | Azure Functions |
|---|---|
| 所有 Lambda 函式都會安全地在由系統預設管理的虛擬私有雲 (VPC) 中執行。 您也可以設定 Lambda 函式,以存取自訂 VPC 中的資源。 | 函式應用程式可以受到網路保護,而且可以存取網路內的其他服務。 入站網路存取只能僅限於防火牆的 IP 位址清單,並透過服務端點或私人端點限制至特定虛擬網路。 輸出網路存取是透過虛擬網路整合功能啟用。 函式應用程式可以將其所有流量限制在虛擬網路的子網,也可以存取該虛擬網路內的其他服務。 |
可檢視性和監視
| AWS Lambda | Azure Functions |
|---|---|
| Amazon CloudWatch 藉由收集和追蹤計量、匯總和分析記錄、設定警示、建立自定義儀錶板,以及實作對資源效能和計量變更的自動化回應,藉此協助監視和可觀察性。 | Azure 監視器提供 Azure Functions 的完整監視和可觀察性,特別是透過其 Application Insights 功能。 Application Insights 會收集遙測數據,例如要求速率、回應時間和失敗率。 它會將應用程式元件關聯性可視化、監視即時效能、記錄詳細的診斷,並允許自定義計量追蹤。 這些功能有助於維護 Azure Functions 的效能、可用性和可靠性,同時啟用自定義儀錶板、警示和自動化回應。 |
| AWS Lambda 會從函式調用產生遙測數據,而且可以使用 OpenTelemetry 語意導出此數據。 您可以設定 Lambda 函式,將此遙測數據傳送至任何符合 OpenTelemetry 規範的端點。 此動作允許追蹤和記錄相互關聯、一致的標準型遙測資料,以及與其他支援 OpenTelemetry 的可檢視性工具整合。 | 設定應用程式,以 OpenTelemetry 格式匯出記錄和追蹤數據。 您可以使用 OpenTelemetry,將遙測數據匯出至任何相容的端點。 OpenTelemetry 提供優點,例如追蹤和記錄的相互關聯、以標準為基礎的遙測數據,以及與其他提供者的整合。 您可以在主機組態和程式代碼專案中的函式應用層級啟用 OpenTelemetry,以優化函式程式碼的數據匯出。 如需詳細資訊,請參閱 使用 OpenTelemetry 搭配 Azure Functions。 |
調整和並行
| AWS Lambda | Azure Functions |
|---|---|
| AWS 使用隨選縮放模型。 自動調整功能運作以回應需求。 並行性或由實例處理的請求數量始終為 1。 | 實例會根據每個實例的傳入事件數目和已設定的並行性,動態新增和移除實例。 您可以將並行 設定 設定為所需的值。 |
| 並行一律為 1。 | 並行是可設定的 (>1)。 |
| 支持縮放至 0。 | 支持縮放至 0。 |
冷啟動保護
| AWS Lambda | Azure Functions |
|---|---|
| 布建的並行存取可減少延遲,並藉由預先初始化要求的函式實例數目,確保可預測的函式效能。 已佈建並行適用於延遲敏感性應用程式,且價格與標準並行不同。 | 函式應用程式可讓您為每個實例設定並行,以驅動其規模。 多個作業可以在應用程式的相同實例中平行執行,而實例中的後續作業不會產生初始冷啟動。 函式應用程式也有 隨時就緒 的實例。 客戶可以指定一些預先設定的實例,以消除冷啟動延遲,並確保一致的效能。 函式應用程式也會根據需求擴增至更多執行個體,同時維護始終就緒的執行個體。 |
| 保留並行指定函式可以擁有的最大並行實例數目。 此限制可確保您帳戶的一部分並行配額專爲該函式設定為稍後瀏覽。 AWS Lambda 即使在設定保留並行的情況下,仍會動態擴展以處理連入的請求,只要這些請求不超過指定的保留並行限制。 AWS Lambda 中保留並行存取的下限為 1。 AWS Lambda 中保留並行的上限取決於帳戶的區域並行配額。 預設情況下,此限制是每個區域的 1,000 個並行作業。 | Azure Functions 沒有類似於「預留併發」的功能。 若要達到類似的功能,請將特定函式隔離成個別的函式應用程式,併為每個應用程式設定最大向外延展限制。 Azure Functions 會動態擴增或新增更多執行個體,並在擴增限制集內縮減或移除執行個體。 根據預設,在 Flex Consumption 方案中執行的應用程式會從可設定的 100 個整體實例限制開始。 最低實例計數值為 40,且支援的最大實例計數值為 1,000。 區域訂用帳戶記憶體配額也可限制函數應用程式的擴增能力,但您可以藉由呼叫支援來增加此配額。 |
定價
| AWS Lambda | Azure Functions |
|---|---|
| - 依使用次數支付總叫用計數和每個執行個體的 GB/s(固定並行為 1) - 1 毫秒增量 - 400,000 Gbps 免費層 |
- 依使用次數支付總叫用計數和每個執行個體的 GB/s(具有可設定的並行叫用) - 100 毫秒增量 - 100,000 Gbps 免費層 - 以耗用量為基礎的成本 |
原始程式碼記憶體
| AWS Lambda | Azure Functions |
|---|---|
| AWS Lambda 會在自己的受控記憶體系統中管理函式程式碼的記憶體。 您不需要提供更多的記憶體。 | Functions 需要客戶提供的 Blob 記憶體容器,才能維護包含您應用程式程式代碼的部署套件。 您可以將設定為使用相同或不同的記憶體帳戶進行部署,以及管理用來存取容器的驗證方法。 |
本地開發
| AWS Lambda 功能 | Azure Functions 功能 |
|---|---|
| - SAM CLI - 本地堆疊 |
- Azure Functions Core Tools - Visual Studio 程式碼 - 視覺工作室 - GitHub 程式碼空間 - VSCode.dev - 專家 - 在本機撰寫及測試 Azure Functions 的程式代碼 |
部署
| 特徵 / 功能 | AWS Lambda | Azure Functions |
|---|---|---|
| 部署套件 | - ZIP 檔案 - 容器映像 |
ZIP 檔案(針對容器映像檔部署,請使用專用或進階 SKU。) |
| ZIP 檔案大小(主控台) | 最大 50 MB | ZIP 部署的上限為 500 MB |
| ZIP 檔案大小 (CLI/SDK) | ZIP 部署的上限為 250 MB,解壓縮的上限為 500 MB | ZIP 部署的上限為 500 MB |
| 容器映像大小 | 最大 10 GB | 透過 Azure 提供彈性儲存的容器支援 |
| 大型成品處理 | 針對較大的部署使用容器映像。 | 連接 Blob 儲存體或 Azure 檔案共享,以從應用程式存取大型檔案。 |
| 將一般相依性封裝至函式中 | 層次 | 部署 .Zip,隨選從儲存體或容器(ACA、專用、僅 EP SKU)部署 |
| 藍綠部署或函式版本控制 | 使用函式限定符來參考函式的特定狀態,方法是使用版本號碼或別名名稱。 限定符可啟用版本管理和漸進式部署策略。 | 使用持續整合和持續傳遞系統進行藍綠部署。 |
逾時和記憶體限制
| 特徵 / 功能 | AWS Lambda 限制 | Azure Functions 限制 |
|---|---|---|
| 執行逾時 | 900 秒 (15 分鐘) | 默認逾時為 30 分鐘。 最大逾時為無限制。 不過,在縮減期間提供給函式執行的寬限期為 60 分鐘,在平台更新期間則為 10分鐘。 如需詳細資訊,請參閱 函式應用程式逾時持續時間。 |
| 可設定的記憶體 | 128 MB 到 10,240 MB,每次增加 64 MB | 函式支援 2 GB 和 4 GB 實例大小。 指定訂用帳戶中的每個區域,所有應用程式實例的記憶體限制為512,000 MB,您可以藉由呼叫支援來增加。 區域內所有函式應用程式之所有實例的總記憶體使用量必須保持在此配額內。 雖然 2 GB 和 4 GB 是實例大小選項,但每個實例的並行可能會高於 1。 因此,根據組態,單一實例可以處理多個並行執行。 適當地設定並行,有助於優化資源使用量和管理效能。 藉由平衡記憶體配置和並行設定,您可以有效地管理配置給函式應用程式的資源,並確保有效率的效能和成本控制。 如需詳細資訊,請參閱 區域訂用帳戶記憶體配額。 |
秘密管理
| AWS Lambda | Azure Functions |
|---|---|
| AWS 秘密管理員可讓您儲存、管理及擷取秘密,例如資料庫認證、API 密鑰和其他敏感性資訊。 Lambda 函式可以使用 AWS SDK 來擷取秘密。 | 建議您使用受控識別之類的無秘密方法,在不需硬式編碼認證的情況下,安全地存取 Azure 資源。 需要秘密,例如合作夥伴或舊版系統時,Azure Key Vault 提供安全的解決方案來儲存和管理秘密、密鑰和憑證。 |
| AWS Systems Manager 參數存放區是儲存組態數據和秘密的服務。 您可以使用 AWS KMS 來加密參數,並使用 AWS SDK 來擷取 Lambda 函式。 Lambda 函式可以將組態設定儲存在環境變數中。 敏感數據可以使用 KMS 金鑰加密,以安全存取。 |
Azure Functions 會使用應用程式設定來儲存組態數據。 這些設定會直接對應至環境變數,以方便函式內使用。 這些設定可以加密並安全地儲存在 Azure App Service 組態中。 針對更進階的案例,Azure 應用程式組態提供強大的功能來管理多個組態。 它可啟用功能標幟,並支援跨服務進行動態更新。 |
狀態管理
| AWS Lambda | Azure Functions |
|---|---|
| AWS Lambda 透過使用 Amazon S3 類似的服務來處理物件存儲、以 DynamoDB 處理快速且可擴展的 NoSQL 狀態存儲,以及以 SQS 處理消息佇列,來管理簡單的狀態管理。 這些服務可確保 Lambda 函式執行的數據持續性和一致性。 | Azure Functions 使用 AzureWebJobsStorage,透過 Azure 儲存體服務,如 Blob 儲存體、佇列儲存體和資料表儲存體,來啟用繫結和觸發器以管理狀態。 它可讓函式輕鬆讀取和寫入狀態。 如需更複雜的狀態管理,Durable Functions 會使用 Azure 記憶體提供進階工作流程協調流程和狀態持續性功能。 |
具狀態協調流程
| AWS Lambda | Azure Functions |
|---|---|
| 沒有原生狀態協調流程。 針對工作流程使用 AWS 步驟函式。 | Durable Functions 透過提供長期工作流程協調流程和具狀態實體來協助進行複雜的狀態管理。 它支援長時間執行的作業、自動檢查點和可靠的狀態持續性。 這些功能可建置複雜的工作流程,以確保具狀態應用程式的容錯和延展性。 |
其他差異和考慮
| 特徵 / 功能 | AWS Lambda | Azure Functions |
|---|---|---|
| Grouping 函式 | 每個 AWS Lambda 函式都是獨立的實體。 | 函式應用程式可作為多個函式的容器。 它提供其包含之函式的共用執行內容和組態。 將多個函式視為單一實體可簡化部署和管理。 Functions 還使用每個函式縮放原則,其中每個函式都是獨立縮放的,HTTP、Blob 儲存體和 Durable Functions 觸發器除外。 這些已觸發函式在其自己的群組中縮減。 |
| 自訂網域 | 透過 API 閘道啟用 | 您可以直接在函式應用程式或 Azure API 管理上設定 自訂網域 。 |
| 自訂容器支援 | 透過 Lambda 容器映像支援自定義容器 | Azure Functions 支援 在 Container Apps 環境中執行的自定義容器。 |
建立移轉計劃
選取重要工作負載以取得概念證明。
首先,從您的總庫存中選取一到兩個非關鍵中型工作負載。 這些工作負載是概念證明移轉的基礎。 您可以測試程式並找出潛在的挑戰,而不會造成作業的重大中斷風險。
反覆測試並收集意見反應。
小提示
使用此自訂聊天模式提示,隨時檢查移轉程式的目前狀態:
/LambdaMigration-GetStatus使用概念驗證來收集意見反饋、找出差距,並微調流程,再調整至更大的工作負載。 此反覆方法可確保在您移至完整規模移轉時,解決潛在挑戰並精簡程式。
建置移轉資產
此步驟是過渡式開發階段。 在此階段中,您會建置原始程式碼、基礎結構即程序代碼 (IaC) 範本,以及部署管線來代表 Azure 中的工作負載。 您必須先調整函式程序代碼以符合相容性和最佳做法,才能執行移轉。
-
調整函式程式碼、設定檔案和基礎結構即程式碼檔案
小提示
使用此自訂聊天模式提示來啟動程式碼移轉程式:
/LambdaMigration-Phase2-MigrateLambdaCode - 調整組態設定
- 產生 IaC 檔案
- 使用工具來重構
調整函式程式碼、組態檔和基礎結構即程式碼檔案
若要更新 Azure Functions 執行時間需求的程式代碼:
修改您的程序代碼以遵守 Azure Functions 程式設計模型。 例如,調整您的函式簽章,以符合 Azure Functions 所需的格式。 如需函式定義和執行內容的詳細資訊,請參閱 Azure Functions 開發人員指南。
使用 Azure Functions 擴充功能套件組合 來處理與 AWS 服務類似的各種系結和觸發程式。 針對 .NET 應用程式,您應該使用適當的 NuGet 套件,而不是延伸模組套件組合。
使用擴充功能套件組合來與其他 Azure 服務整合,例如 Azure 記憶體、Azure 服務總線和 Azure Cosmos DB,而不需要透過 SDK 手動設定每個系結。 如需詳細資訊,請參閱 使用系結將函式連線到 Azure 服務 及 Azure Functions 系結運算式模式。
這些程式碼片段是常見 SDK 程式碼的範例。 AWS Lambda 程式碼會映射至 Azure Functions 中的對應觸發程式、綁定或 SDK 程式碼片段。
從 Amazon S3 與 Azure Blob 儲存體讀取
AWS Lambda 程序代碼 (SDK)
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event) => {
const params = {
Bucket: 'my-bucket',
Key: 'my-object.txt',
};
const data = await
s3.getObject(params).promise();
console.log('File content:',
data.Body.toString());
};
Azure Functions 程式碼(觸發程式)
import { app } from '@azure/functions';
app.storageblob('blobTrigger', {
path: 'my-container/{blobName}',
connection: 'AzureWebJobsStorage',
}, async (context, myBlob) => {
context.log(`Blob content:
${myBlob.toString()}`);
});
寫入 Amazon 簡單佇列服務 (SQS) 與 Azure 佇列儲存體
AWS Lambda 程序代碼 (SDK)
const AWS = require('aws-sdk');
const sqs = new AWS.SQS();
exports.handler = async (event) => {
const params = {
QueueUrl:
'https://sqs.amazonaws.com/123456789012/MyQueue',
MessageBody: 'Hello, world!',
};
await
sqs.sendMessage(params).promise();
};
Azure Functions 程式碼(觸發程式)
import { app } from '@azure/functions';
app.queue('queueTrigger', {
queueName: 'myqueue-items',
connection: 'AzureWebJobsStorage',
}, async (context, queueMessage) => {
context.log(`Queue message:
${queueMessage}`);
});
寫入 DynamoDB 與 Azure Cosmos DB
AWS Lambda 程序代碼 (SDK)
const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();
exports.handler = async (event) => {
const params = {
TableName: 'my-table',
Key: { id: '123' },
};
const data = await dynamoDb.get(params).promise();
console.log('DynamoDB record:', data.Item);
};
Azure Functions 程式碼(觸發程式)
import { app } from '@azure/functions';
app.cosmosDB('cosmosTrigger', {
connectionStringSetting: 'CosmosDBConnection',
databaseName: 'my-database',
containerName: 'my-container',
leaseContainerName: 'leases',
}, async (context, documents) => {
documents.forEach(doc => {
context.log(`Cosmos DB document: ${JSON.stringify(doc)}`);
});
});
Amazon CloudWatch 事件與 Azure 計時器觸發程序
AWS Lambda 程序代碼 (SDK)
exports.handler = async (event) => {
console.log('Scheduled event:', event);
};
Azure Functions 程式碼(觸發程式)
import { app } from '@azure/functions';
app.timer('timerTrigger', { schedule: '0 */5 * * * *', // Runs every 5 minutes }, async (context, myTimer) => { if (myTimer.isPastDue) { context.log('Timer is running late!'); } context.log(Timer function executed at: ${new Date().toISOString()}); });
Amazon Simple Notification Service (SNS) 與 Azure 事件方格觸發程式
AWS Lambda 程序代碼 (SDK)
const AWS = require('aws-sdk');
const sns = new AWS.SNS();
exports.handler = async (event) => {
const params = {
Message: 'Hello, Event Grid!',
TopicArn: 'arn:aws:sns:us-east-1:123456789012:MyTopic',
};
await sns.publish(params).promise();
};
Azure Functions 程式碼(觸發程式)
import { app } from '@azure/functions';
app.eventGrid('eventGridTrigger', {},
async (context, eventGridEvent) => {
context.log(`Event Grid event:
${JSON.stringify(eventGridEvent)}`);
});
Amazon Kinesis 與 Azure 事件中樞觸發程序
AWS Lambda 程序代碼 (SDK)
const AWS = require('aws-sdk');
const kinesis = new AWS.Kinesis();
exports.handler = async (event) => {
const records =
event.Records.map(record =>
Buffer.from(record.kinesis.data,
'base64').toString());
console.log('Kinesis records:', records);
};
Azure Functions 程式碼(觸發程式)
import { app } from '@azure/functions';
app.eventHub('eventHubTrigger', {
connection: 'EventHubConnection',
eventHubName: 'my-event-hub',
}, async (context, eventHubMessages) =>
{
eventHubMessages.forEach(message =>
{
context.log(`Event Hub message:
${message}`);
});
});
請參閱下列 GitHub 存放庫,以比較 AWS Lambda 程式代碼和 Azure Functions 程式代碼:
- AWS Lambda 程式代碼
- Azure Functions 程式代碼
- Azure 範例存放庫,其中包含 Azure Functions 的入門、IaC 和端對端範例
調整組態設定
請確定函式的逾時和 記憶體 設定與 Azure Functions 相容。 如需可配置設定的詳細資訊,請參閱 Azure 功能host.json 參考。
請遵循許可權、存取、網路和部署設定的建議最佳做法。
設定許可權
設定函式應用程式的權限時,請遵循最佳做法。 如需詳細資訊,請參閱 透過受管理的身分識別設定您的函式應用程式和儲存帳戶。
main.bicep
// User-assigned managed identity that the function app uses to reach Storage and Service Bus
module processorUserAssignedIdentity './core/identity/userAssignedIdentity.bicep' = {
name: 'processorUserAssignedIdentity'
scope: rg
params: {
location: location
tags: tags
identityName: !empty(processorUserAssignedIdentityName) ? processorUserAssignedIdentityName : '${abbrs.managedIdentityUserAssignedIdentities}processor-${resourceToken}'
}
}
如需詳細資訊,請參閱 rbac.bicep。
設定網路存取
Azure Functions 支援 虛擬網路整合,可讓您的函式應用程式存取虛擬網路中的資源。 整合之後,您的應用程式會透過虛擬網路路由傳送輸出流量。 然後您的應用程式可以使用只允許來自特定子網流量的規則來存取私人端點或資源。 如果目的地是虛擬網路外部的IP位址,除非您設定NAT閘道,否則來源IP位址是應用程式屬性中列出的其中一個位址。
當您啟用函式應用程式的 虛擬網路整合 時,請遵循 TSG 中的最佳做法進行 Web 應用程式和函式應用程式的虛擬網路整合。
main.bicep
// Virtual network and private endpoint
module serviceVirtualNetwork 'app/vnet.bicep' = {
name: 'serviceVirtualNetwork'
scope: rg
params: {
location: location
tags: tags
vNetName: !empty(vNetName) ? vNetName : '${abbrs.networkVirtualNetworks}${resourceToken}'
}
}
module servicePrivateEndpoint 'app/storage-PrivateEndpoint.bicep' = {
name: 'servicePrivateEndpoint'
scope: rg
params: {
location: location
tags: tags
virtualNetworkName: !empty(vNetName) ? vNetName : '${abbrs.networkVirtualNetworks}${resourceToken}'
subnetName: serviceVirtualNetwork.outputs.peSubnetName
resourceName: storage.outputs.name
}
}
如需詳細資訊,請參閱 VNet.bicep 和 storage-PrivateEndpoint.bicep。
設定部署設定
部署會遵循單一路徑。 建置項目程式代碼並將它壓縮到應用程式套件之後,請將它部署至 Blob 記憶體容器。 啟動時,您的應用程式會取得套件,並從中執行函式程序代碼。 根據預設,儲存內部主機元數據的相同記憶體帳戶,例如 AzureWebJobsStorage,也會做為部署容器。 不過,您可以使用替代記憶體帳戶,或藉由設定應用程式的部署設定來選擇您慣用的驗證方法。 如需詳細資訊,請參閱部署技術詳細數據和設定部署設定。
產生 IaC 檔案
使用 Bicep、Azure Resource Manager 範本或 Terraform 等工具來建立 IaC 檔案來部署 Azure 資源。
小提示
使用此自訂聊天模式提示來產生 Azure Functions 的基礎結構即程式碼 (IaC) 檔案:
/LambdaMigration-Phase3-GenerateFunctionsInfra定義 IaC 檔案中的 Azure Functions、記憶體帳戶和網路元件等資源。
使用此 IaC 範例存放庫 來取得使用 Azure Functions 建議和最佳做法的範例。
使用工具進行重構
在 VS Code 中使用 GitHub Copilot 之類的工具,協助進行程式碼重構、針對特定變更手動重構,或其他移轉輔助工具。
備註
在 VS Code 中使用 GitHub Copilot 中的 Agent 模式 。
下列文章提供可協助移轉程式的特定範例和詳細步驟:
- 適用於 AWS 專業人員的 Azure
- 使用 Core Tools 在本機開發 Azure Functions
開發準備移轉的逐步程序
開發移轉的容錯移轉和容錯回復策略,並在生產前環境中徹底測試它們。 建議您先執行端對端測試,再最後從 AWS Lambda 轉換至 Azure Functions。
確認功能的可行性
徹底測試每個函式,以確保其如預期般運作。 這些測試應包含輸入/輸出、事件觸發程式和系結驗證。
小提示
使用此自訂聊天模式提示來驗證已移轉的 Azure Functions 程式碼:
/LambdaMigration-Phase4-ValidateCode在 VS Code 上使用 curl 或 REST 用戶端 擴充功能之類的工具,傳送 HTTP 觸發函式的 HTTP 要求。
對於其他觸發條件,例如定時器或佇列,請確定觸發條件會正確觸發,且函式會如預期般執行。
驗證效能
進行效能測試,以比較新的 Azure Functions 部署與先前的 AWS Lambda 部署。
監視計量,例如響應時間、運行時間和資源耗用量。
小提示
使用此自訂聊天模式提示來驗證基礎結構設定:
/LambdaMigration-Phase5-ValidateInfra在測試階段使用Application Insights進行 監視、記錄分析和疑難解答 。
使用診斷和解決問題功能進行疑難排解
使用 Azure 入口網站中的 診斷和解決問題 功能,對函式應用程式進行疑難解答。 此工具提供一組診斷功能,可協助您快速識別並解決常見問題,例如應用程式當機、效能降低和設定問題。 請遵循工具提供的引導式疑難解答步驟和建議,以解決您識別的問題。
評估已移轉工作負載的結束狀態
在 AWS 中解除委任資源之前,您必須確定平臺符合目前的工作負載預期,且不會阻止工作負載維護或進一步開發。
部署和測試函式,以驗證其效能和正確性。
部署至 Azure
小提示
使用此自訂聊天模式提示,將已驗證的專案部署至 Azure:
/LambdaMigration-Phase6-DeployToAzure
使用 VS Code 發佈功能部署工作負載。 您也可以使用 Azure Functions Core Tools 或 Azure CLI,從命令行部署工作負載。 Azure DevOps 和 GitHub Actions 也會使用 One Deploy。
Azure Functions Core Tools:使用 Azure Functions Core Tools 搭配 命令
func azure functionapp publish <FunctionAppName>。持續整合和持續部署 (CI/CD) 管線:使用 GitHub Actions、Azure DevOps 或其他 CI/CD 工具等服務來設定 CI/CD 管線。
如需詳細資訊,請參閱 使用 GitHub Actions 或透過 Azure Pipelines 持續傳遞。
探索範例移轉案例
使用 MigrationGetStarted 存放庫 作為範本,開始概念證明。 此存放庫包含現成部署的 Azure Functions 專案,其具有基礎結構和原始程式碼檔案,可協助您開始使用。
如果您想要使用 Terraform,請改用 MigrationGetStarted-Terraform 。
在 Azure 上優化和監視應用程式的效能
移轉工作負載之後,建議您探索 Azure 上的更多功能。 這些功能可協助您滿足未來的工作負載需求,並協助縮小差距。
使用 Application Insights 進行監視和疑難解答
為您的函式應用程式啟用 Application Insights ,以收集詳細的遙測數據,以進行監視和疑難解答。 您可以透過 Azure 入口網站或函式應用程式的 host.json 組態檔啟用 Application Insights。 啟用 Application Insights 之後,您可以:
收集遙測數據。 Application Insights 提供各種遙測數據,例如要求記錄、效能計量、例外狀況和相依性。
分析記錄和計量。 從 Azure 入口網站存取 Application Insights 儀錶板,以可視化及分析記錄、計量和其他遙測數據。 使用內建工具來建立自定義查詢,並將數據可視化,以深入瞭解函式應用程式的效能和行為。
設定警示。 在 Application Insights 中設定警示,通知您重大問題、效能降低或特定事件。 這些警示可協助您主動監視並快速響應問題。
針對成本和效能進行優化
縮放和效能最佳化:
使用自動調整功能有效率地處理不同的工作負載。
將函式程式代碼優化,藉由減少運行時間、優化相依性,以及使用有效率的程式代碼作法來改善效能。
實作快取策略,以減少經常存取數據的重複處理和延遲。
成本管理:
使用 Microsoft成本管理工具 來監視和分析 Azure Functions 成本。
設定預算和成本警示,以有效地管理和預測費用。