

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 考慮無伺服器 .NET
<a name="net-serverless"></a>

## 概觀
<a name="net-serverless-overview"></a>

無伺服器運算已成為建置和部署應用程式的熱門方法。主要是因為無伺服器方法在建置現代架構時所提供的可擴展性和敏捷性。不過，在某些情況下，考慮無伺服器運算的成本影響非常重要。

Lambda 是一種無伺服器運算平台，可讓開發人員執行程式碼，而不需要專用伺服器。對於尋求降低基礎設施成本的 .NET 開發人員而言，Lambda 是特別有吸引力的選項。使用 Lambda，.NET 開發人員可以開發和部署具有高度可擴展性和潛在成本效益的應用程式。透過使用無伺服器方法，開發人員不再佈建伺服器來處理應用程式請求。反之，開發人員可以建立隨需執行的函數。這使得無伺服器方法比執行、管理和擴展虛擬機器更具可擴展性、可管理性，而且可能更具成本效益。因此，您只需支付應用程式使用的資源，而不必擔心資源使用率過低或伺服器維護成本。

開發人員可以使用現代的跨平台 .NET 版本來建置快速、有效率且符合成本效益的無伺服器應用程式。.NET Core 和更新版本是免費且開放原始碼的架構，較舊版 .NET Framework 更適合在無伺服器平台上執行。這可讓開發人員縮短開發時間並提高應用程式效能。現代 .NET 也支援多種程式設計語言，包括 C\# 和 F\#。因此，對於希望在雲端中建置現代架構的開發人員來說，這是一個吸引人的選項。

本節說明如何使用 Lambda 做為無伺服器選項來節省成本。您可以透過微調 Lambda 函數的執行設定檔、正確調整 Lambda 函數的記憶體配置大小、使用[原生 AOT](https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/?tabs=net7%2Cwindows)，以及移至以 Graviton 為基礎的函數，進一步最佳化成本。

## 成本影響
<a name="net-serverless-cost"></a>

您可以降低成本的程度取決於幾個因素，包括無伺服器函數除了配置的記憶體量和每個函數的持續時間之外，還會執行多少次執行。 AWS Lambda 提供免費方案，其中包括每月 100 萬個免費請求和每月 400，000 GB 的運算時間。您可以大幅降低這些免費方案限制內或前後工作負載的每月成本。

使用負載平衡器搭配 Lambda 函數做為目標時，也可能會產生額外費用。計算方式為負載平衡器針對 [Lambda 目標](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html)處理的資料量。

## 成本最佳化建議
<a name="net-serverless-rec"></a>

### 正確調整 Lambda 函數的大小
<a name="net-serverless-rec-rightsize-lambda"></a>

適當調整大小是 .NET 型 Lambda 函數中成本最佳化的基本實務。此程序涉及識別在效能與成本效益之間取得平衡的最佳記憶體組態，而不需要變更程式碼。

透過設定 Lambda 函數的記憶體，範圍從 128 MB 到 10，240 MB，您也可以調整調用期間可用的 vCPU 數量。這可讓記憶體或 CPU 繫結的應用程式在執行期間存取其他資源，進而降低調用持續時間和整體成本。

不過，識別以 .NET 為基礎的 Lambda 函數的最佳組態可以是手動且耗時的程序，特別是經常變更時。[AWS Lambda Power Tuning 工具](https://github.com/alexcasalboni/aws-lambda-power-tuning)可透過針對範例承載分析一組記憶體組態，協助您識別適當的組態。

例如，增加以 .NET 為基礎的 Lambda 函數的記憶體可以改善總叫用時間和降低成本，而不會影響效能。函數的最佳記憶體組態可能會有所不同。 AWS Lambda Power Tuning 工具可協助識別每個函數最具成本效益的組態。

在下列範例圖表中，總調用時間會隨著此 Lambda 函數的記憶體增加而改善。這會導致總執行的成本降低，而不會影響函數的原始效能。對於此函數，函數的最佳記憶體組態為 512 MB，因為這是資源使用率對於每次調用的總成本最有效率的地方。這因函數而異，在 Lambda 函數上使用 工具可以識別它們是否受益於正確的大小。



![調用時間圖表](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/optimize-costs-microsoft-workloads/images/graph_invocation_time.png)


我們建議您定期完成此練習，作為發行新更新時任何整合測試的一部分。如果不常更新，請定期執行此練習，以確保函數已調整且大小正確。識別 Lambda 函數的適當記憶體設定後，您可以為程序新增適當的大小。 AWS Lambda Power Tuning 工具會產生程式設計輸出，可供 CI/CD 工作流程在發行新程式碼時使用。這可讓您自動化記憶體組態。

您可以免費下載 [AWS Lambda Power Tuning 工具](https://github.com/alexcasalboni/aws-lambda-power-tuning)。如需如何使用工具的說明，請參閱[如何在 GitHub 中執行狀態機器](https://github.com/alexcasalboni/aws-lambda-power-tuning/blob/master/README-EXECUTE.md)。 GitHub

Lambda 也支援原生 AOT，這可讓 .NET 應用程式預先編譯。這可以透過減少 .NET 函數的執行時間來協助降低成本。如需建立原生 AOT 函數的詳細資訊，請參閱 Lambda 文件中的[具有原生 AOT 編譯的 .NET 函數](https://docs.aws.amazon.com/lambda/latest/dg/dotnet-native-aot.html)。

### 避免閒置等待時間
<a name="net-serverless-rec-rightsize-idle-time"></a>

Lambda 函數持續時間是用於計算帳單的一個維度。當函數程式碼發出封鎖呼叫時，您需支付等待接收回應的時間費用。當 Lambda 函數鏈結在一起，或函數充當其他函數的協調器時，此等待時間可能會增加。如果您有批次操作或訂單交付系統等工作流程，這會增加管理開銷。此外，可能無法在最長 15 分鐘的 Lambda 逾時內完成所有工作流程邏輯和錯誤處理。

建議您重新架構解決方案以[AWS Step Functions](https://aws.amazon.com/step-functions/)用作工作流程的協調器，而不是在函數程式碼中處理此邏輯。使用標準工作流程時，系統會針對工作流程中的每個[狀態](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-states.html)轉換向您收費，而非工作流程的總持續時間。此外，您可以將重試、等待條件、錯誤工作流程和[回呼](https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html#connect-wait-token)的支援移至 狀態條件，以允許 Lambda 函數專注於商業邏輯。如需詳細資訊，請參閱 AWS 運算部落格中的[最佳化 AWS Lambda 成本 – 第 2](https://aws.amazon.com/blogs/compute/optimizing-your-aws-lambda-costs-part-2/) 部分。

### 移至以 Graviton 為基礎的函數
<a name="net-serverless-rec-graviton-functions"></a>

採用新一代 Graviton2 處理器的 Lambda 函數現已正式推出。Graviton2 函數使用 ARM 型處理器架構，旨在以 20% 的成本為各種無伺服器工作負載提供高達 19% 的效能。採用 Graviton2 處理器的函數具有更低的延遲和更好的效能，非常適合為關鍵任務無伺服器應用程式提供支援。

對於希望最佳化其 Lambda 成本的 .NET 開發人員而言，遷移至 Graviton 型 Lambda 函數是經濟實惠的選項。Graviton 型函數使用 ARM 型處理器，而非傳統的 x86 處理器。這可以大幅節省成本，而不會犧牲效能。

雖然轉移到以 Graviton 為基礎的函數有幾個好處，但我們建議您考慮幾個挑戰和考量事項。例如，Graviton 型函數需要使用 Amazon Linux 2，這可能並非所有 .NET 應用程式都相容。此外，第三方程式庫或相依性可能有與 ARM 型處理器不相容的相容性問題。

如果您正在執行 .NET Framework 應用程式，並想要利用無伺服器搭配 Lambda，您可以考慮使用適用於 .NET [的移植助理，將應用程式移植到現代 .NET](https://aws.amazon.com/porting-assistant-dotnet/)。這可協助您加速將舊版 .NET 應用程式移轉至現代 .NET，讓應用程式能夠在 Linux 上執行。

下列圖表會比較 x86 和 ARM/Graviton2 架構結果，用於運算主要數字的函數。



![比較 x86 和 ARM/Graviton2 架構](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/optimize-costs-microsoft-workloads/images/graph_prime_numbers.png)


函數使用單一執行緒。當記憶體設定為 1.8 GB 時，會報告這兩個架構的最低持續時間。除此之外，Lambda 函數可存取超過 1 個 vCPU，但在此情況下，函數無法使用額外的電源。基於相同原因，記憶體高達 1.8 GB 的成本穩定。隨著記憶體增加，成本會增加，因為此工作負載沒有額外的效能優勢。Graviton2 處理器可清楚提供更好的效能，並降低此運算密集型函數的成本。

若要將函數設定為搭配 Graviton 使用 和 ARM 型處理器，請執行下列動作：

1. 登入 ， AWS 管理主控台 然後開啟 [Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 選擇**建立函數**。

1. 針對 **Function name (函數名稱)**，輸入名稱。

1. 針對**執行期**，選擇 **.NET 6 (C\#/PowerShell)**。

1. 針對**架構**，選取 **arm64**。

1. 進行您需要的任何其他組態，然後選擇**建立函數**。

## 其他資源
<a name="net-serverless-resources"></a>
+ [Lambda 函數做為目標](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html) (AWS 文件）
+ [使用 最佳化 AWS Lambda 成本和效能 AWS Compute Optimizer](https://aws.amazon.com/blogs/compute/optimizing-aws-lambda-cost-and-performance-using-aws-compute-optimizer/) (AWS 運算部落格）
+ [最佳化您的 AWS Lambda 成本 – 第 1 ](https://aws.amazon.com/blogs/compute/optimizing-your-aws-lambda-costs-part-1/)部分 (AWS 運算部落格）
+ [最佳化您的 AWS Lambda 成本 – 第 2 ](https://aws.amazon.com/blogs/compute/optimizing-your-aws-lambda-costs-part-2/)部分 (AWS 運算部落格）
+ [AWS Lambda 使用 .NET 7 在 上建置無伺服器 .NET 應用程式 ](https://aws.amazon.com/blogs/compute/building-serverless-net-applications-on-aws-lambda-using-net-7/)(AWS 運算部落格）