EC2 Fleet 的屬性型執行個體類型選擇 - Amazon Elastic Compute Cloud

EC2 Fleet 的屬性型執行個體類型選擇

建立 EC2 Fleet 時,您必須指定一或多個執行個體類型,以在機群中設定隨需執行個體和 Spot 執行個體。做為手動指定執行個體類型的替代方式,您可以指定執行個體必須具有的屬性,然後 Amazon EC2 會識別具有這些屬性的所有執行個體類型。這就是所謂的屬性型執行個體類型選項。例如,您可以指定執行個體所需的 vCPU 數目下限和上限,然後 EC2 Fleet 將使用符合這些 vCPU 需求的任何可用執行個體類型來啟動執行個體。

屬性型執行個體類型選擇非常適合可對其使用哪些執行個體類型具有彈性的工作負載和架構,例如執行容器或 Web 機群、處理大數據,以及實作持續整合和部署 (CI/CD) 工具時。

優勢

屬性型執行個體類型選擇具有下列優勢:

  • 由於有太多可用的執行個體類型,為您的工作負載尋找適當的執行個體類型可能會非常耗時。當您指定執行個體類型屬性時,執行個體類型會自動具有工作負載所需的屬性。

  • 若要針對 EC2 Fleet 手動指定多個執行個體類型,您必須為每個執行個體類型建立個別的啟動範本覆寫。但是,有了屬性型執行個體類型選擇,若要提供多個執行個體類型,您只需要在啟動範本或在啟動範本覆寫中指定執行個體屬性。

  • 當您指定執行個體屬性而非執行個體類型時,您的機群可以在新一代的執行個體類型釋出時使用它們,即「未來校正」機群的組態。

  • 當您指定執行個體屬性而非執行個體類型時,EC2 Fleet 可以從用於啟動 Spot 執行個體的廣泛執行個體類型中進行選擇,而這些執行個體類型符合執行個體類型彈性的最佳實務

屬性型執行個體類型選擇的運作方式

若要在機群組態中使用屬性型執行個體類型選擇,請將執行個體類型清單取代為執行個體所需的執行個體屬性清單。EC2 Fleet 將在具有所指定執行個體屬性的任何可用執行個體類型上啟動執行個體。

執行個體屬性的類型

有數個您可以指定來表達運算需求的執行個體屬性。如需每個屬性和預設值的描述,請參閱 Amazon EC2 API 參考中的 InstanceRequirements

要在何處設定屬性型執行個體類型選擇

根據您使用的是主控台還是 AWS CLI,您可以針對屬性型執行個體類型選擇指定執行個體屬性,如下所示:

在主控台中,您可以在下列一個或兩個機群組態元件中指定執行個體屬性:

  • 在啟動範本中,參考機群請求中的啟動範本

  • 在機群請求中

在 AWS CLI 中,您可以在下列一個或全部機群組態元件中指定執行個體屬性:

  • 在啟動範本中,參考機群請求中的啟動範本

  • 在啟動範本覆寫中

    如果想要混合使用不同 AMI 的執行個體,您可以在多個啟動範本覆寫中指定執行個體屬性。例如,不同的執行個體類型可以使用 x86 和 ARM 型處理器。

  • 在啟動規格中

EC2 Fleet 在佈建機群時如何使用屬性型執行個體類型選擇

EC2 Fleet 以下列方式佈建機群:

  • EC2 Fleet 可識別具有所指定屬性的執行個體類型。

  • EC2 Fleet 會使用價格保護來決定要排除哪些執行個體類型。

  • EC2 Fleet 會決定其將根據具有相符執行個體類型的 AWS 區域或可用區域,考慮從哪些容量集區中啟動執行個體。

  • EC2 Fleet 會套用指定的分配策略,以決定要從哪些容量集區中啟動執行個體。

    請注意,屬性型執行個體類型選擇不會挑選要從中佈建機群的容量集區;這是分配策略的任務。可能有大量的執行個體類型具有指定的屬性,而其中一些可能很昂貴。Spot 和隨需的 lowest-price 預設分配策略保證 EC2 Fleet 將從最便宜的容量集區中啟動執行個體。

    如果您指定分配策略,EC2 Fleet 將根據指定的分配策略啟動執行個體。

    • 若為 Spot 執行個體,屬性型執行個體類型選擇支援 capacity-optimizedlowest-price 分配策略。

    • 若為隨需執行個體,屬性型執行個體類型選擇支援 lowest-price 分配策略。

  • 如果具有所指定執行個體屬性的執行個體類型沒有容量,則無法啟動任何執行個體,而且機群會傳回錯誤。

價格保護

價格保護是一項功能,可防止 EC2 Fleet 使用您認為過於昂貴的執行個體類型,即使它們剛好符合您指定的屬性也一樣。當您建立具有屬性型執行個體類型選擇的叢集時,預設會啟用價格保護,並針對隨需執行個體和 Spot 執行個體提供個別閾值。當 Amazon EC2 選取具有您屬性的執行個體類型時,其會排除定價高於閾值的執行個體類型。閾值代表您將支付的最高金額,以百分比表示,高於具有所指定屬性最新一代的最便宜 M、C 或 R 執行個體類型。

如果您未指定閾值,則預設會使用下列閾值:

  • 對於隨需執行個體,價格保護閾值設在 20%。

  • 對於 Spot 執行個體,價格保護閾值設在 100%。

如要指定價格保護閾值

在建立 EC2 機群時,為屬性型執行個體類型選擇設定機群,然後執行下列作業:

  • 如要指定隨需執行個體價格保護閾值,請於 JSON 組態檔案的 InstanceRequirements 結構中,對於 OnDemandMaxPricePercentageOverLowestPrice,以百分比形式輸入價格保護閾值。

  • 如要指定 Spot 執行個體價格保護閾值,請於 JSON 組態檔案的 InstanceRequirements 結構中,若為 SpotMaxPricePercentageOverLowestPrice,以百分比形式輸入價格保護閾值。

如需有關建立機群的詳細資訊,請參閱 建立具有屬性型執行個體類型選擇的 EC2 Fleet

注意

建立 EC2 機群時,若您將 TargetCapacityUnitType 設定為 vcpumemory-mib,則價格保護閾值會根據每個 vCPU 或每個記憶體的價格進行套用,而非每個執行個體的價格。

考量

  • 您可以在 EC2 Fleet 中指定執行個體類型或執行個體屬性,但不能同時指定兩者。

    使用 CLI 時,啟動範本覆寫將覆寫啟動範本。例如,如果啟動範本包含執行個體類型,且啟動範本覆寫包含執行個體屬性,則執行個體屬性所識別的執行個體將覆寫啟動範本中的執行個體類型。

  • 使用 CLI 時,若將執行個體屬性指定為覆寫,您也無法指定權重或優先順序。

  • 您最多可以在請求組態中指定四個 InstanceRequirements 結構。

建立具有屬性型執行個體類型選擇的 EC2 Fleet

您可以使用 AWS CLI,將機群設定為使用屬性型執行個體類型選擇。

使用 AWS CLI 建立 EC2 Fleet

若要建立 EC2 Fleet (AWS CLI)

  • 使用 create-fleet (AWS CLI) 命令建立 EC2 Fleet。指定 JSON 檔案中的機群組態。

aws ec2 create-fleet \ --region us-east-1 \ --cli-input-json file://file_name.json

下列 JSON 檔案包含設定 EC2 Fleet 時可以指定的所有參數。屬性型執行個體類型選擇的參數位於 InstanceRequirements 結構中。如需每個屬性和預設值的描述,請參閱 Amazon EC2 API 參考中的 InstanceRequirements

注意

InstanceRequirements 併入機群組態中時,必須排除 InstanceTypeWeightedCapacity;它們無法與執行個體屬性同時決定機群組態。

{ "DryRun": true, "ClientToken": "", "SpotOptions": { "AllocationStrategy": "capacity-optimized", "MaintenanceStrategies": { "CapacityRebalance": { "ReplacementStrategy": "launch" } }, "InstanceInterruptionBehavior": "stop", "InstancePoolsToUseCount": 0, "SingleInstanceType": true, "SingleAvailabilityZone": true, "MinTargetCapacity": 0, "MaxTotalPrice": "" }, "OnDemandOptions": { "AllocationStrategy": "prioritized", "CapacityReservationOptions": { "UsageStrategy": "use-capacity-reservations-first" }, "SingleInstanceType": true, "SingleAvailabilityZone": true, "MinTargetCapacity": 0, "MaxTotalPrice": "" }, "ExcessCapacityTerminationPolicy": "no-termination", "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateId": "", "LaunchTemplateName": "", "Version": "" }, "Overrides": [ { "InstanceType": "r5ad.large", "MaxPrice": "", "SubnetId": "", "AvailabilityZone": "", "WeightedCapacity": 0.0, "Priority": 0.0, "Placement": { "AvailabilityZone": "", "Affinity": "", "GroupName": "", "PartitionNumber": 0, "HostId": "", "Tenancy": "host", "SpreadDomain": "", "HostResourceGroupArn": "" }, "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 0 }, "MemoryMiB": { "Min": 0, "Max": 0 }, "CpuManufacturers": [ "amd" ], "MemoryGiBPerVCpu": { "Min": 0.0, "Max": 0.0 }, "ExcludedInstanceTypes": [ "" ], "InstanceGenerations": [ "previous" ], "SpotMaxPricePercentageOverLowestPrice": 0, "OnDemandMaxPricePercentageOverLowestPrice": 0, "BareMetal": "excluded", "BurstablePerformance": "required", "RequireHibernateSupport": true, "NetworkInterfaceCount": { "Min": 0, "Max": 0 }, "LocalStorage": "required", "LocalStorageTypes": [ "hdd" ], "TotalLocalStorageGB": { "Min": 0.0, "Max": 0.0 }, "BaselineEbsBandwidthMbps": { "Min": 0, "Max": 0 }, "AcceleratorTypes": [ "fpga" ], "AcceleratorCount": { "Min": 0, "Max": 0 }, "AcceleratorManufacturers": [ "xilinx" ], "AcceleratorNames": [ "vu9p" ], "AcceleratorTotalMemoryMiB": { "Min": 0, "Max": 0 } } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 0, "OnDemandTargetCapacity": 0, "SpotTargetCapacity": 0, "DefaultTargetCapacityType": "spot", "TargetCapacityUnitType": "vcpu" }, "TerminateInstancesWithExpiration": true, "Type": "instant", "ValidFrom": "1970-01-01T00:00:00", "ValidUntil": "1970-01-01T00:00:00", "ReplaceUnhealthyInstances": true, "TagSpecifications": [ { "ResourceType": "route-table", "Tags": [ { "Key": "", "Value": "" } ] } ], "Context": "" }

有效和無效的組態範例

如果使用 AWS CLI 來建立 EC2 Fleet,您必須確保機群組態有效。下列範例顯示有效和無效的組態。

當組態包含下列項目時,視為無效:

  • 同時具有 OverridesInstanceRequirements 的單一 InstanceType

  • 兩個 Overrides 結構, 一個具有 InstanceRequirements,而另一個具有 InstanceType

  • 兩個在同一 InstanceRequirements 內具有重疊屬性值的 LaunchTemplateSpecification 結構

有效組態:具有覆寫的單一啟動範本

下列組態有效。其包含一個啟動範本和一個 Overrides 結構 (其中包含一個 InstanceRequirements 結構)。範例組態的文字說明如下。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "My-launch-template", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 2, "Max": 8 }, "MemoryMib": { "Min": 0, "Max": 10240 }, "MemoryGiBPerVCpu": { "Max": 10000 }, "RequireHibernateSupport": true } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 5000, "DefaultTargetCapacityType": "spot", "TargetCapacityUnitType": "vcpu" } } }

InstanceRequirements

若要使用屬性型執行個體選擇,您必須在組態中包含 InstanceRequirements 結構,並為機群中的執行個體指定所需的屬性。

在上述範例中,指定了下列執行個體屬性:

  • VCpuCount – 執行個體類型必須具有最少 2 個,最多 8 個的 vCPU。

  • MemoryMiB – 執行個體類型必須具有最多 10240 MiB 的記憶體。最小值若為 0,表示沒有最小限制。

  • MemoryGiBPerVCpu – 執行個體類型必須具有每個 vCPU 最多 10,000 MiB 的記憶體。Min 為選用參數。若省略它,表示沒有最小限制。

TargetCapacityUnitType

TargetCapacityUnitType 參數會指定目標容量的單位。在範例中,目標容量為 5000,而目標容量單位類型為 vcpu,它們一起指定了所需的目標容量,即 5,000 個 vCPU。EC2 Fleet 將啟動足夠的執行個體,以便機群中的 vCPU 總數為 5,000 個 vCPU。

有效組態:具有多個 InstanceRequirements 的單一啟動範本

下列組態有效。其包含一個啟動範本和一個 Overrides 結構 (其中包含兩個 InstanceRequirements 結構)。InstanceRequirements 中指定的屬性是有效的,因為這些值不重疊—第一個 InstanceRequirements 結構會指定 0-2 個 vCPU 的VCpuCount,而第二個 InstanceRequirements 結構則會指定 4-8 個 vCPU。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } }, { "InstanceRequirements": { "VCpuCount": { "Min": 4, "Max": 8 }, "MemoryMiB": { "Min": 0 } } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "spot" } } }

有效組態:兩個啟動範本,每個都具有覆寫

下列組態有效。其包含兩個啟動範本,每個都具有一個 Overrides 結構 (其中包含一個 InstanceRequirements 結構)。這個組態有助於同一個機群中的 armx86 架構支援。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "armLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } }, { "LaunchTemplateSpecification": { "LaunchTemplateName": "x86LaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "spot" } } }

組態無效:Overrides 包含 InstanceRequirementsInstanceType

下列組態無效。Overrides 結構同時包含 InstanceRequirementsInstanceType。針對 Overrides,您可以指定 InstanceRequirementsInstanceType,但不能同時指定兩者。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } }, { "InstanceType": "m5.large" } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "spot" } } }

組態無效:兩個 Overrides 包含 InstanceRequirementsInstanceType

下列組態無效。Overrides 結構同時包含 InstanceRequirementsInstanceType。您可以指定 InstanceRequirementsInstanceType,但不能同時指定兩者,即使它們處於不同的 Overrides 結構也一樣。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } } ] }, { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyOtherLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceType": "m5.large" } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "spot" } } }

有效組態:僅限指定的 InstanceRequirements,沒有重疊的屬性值

下列組態有效。其包含兩個 LaunchTemplateSpecification 結構,每個都有一個啟動範本和一個 Overrides 結構 (其中包含一個 InstanceRequirements 結構)。InstanceRequirements 中指定的屬性是有效的,因為這些值不重疊—第一個 InstanceRequirements 結構會指定 0-2 個 vCPU 的VCpuCount,而第二個 InstanceRequirements 結構則會指定 4-8 個 vCPU。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } } ] }, { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyOtherLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 4, "Max": 8 }, "MemoryMiB": { "Min": 0 } } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "spot" } } }

組態無效:重疊屬性值

下列組態無效。兩個 InstanceRequirements 結構每個都包含 "VCpuCount": {"Min": 0, "Max": 2}。這些屬性的值重疊,這會導致容量集區重複。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } }, { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "spot" } } }

預覽具有所指定屬性的執行個體類型

您可以使用 get-instance-types-from-instance-requirements AWS CLI 命令,來預覽符合您指定之屬性的執行個體類型。這特別有助於解決在不啟動任何執行個體的情況下要在請求組態中指定哪些屬性。請注意,該命令不會考慮可用容量。

若要透過指定屬性來預覽執行個體類型的清單,請使用 AWS CLI

  1. (選用) 若要產生可指定的所有可能屬性,請使用 get-instance-types-from-instance-requirements 命令和 --generate-cli-skeleton 參數。您可以選擇性地將輸出導向至檔案來儲存它,方法是使用 input > attributes.json

    aws ec2 get-instance-types-from-instance-requirements \ --region us-east-1 \ --generate-cli-skeleton input > attributes.json

    預期的輸出結果

    { "DryRun": true, "ArchitectureTypes": [ "x86_64_mac" ], "VirtualizationTypes": [ "paravirtual" ], "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 0 }, "MemoryMiB": { "Min": 0, "Max": 0 }, "CpuManufacturers": [ "intel" ], "MemoryGiBPerVCpu": { "Min": 0.0, "Max": 0.0 }, "ExcludedInstanceTypes": [ "" ], "InstanceGenerations": [ "current" ], "SpotMaxPricePercentageOverLowestPrice": 0, "OnDemandMaxPricePercentageOverLowestPrice": 0, "BareMetal": "included", "BurstablePerformance": "excluded", "RequireHibernateSupport": true, "NetworkInterfaceCount": { "Min": 0, "Max": 0 }, "LocalStorage": "required", "LocalStorageTypes": [ "hdd" ], "TotalLocalStorageGB": { "Min": 0.0, "Max": 0.0 }, "BaselineEbsBandwidthMbps": { "Min": 0, "Max": 0 }, "AcceleratorTypes": [ "inference" ], "AcceleratorCount": { "Min": 0, "Max": 0 }, "AcceleratorManufacturers": [ "xilinx" ], "AcceleratorNames": [ "t4" ], "AcceleratorTotalMemoryMiB": { "Min": 0, "Max": 0 } }, "MaxResults": 0, "NextToken": "" }
  2. 使用上一個步驟的輸出來建立 JSON 組態檔,並將其設定如下:

    注意

    您必須提供 ArchitectureTypesVirtualizationTypesVCpuCountMemoryMiB 的值。您可以省略其他屬性;省略時,就會使用預設值。

    如需每個屬性及其預設值的說明,請參閱 Amazon EC2 命令列參考中的 get-instance-types-from-instance-requirements

    1. 針對 ArchitectureTypes,指定一或多種類型的處理器架構。

    2. 針對 VirtualizationTypes,指定一或多種類型的虛擬化。

    3. 針對 VCpuCount,指定 vCPU 數目下限和上限。若要指定沒有下限,請針對 Min,指定 0。若要指定沒有上限,請省略 Max 參數。

    4. 針對 MemoryMiB,指定記憶體的數量下限和上限 (以 MiB 為單位)。若要指定沒有下限,請針對 Min,指定 0。若要指定沒有上限,請省略 Max 參數。

    5. 您可以選擇性地指定一或多個其他屬性,以進一步限制傳回的執行個體類型清單。

  3. 若要預覽具有您在 JSON 檔案中指定之屬性的執行個體類型,請使用 get-instance-types-from-instance-requirements 命令,並使用 --cli-input-json 參數指定 JSON 檔案的名稱和路徑。您可以選擇性地格式化要以表格格式出現的輸出。

    aws ec2 get-instance-types-from-instance-requirements \ --cli-input-json file://attributes.json \ --output table

    範例 attributes.json 文件

    在此範例中,JSON 檔案中包含必要的屬性。它們是 ArchitectureTypesVirtualizationTypesVCpuCountMemoryMiB。此外,選用 InstanceGenerations 屬性也包含在內。請注意,對於 MemoryMiB,可以省略 Max,以表示沒有限制。

    { "ArchitectureTypes": [ "x86_64" ], "VirtualizationTypes": [ "hvm" ], "InstanceRequirements": { "VCpuCount": { "Min": 4, "Max": 6 }, "MemoryMiB": { "Min": 2048 }, "InstanceGenerations": [ "current" ] } }

    範例輸出

    ------------------------------------------ |GetInstanceTypesFromInstanceRequirements| +----------------------------------------+ || InstanceTypes || |+--------------------------------------+| || InstanceType || |+--------------------------------------+| || c4.xlarge || || c5.xlarge || || c5a.xlarge || || c5ad.xlarge || || c5d.xlarge || || c5n.xlarge || || d2.xlarge || ...
  4. 在識別符合您需求的執行個體類型之後,請記下您使用的執行個體屬性,以便在設定機群請求時可以使用它們。