

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

# Amazon EC2 Spot 的最佳實務
<a name="spot-best-practices"></a>

相較於隨需價格，Amazon EC2 AWS 雲端 可透過 Spot 執行個體存取 中的備用 EC2 運算容量，最多可節省 90%。隨需執行個體與 Spot 執行個體之間唯一的差別在於，若 Amazon EC2 需要取回容量時，Spot 執行個體可以由 Amazon EC2 利用兩分鐘的通知來中斷。為了確保 Spot 執行個體最佳體驗，了解並套用最佳實務以供使用至關重要。

競價型執行個體 建議用於無狀態、容錯、靈活的應用程式。例如，競價型執行個體 適用於大數據、容器化工作負載、CI/CD、無狀態 Web 伺服器、高效能運算 (HPC) 和轉譯工作負載。

執行時，競價型執行個體 與 隨需執行個體 完全相同。但是，Spot 並無法保證您可以保持執行中的執行個體有足夠時間來完成工作負載。Spot 也無法保證您可以立即取得所尋找執行個體的可用性，也無法保證您一律可以取得所請求的彙總容量。此外，Spot 執行個體中斷和容量可能會隨著時間而改變，因為 Spot 執行個體可用性會因供給和需求而有所不同，而過去的效能並不能保證未來的結果。

競價型執行個體 不適合執行個體節點之間不靈活、可設定狀態、錯誤不容忍或緊密結合的工作負載。不建議將 Spot 執行個體用於目標容量偶爾無法完全可用的工作負載。儘管遵循 Spot 最佳實務 (例如對執行個體類型和可用區域保持靈活性) 可提供高可用性的最佳機會，但由於隨需執行個體需求激增可能會中斷 Spot 執行個體的工作負載，因此無法保證可以使用資源容量。

強烈不建議您對這些工作負載使用 Spot 執行個體，或嘗試容錯移轉至隨需執行個體以處理中斷或資源不可用的情況。容錯移轉至隨需執行個體可能會在不經意間導致其他 Spot 執行個體中斷。此外，如果執行個體類型和可用區域組合的 Spot 執行個體中斷，您可能難以取得具有相同組合的隨需執行個體。

無論您是經驗豐富的 Spot 使用者或 Spot 執行個體的新使用者，如果您目前遇到 Spot 執行個體中斷或可用性問題，建議您遵循這些最佳做法，以獲得使用 Spot 服務的最佳體驗。

**Topics**
+ [針對中斷準備個別執行個體](#prep-instances-for-interruptions)
+ [對執行個體類型和可用區域具有彈性](#be-instance-type-flexible)
+ [使用屬性型執行個體類型選取範圍](#use-attribute-based-instance-type-selection)
+ [使用 Spot 配置分數來識別最佳區域和可用區域](#use-spot-placement-scores-to-identify-optimal-regions-and-availability-zones)
+ [使用 EC2 Auto Scaling 群組或 EC2 Fleet 來管理彙總容量](#use-sf-asg-for-aggregate-capacity)
+ [使用價格和容量最佳化分配策略](#use-capacity-optimized-allocation-strategy)
+ [使用整合 AWS 服務來管理您的 Spot 執行個體](#use-integrated-aws-services)
+ [使用哪種 Spot 請求方法最好？](#which-spot-request-method-to-use)

## 針對中斷準備個別執行個體
<a name="prep-instances-for-interruptions"></a>

從容處理 Spot 執行個體中斷的最佳方法，就是建立容錯的應用程式架構。若要達到此目的，您可以利用 EC2 執行個體重新平衡建議和 Spot 執行個體中斷通知。

EC2 執行個體重新平衡推薦是一種訊號，可在 Spot 執行個體的中斷風險升高時通知您。該訊號使您有機會在兩分鐘 Spot 執行個體中斷通知之前主動管理 Spot 執行個體。您可以決定將工作負載重新平衡至未處於提高之中斷風險的新的或現有 競價型執行個體。我們已經使用 Auto Scaling 群組和 EC2 Fleet 中的容量重新平衡功能，讓您輕鬆地使用此訊號。

Spot 執行個體中斷通知是在 Amazon EC2 中斷 Spot 執行個體的兩分鐘之前發出的警告。如果您的工作負載具有「時間彈性」，當執行個體中斷時，您可以將它們設定為停止或休眠，而非終止。Amazon EC2 會在中斷時自動停止或休眠 Spot 執行個體，並在我們有可用容量時自動繼續執行個體。

建議您在 [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/index.html) 中建立擷取重新平衡建議和中斷通知的規則，然後觸發工作負載進度的檢查點，或從容處理中斷。如需詳細資訊，請參閱[監控重新平衡建議訊號](rebalance-recommendations.md#monitor-rebalance-recommendations)。如需如何建立和使用事件規則的詳細範例，請參閱[利用 Amazon EC2 Spot 執行個體中斷通知](https://aws.amazon.com/blogs/compute/taking-advantage-of-amazon-ec2-spot-instance-interruption-notices/)。

如需詳細資訊，請參閱[EC2 執行個體重新平衡建議](rebalance-recommendations.md)及[Spot 執行個體中斷](spot-interruptions.md)。

## 對執行個體類型和可用區域具有彈性
<a name="be-instance-type-flexible"></a>

Spot 容量集區是一組未使用的 EC2 執行個體，具有相同執行個體類型 (例如 `m5.large`) 和可用區域 (例如 us-east-1a)。您應該對於請求的執行個體類型，以及可在其中部署工作負載的可用區域具有彈性。這讓 Spot 有更好的機會找到並配置您所需的運算容量。例如，不要只要求 `c5.large` 是否願意使用來自 c4、m5 和 m4 系列的 large。

根據您的特定需求，您可以評估哪些執行個體類型可以具彈性，以滿足您的運算需求。如果工作負載可以垂直擴展，則應在請求中包含較大的執行個體類型 (更多 vCPU 和記憶體)。如果您只能水平擴展，則應納入舊一代執行個體類型，因為隨需客戶的需求較少。

一個很好的經驗法則是針對每個工作負載的至少 10 個執行個體類型上具有彈性。此外，請確定所有可用區域均已設定為在 VPC 中使用，並針對您的工作負載選取。

## 使用屬性型執行個體類型選取範圍
<a name="use-attribute-based-instance-type-selection"></a>

透過屬性型執行個體類型選項，您可以為要執行的工作負載指定執行個體屬性，例如 vCPU、記憶體和儲存體。EC2 Auto Scaling 或 EC2 Fleet 會自動識別並啟動符合您指定屬性的執行個體。這樣就省去了手動選取特定執行個體類型所需的工作，該工作需要深入了解每一種執行個體類型提供的功能。

此外，屬性型執行個體類型選項可讓您在新版本執行個體類型推出時自動使用。這可確保順暢存取日益廣泛的 Spot 執行個體容量。

屬性型執行個體類型選項非常適用於其執行的執行個體類型具有彈性的工作負載和架構，例如高效能運算 (HPC) 和大數據工作負載。

如需詳細資訊，請參閱「Amazon EC2 Auto Scaling 使用者指南」**中的[使用屬性型執行個體類型選取範圍來建立 Auto Scaling 群組](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-mixed-instances-group-attribute-based-instance-type-selection.html)以及此指南中的 [指定屬性，為 EC2 機群或 Spot 機群選取執行個體類型](ec2-fleet-attribute-based-instance-type-selection.md)。

## 使用 Spot 配置分數來識別最佳區域和可用區域
<a name="use-spot-placement-scores-to-identify-optimal-regions-and-availability-zones"></a>

Spot 執行個體是未使用的 EC2 容量，此容量會根據 EC2 的供需而變化。因此，您不一定會在特定時間和特定位置中取得所需的確切 Spot 容量。若要緩解此不可預測性，您可以使用 Spot 配置分數功能。此功能會針對容量較可能足以滿足 Spot 容量需求的區域或可用區域提供建議，而無需先在這些位置啟動 Spot 執行個體。

Spot 配置分數最適用於對執行個體類型，以及它們可使用的區域或可用區域具有彈性的工作負載。您只需要指定所需的 Spot 容量、執行個體類型需求，以及是否想要針對區域或可用區域提供建議。作為交換，您會收到每個區域或可用區域從 1 到 10 的分數，這表示在該位置順利佈建您要求的 Spot 容量的可能性。分數 10 表示您的 Spot 請求很有可能成功。

請注意，Spot 配置分數是時間點建議，因為容量可能會隨著時間而有所不同。其不保證可用容量，也無法預測中斷風險。

您可以在 Amazon EC2 主控台 AWS CLI或 SDK 中使用 Spot 配置分數功能。如需詳細資訊，請參閱[Spot 配置分數](spot-placement-score.md)。

## 使用 EC2 Auto Scaling 群組或 EC2 Fleet 來管理彙總容量
<a name="use-sf-asg-for-aggregate-capacity"></a>

Spot 可讓您以彙總容量 (包括 vCPU、記憶體、儲存或網路輸送量單位) 的方式來思考，而不是以個別執行個體的方式來思考。Auto Scaling 群組和 EC2 Fleet 可讓您啟動和維護目標容量，並自動請求資源以取代中斷或手動終止的任何資源。設定 Auto Scaling 群組或 EC2 Fleet 時，只需要根據應用程式需求指定執行個體類型和目標容量。如需詳細資訊，請參閱 *Amazon EC2 Auto Scaling 使用者指南* 中的 [Auto Scaling 群組](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-groups.html)和本使用者指南中的 [建立 EC2 Fleet](create-ec2-fleet.md)。

## 使用價格和容量最佳化分配策略
<a name="use-capacity-optimized-allocation-strategy"></a>

Auto Scaling 群組中的分配策略可協助您佈建目標容量，而無需手動尋找具有備用容量的 Spot 容量集區。建議使用 `price-capacity-optimized` 策略，因為此策略會自動從最可用且價格最低的 Spot 容量集區佈建執行個體。您也可以利用 EC2 Fleet 中的 `price-capacity-optimized` 配置策略。由於您的 Spot 執行個體容量來自具有最佳容量的集區，因此可降低回收 Spot 執行個體的可能性。如需詳細資訊，請參閱《*Amazon EC2 Auto Scaling 使用者指南*中的[多種執行個體類型的配置策略](https://docs.aws.amazon.com/autoscaling/ec2/userguide/allocation-strategies.html)和本使用者指南中的 [當工作負載具有較高的中斷成本時](ec2-fleet-allocation-strategy.md#ec2-fleet-strategy-capacity-optimized)。

## 使用整合 AWS 服務來管理您的 Spot 執行個體
<a name="use-integrated-aws-services"></a>

 AWS 其他服務與 Spot 整合，可降低整體運算成本，而無需管理個別執行個體或機群。我們建議您考慮適用工作負載的下列解決方案：Amazon EMR、Amazon Elastic Container Service AWS Batch、Amazon Elastic Kubernetes Service、Amazon SageMaker AI AWS Elastic Beanstalk和 Amazon GameLift Servers。若要深入了解搭配這些服務的 Spot 最佳做法，請參閱 [Amazon EC2 競價型執行個體 研討會網站](https://ec2spotworkshops.com/)。

## 使用哪種 Spot 請求方法最好？
<a name="which-spot-request-method-to-use"></a>

使用下表確定在請求 Spot 執行個體時使用哪個 API。


****  

| API | 何時使用？ | 使用案例 | 我應該使用此 API 嗎？ | 
| --- | --- | --- | --- | 
| [CreateAutoScalingGroup](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CreateAutoScalingGroup.html) |  [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/spot-best-practices.html)  | 建立 Auto Scaling 群組，管理執行個體的生命週期，同時維護所需的執行個體數量。支援在指定的最小和最大限制之間水平擴展 (新增更多執行個體)。 | 是 | 
| [CreateFleet](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet.html) |  [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/spot-best-practices.html)  | 在單一請求中建立隨需執行個體和 Spot 執行個體的機群，並具有隨執行個體類型、AMI、可用區域或子網而異的多個啟動規格。Spot 執行個體分配策略預設為每單位 `lowest-price`，但您可以將其變更為 `price-capacity-optimized`、`capacity-optimized` 或 `diversified`。 | 是 – 在 `instant` 模式中 (如果您不需要自動擴展) | 
| [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) |  [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/spot-best-practices.html)  | 使用 AMI 和一個執行個體類型，啟動指定數量的執行個體。 | 否 – 因為 RunInstances 不允許在單一請求中使用混合執行個體類型 | 
| [RequestSpotFleet](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotFleet.html) |  [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/spot-best-practices.html)  | 請勿使用。RequestSpotFleet 是沒有計劃投資的舊式 API。 | 否 | 
| [RequestSpotInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotInstances.html) |  [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/spot-best-practices.html)  | 請勿使用。RequestSpotInstances 是沒有計劃投資的舊式 API。 | 否 | 