

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

# 支援靜態 .NET Framework 應用程式的動態擴展
<a name="net-static"></a>

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

將雲端用於應用程式的主要優點之一是彈性，或能夠根據需求擴展或擴展運算。這可讓您僅支付所需的運算容量，而不是佈建尖峰用量。網路星期一，線上零售商可以快速獲得比平常多出許多倍的流量 （例如[，幾分鐘內數千個百分比](https://aws.amazon.com/blogs/startups/how-clicktale-uses-aws-to-power-a-successful-cyber-monday/))，是彈性的良好範例。

如果您要將舊版 .NET Web 應用程式帶入雲端 （例如，在 IIS 上執行的 ASP.NET Framework 應用程式），由於應用程式的狀態性質，快速擴展負載平衡伺服器陣列的能力可能很困難或不可能。使用者工作階段資料會存放在應用程式的記憶體中，通常使用 [ASP.NET 工作階段狀態](https://learn.microsoft.com/en-us/previous-versions/aspnet/ms178581(v=vs.100))或靜態變數來保存必須保留的跨請求資料。使用者工作階段親和性通常透過負載平衡器黏性工作階段來維護。

這證明在操作上具有挑戰性。當需要增加容量時，您必須刻意佈建和新增伺服器。這可能是緩慢的程序。在修補或意外失敗的情況下停用節點可能會對最終使用者體驗造成問題，並失去與受影響節點相關聯的所有使用者狀態。最好是，這需要使用者再次登入。

透過集中 ASP.NET 應用程式的工作階段狀態，並將自動擴展規則套用至舊版 ASP.NET 應用程式，您可以利用雲端的彈性，並在執行應用程式時節省成本。例如，您可以透過運算可擴展性降低成本，但您也可以從可用的不同定價模型中進行選擇，例如減少[預留執行個體用量](https://aws.amazon.com/ec2/pricing/reserved-instances/)和使用 [Amazon Spot 執行個體定價](https://aws.amazon.com/ec2/spot/)。

兩種常見的技術包括使用 [Amazon DynamoDB 做為工作階段狀態提供者](https://github.com/aws/aws-dotnet-session-provider)，以及使用 [Amazon ElastiCache (Redis OSS) 做為 ASP.NET 工作階段存放區](https://aws.amazon.com/blogs/developer/elasticache-as-an-asp-net-session-store/)。

下圖顯示使用 DynamoDB 做為工作階段狀態提供者的架構。



![\[DynamoDB 做為工作階段狀態提供者\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/optimize-costs-microsoft-workloads/images/session_state_dynamodb.png)


下圖顯示使用 ElastiCache (Redis OSS) 做為工作階段狀態提供者的架構。



![\[ElastiCache (Redis OSS) 做為工作階段狀態提供者\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/optimize-costs-microsoft-workloads/images/session_state_elasticache.png)


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

若要判斷生產應用程式擴展的優點，建議您建立實際需求的模型。本節會做出下列假設來建立範例應用程式的模型：
+ 從輪換中新增和移除的執行個體是相同的，而且不會引入任何執行個體大小變化。
+ 伺服器使用率絕不會低於兩個作用中伺服器，以維持應用程式的高可用性。
+ 伺服器數量會隨流量線性擴展 （也就是說，兩倍的流量需要兩倍的運算量）。
+ 流量會在一個月內以六小時增量建立模型，一天內的變化和 10 倍流量一天的異常流量峰值 （例如，促銷銷售）。週末流量以基本使用率建立模型。
+ 夜間流量以基本使用率建模，而工作日流量以 4 倍使用率建模。
+ 預留執行個體定價使用一年無預付款定價。一般日間定價使用隨需定價，而爆量需求則使用 Spot 執行個體定價。

下圖說明此模型如何利用 .NET 應用程式的彈性，而不是佈建尖峰用量。這可節省約 68% 的成本。



![\[Auto Scaling 成本圖表\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/optimize-costs-microsoft-workloads/images/graph_autoscaling_costs.png)


如果您使用 DynamoDB 做為工作階段狀態儲存機制，請使用下列參數：

```
Storage: 20GB
Session Reads: 40 million
Session Writes: 20 million
Pricing Model: On demand
```

此服務的估計每月成本約為 35.00 美元。

如果您使用 ElastiCache (Redis OSS) 做為工作階段狀態儲存機制，請使用下列參數：

```
Number of Nodes: 3
Node size: cache.t4g.medium
Pricing Model: 1y reserved
```

此服務的估計每月成本約為 91.00 美元。

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

第一步是在舊版 .NET 應用程式中實作工作階段狀態。如果您使用 ElastiCache 做為狀態儲存機制，請遵循 AWS 開發人員工具部落格中 [ElastiCache 作為 ASP.NET 工作階段存放](https://aws.amazon.com/blogs/developer/elasticache-as-an-asp-net-session-store/)區的指導。如果您使用的是 DynamoDB，請遵循 適用於 .NET 的 SDK 文件中[什麼是 適用於 .NET 的 AWS SDK](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/welcome.html)的指引。

如果應用程式使用 **InProc** 工作階段開頭，請確定您計劃存放在工作階段中的所有物件都可以序列化。若要這樣做，請使用 `SerializableAttribute` 屬性來裝飾 類別，其執行個體將存放在工作階段中。例如：

```
[Serializable()] 
public class TestSimpleObject { 
public string SessionProperty {get;set;}
}
```

此外，所有使用中的伺服器之間的 .NET `MachineKey` 必須相同。這通常是從常見 Amazon Machine Image (AMI) 建立執行個體的情況。例如：

```
<machineKey
validationKey="some long hashed value"
decryptionKey="another long hashed value"
validation="SHA1"/>
```

不過，請務必確保如果基礎映像變更，則會使用相同的 .NET 機器映像進行設定 （可在 IIS 或伺服器層級設定）。如需詳細資訊，請參閱 Microsoft 文件中的 [SystemWebSectionGroup.MachineKey 屬性](https://learn.microsoft.com/en-us/dotnet/api/system.web.configuration.systemwebsectiongroup.machinekey?view=netframework-4.8.1)。

最後，您必須判斷將伺服器新增至 Auto Scaling 群組以回應擴展事件的機制。有幾種方法可以實現這一點。我們建議您使用下列方法來將 .NET Framework 應用程式無縫部署到 Auto Scaling 群組中的 EC2 執行個體：
+ 使用 [EC2 Image Builder](https://aws.amazon.com/image-builder/) 設定包含完整設定伺服器和應用程式的 AMI。然後，您可以使用此 AMI 來設定 [ Auto Scaling 群組的啟動範本](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-asg-launch-template.html)。
+ 使用 [AWS CodeDeploy](https://aws.amazon.com/codedeploy/)來部署您的應用程式。CodeDeploy 可直接與 [Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/codedeploy/latest/userguide/integrations-aws-auto-scaling.html) 整合。這提供了為每個應用程式版本建立新的 AMI 的替代方案。

## 其他資源
<a name="net-static-resources"></a>
+ [使用 EC2 Image Builder 建立映像](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-images.html) (EC2 Image Builder 文件）
+ [使用 AWS CodeDeploy 搭配 Visual Studio Team Services 部署 .NET Web 應用程式](https://aws.amazon.com/blogs/developer/deploying-net-web-applications-using-aws-codedeploy-with-visual-studio-team-services/) (AWS 開發人員工具部落格）