建立 EC2 Fleet - Amazon Elastic Compute Cloud

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

建立 EC2 Fleet

若要建立 EC2 機群,請在 JSON 檔案中定義機群組態,並使用 create-fleet 命令參考檔案。在 JSON 檔案中,您必須指定機群的總目標容量、Spot 執行個體和隨需執行個體的個別目標容量,以及定義機群中執行個體組態的啟動範本,例如 AMI、執行個體類型、子網路或可用區域,以及一個或多個安全群組。您可以選擇指定其他組態,例如覆寫啟動範本組態的參數、從 EC2 容量集區中選取 Spot 執行個體和隨需執行個體的配置策略,以及您針對機群所願意支付的最高金額。如需詳細資訊,請參閱EC2 機群或 Spot 機群的組態選項

EC2 機群會在容量可用時啟動隨需執行個體,並在您的最高價格超過 Spot 價格且容量可用時,啟動 Spot 執行個體。

如果您的機群包含 Spot 執行個體,且類型為 maintain,則 Amazon EC2 會在 Spot 執行個體中斷時,嘗試維護機群目標容量。

EC2 Fleet 限制

下列限制適用於 EC2 Fleet:

  • 僅能透過 Amazon EC2 APIAWS CLIAWS SDKAWS CloudFormation 建立 EC2 機群。

  • EC2 機群請求無法跨越 AWS 區域。您需要為每個區域建立個別的 EC2 Fleet。

  • EC2 Fleet 請求不能橫跨同一個可用區域的不同子網。

EC2 Fleet 先決條件

啟動範本

啟動範本會指定所要啟動執行個體的組態資訊,例如執行個體類型和可用區域。如需啟動範本的詳細資訊,請參閱 將執行個體啟動參數存放在 Amazon EC2 啟動範本中

EC2 Fleet 的服務連結角色

AWSServiceRoleForEC2Fleet 角色會授與 EC2 Fleet 許可,以代表您請求、啟動、終止和標記執行個體。Amazon EC2 會使用此服務連結角色來完成下列動作:

  • ec2:RunInstances – 啟動執行個體。

  • ec2:RequestSpotInstances – 請求 競價型執行個體。

  • ec2:TerminateInstances – 終止執行個體。

  • ec2:DescribeImages - 描述執行個體的 Amazon Machine Images (AMI)。

  • ec2:DescribeInstanceStatus - 描述執行個體的狀態。

  • ec2:DescribeSubnets - 描述執行個體的子網絡。

  • ec2:CreateTags – 將標籤新增至 EC2 Fleet、執行個體和磁碟區。

在使用 AWS CLI 或 API 建立 EC2 機群之前,請確定此角色存在。

注意

instant EC2 Fleet 不需要此角色。

若要建立角色,請依照下列所示使用 IAM 主控台。

為 EC2 Fleet 建立 AWSServiceRoleForEC2Fleet 角色
  1. 在以下網址開啟 IAM 主控台:https://console.aws.amazon.com/iam/

  2. 在導覽窗格中,選擇角色

  3. 選擇 Create Role (建立角色)。

  4. Select trusted entity (選取信任的實體) 頁面上,執行以下作業:

    1. 針對信任的實體類型,請選擇 AWS 服務

    2. 使用案例下,針對服務或使用案例,選擇 EC2 - 機群

      提示

      請務必選擇 EC2 - 機群。如果您選擇 EC2,則 EC2 - 機群使用案例不會出現在使用案例清單中。EC2 - 機群使用案例會自動建立具有必要 IAM 許可的政策,並將建議 AWSServiceRoleForEC2Fleet 做為角色名稱。

    3. 選擇 Next (下一步)

  5. Add permissions (新增許可) 頁面上,選擇 Next (下一步)。

  6. 命名、檢閱和建立頁面上,選擇建立角色

如果您不再需要使用 EC2 Fleet,建議您刪除 AWSServiceRoleForEC2Fleet 角色。從您的帳戶中刪除此角色後,如果您建立其他機群,則可以再次建立此角色。

如需詳細資訊,請參閱「IAM 使用者指南」中的服務連結角色

授予客戶受管金鑰存取權,以便與加密的 AMI 和 EBS 快照搭配使用

如果您在 EC2 機群中指定加密的 AMI 或加密的 Amazon EBS 快照,並使用 AWS KMS 金鑰進行加密,您必須授予 AWSServiceRoleForEC2Fleet 角色許可,才能使用客戶受管金鑰,以便 Amazon EC2 可以代表您啟動執行個體。若要執行此動作,您必須將授予新增至客戶受管金鑰,如下列程序所示。

提供許可時,授與為金鑰政策的替代方案。如需詳細資訊,請參閱「AWS Key Management Service 開發人員指南」中的使用授與在 AWS KMS中使用金鑰政策

若要授予 AWSServiceRoleForEC2Fleet 角色許可以使用客戶受管金鑰
  • 使用 create-grant 命令將授予新增至客戶受管金鑰,並指定獲授予許可能夠執行授予所允許作業的主體 (AWSServiceRoleForEC2Fleet 服務連結角色)。客戶受管金鑰由 key-id 參數和客戶受管金鑰的 ARN 指定。委託人是透過 grantee-principal 參數和 AWSServiceRoleForEC2Fleet 服務連結角色的 ARN 指定。

    aws kms create-grant \ --region us-east-1 \ --key-id arn:aws:kms:us-east-1:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab \ --grantee-principal arn:aws:iam::111122223333:role/AWSServiceRoleForEC2Fleet \ --operations "Decrypt" "Encrypt" "GenerateDataKey" "GenerateDataKeyWithoutPlaintext" "CreateGrant" "DescribeKey" "ReEncryptFrom" "ReEncryptTo"

EC2 Fleet 使用者的許可

如果使用者將會建立或管理 EC2 Fleet,請務必授予這些使用者所需的許可。

為 EC2 Fleet 建立政策
  1. 開啟位於 https://console.aws.amazon.com/iam/ 的 IAM 主控台。

  2. 在導覽窗格中,選擇政策

  3. 選擇 Create policy (建立政策)。

  4. Create policy (建立政策) 頁面上,選擇 JSON 索引標籤,接著使用下列內容來取代其文字,然後選擇 Review policy (檢閱政策)

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:*" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:ListRoles", "iam:PassRole", "iam:ListInstanceProfiles" ], "Resource":"arn:aws:iam::123456789012:role/DevTeam*" } ] }

    ec2:* 會授與使用者權限,以呼叫所有 Amazon EC2 API 動作。若要將使用者限制於特定的 Amazon EC2 API 動作,請改為指定這些動作。

    使用者必須具有呼叫下列動作的權限:iam:ListRoles 動作 (以列舉現有的 IAM 角色)、iam:PassRole 動作 (以指定 EC2 Fleet 角色) 和 iam:ListInstanceProfiles 動作 (以列舉現有的執行個體設定檔)。

    (選用) 若要讓使用者能夠使用 IAM 主控台建立角色或執行個體設定檔,您也必須將下列動作新增至政策中:

    • iam:AddRoleToInstanceProfile

    • iam:AttachRolePolicy

    • iam:CreateInstanceProfile

    • iam:CreateRole

    • iam:GetRole

    • iam:ListPolicies

  5. Review policy (檢閱政策) 頁面上,輸入政策名稱和說明,然後選擇 Create policy (建立政策)

  6. 若要提供存取權,請新增權限至您的使用者、群組或角色:

    • 中的使用者和群組 AWS IAM Identity Center:

      建立權限合集。請按照 AWS IAM Identity Center 使用者指南 中的 建立權限合集 說明進行操作。

    • 透過身分提供者在 IAM 中管理的使用者:

      建立聯合身分的角色。遵循「IAM 使用者指南」的為第三方身分提供者 (聯合) 建立角色中的指示。

    • IAM 使用者:

建立 EC2 Fleet

若您要使用 EC2 機群啟動執行個體機群,只需在機群請求中指定下列參數,機群將使用其他參數的預設值:

  • LaunchTemplateIdLaunchTemplateName – 指定要使用的啟動範本 (其中包含要啟動的執行個體參數,例如執行個體類型和可用區域)

  • TotalTargetCapacity – 指定機群的總目標容量

  • DefaultTargetCapacityType – 指定預設購買選項是隨需還是 Spot

若要覆寫啟動範本中指定的參數,您可以指定一或多個覆寫。每個覆寫可能因執行個體類型、可用區域、子網路和最高價格而異,且可能包含不同的加權容量。做為指定執行個體類型的替代方式,您可以指定執行個體必須具有的屬性,然後 Amazon EC2 會識別具有這些屬性的所有執行個體類型。如需詳細資訊,請參閱 指定屬性,為 EC2 機群或 Spot 機群選取執行個體類型

對於類型為 instant 的 EC2 機群,您可以指定 Systems Manager 參數,而不是 AMI ID。您可以在覆寫或啟動範本中,指定 Systems Manager 參數。如需詳細資訊,請參閱使用 Systems Manager 參數而非 AMI ID

您可以指定 JSON 檔案中的機群參數。如需您可以指定的所有可能參數相關資訊,請參閱 檢視所有 EC2 機群組態選項

如需機群組態的範例,請參閱 EC2 機群的範例 CLI 組態

目前沒有主控台支援建立 EC2 Fleet。

建立 EC2 機群
  • 使用 create-fleet 命令來建立機群,並指定包含機群組態參數的 JSON 檔案。

aws ec2 create-fleet --cli-input-json file://file_name.json

以下是類型 requestmaintain 的叢集輸出範例。

{ "FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE" }

以下是啟動目標容量之類型 instant 的叢集輸出範例。

{ "FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE", "Errors": [], "Instances": [ { "LaunchTemplateAndOverrides": { "LaunchTemplateSpecification": { "LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE", "Version": "1" }, "Overrides": { "InstanceType": "c5.large", "AvailabilityZone": "us-east-1a" } }, "Lifecycle": "on-demand", "InstanceIds": [ "i-1234567890abcdef0", "i-9876543210abcdef9" ], "InstanceType": "c5.large", "Platform": null }, { "LaunchTemplateAndOverrides": { "LaunchTemplateSpecification": { "LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE", "Version": "1" }, "Overrides": { "InstanceType": "c4.large", "AvailabilityZone": "us-east-1a" } }, "Lifecycle": "on-demand", "InstanceIds": [ "i-5678901234abcdef0", "i-5432109876abcdef9" ] ] }

以下是啟動部分目標容量並附有未啟動之執行個體錯誤之類型 instant 的叢集輸出範例。

{ "FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE", "Errors": [ { "LaunchTemplateAndOverrides": { "LaunchTemplateSpecification": { "LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE", "Version": "1" }, "Overrides": { "InstanceType": "c4.xlarge", "AvailabilityZone": "us-east-1a", } }, "Lifecycle": "on-demand", "ErrorCode": "InsufficientInstanceCapacity", "ErrorMessage": "" }, ], "Instances": [ { "LaunchTemplateAndOverrides": { "LaunchTemplateSpecification": { "LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE", "Version": "1" }, "Overrides": { "InstanceType": "c5.large", "AvailabilityZone": "us-east-1a" } }, "Lifecycle": "on-demand", "InstanceIds": [ "i-1234567890abcdef0", "i-9876543210abcdef9" ] ] }

以下是未啟動任何執行個體之類型 instant 的叢集輸出範例。

{ "FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE", "Errors": [ { "LaunchTemplateAndOverrides": { "LaunchTemplateSpecification": { "LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE", "Version": "1" }, "Overrides": { "InstanceType": "c4.xlarge", "AvailabilityZone": "us-east-1a", } }, "Lifecycle": "on-demand", "ErrorCode": "InsufficientCapacity", "ErrorMessage": "" }, { "LaunchTemplateAndOverrides": { "LaunchTemplateSpecification": { "LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE", "Version": "1" }, "Overrides": { "InstanceType": "c5.large", "AvailabilityZone": "us-east-1a", } }, "Lifecycle": "on-demand", "ErrorCode": "InsufficientCapacity", "ErrorMessage": "" }, ], "Instances": [] }

建立取代 Spot 執行個體運作狀態不佳的 EC2 機群

EC2 Fleet 會每兩分鐘定期檢查機群中執行個體的運作狀態。執行個體的運作狀態會是 healthyunhealthy

EC2 Fleet 會根據 Amazon EC2 提供的狀態檢查資訊,來判定執行個體的運作狀態。如果執行個體狀態檢查或系統狀態檢查的運作狀態檢查,出現連續三次為 impaired,則該執行個體即為 unhealthy。如需詳細資訊,請參閱Amazon EC2 執行個體的狀態檢查

您可以設定機群以取代運作狀態不佳的 競價型執行個體。ReplaceUnhealthyInstances 設為 true 以後,在報告為 unhealthy 時,則 Spot 執行個體會被取代。當取代一個狀態不佳的 Spot 執行個體時,機群可能會低於其目標容量長達幾分鐘。

要求
  • 運作狀態檢查取代僅支援維持目標容量的 EC2 Fleet (類型 maintain 的機群),不支援類型 requestinstant 的機群。

  • 運作狀態檢查取代僅支援 競價型執行個體。此功能不支援 隨需執行個體。

  • 您可以設定 EC2 Fleet 只在建立執行個體時取代狀況不良的執行個體。

  • 使用者只有在擁有呼叫 ec2:DescribeInstanceStatus 動作的許可時,才能使用運作狀態檢查取代功能。

設定 EC2 Fleet 以取代運作狀態不佳的 競價型執行個體
  1. 使用資訊在 建立 EC2 Fleet 中建立 EC2 機群。

  2. 若要設定機群以取代運作狀態不佳的 Spot 執行個體,在 JSON 檔案中,針對 ReplaceUnhealthyInstances 請指定 true

檢視所有 EC2 機群組態選項

若要檢視 EC2 Fleet 組態參數的完整清單,您可以產生 JSON 檔案。如需每個參數的說明,請參閱 create-fleet

產生所有可能 EC2 機群參數的 JSON 檔案

使用 create-fleet (AWS CLI) 命令和 --generate-cli-skeleton 參數來產生 EC2 Fleet JSON 檔案,並將輸出導向至檔案以儲存它:

aws ec2 create-fleet \ --generate-cli-skeleton input > ec2createfleet.json

範例輸出

{ "DryRun": true, "ClientToken": "", "SpotOptions": { "AllocationStrategy": "price-capacity-optimized", "MaintenanceStrategies": { "CapacityRebalance": { "ReplacementStrategy": "launch" } }, "InstanceInterruptionBehavior": "hibernate", "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": "termination", "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateId": "", "LaunchTemplateName": "", "Version": "" }, "Overrides": [ { "InstanceType": "r5.metal", "MaxPrice": "", "SubnetId": "", "AvailabilityZone": "", "WeightedCapacity": 0.0, "Priority": 0.0, "Placement": { "AvailabilityZone": "", "Affinity": "", "GroupName": "", "PartitionNumber": 0, "HostId": "", "Tenancy": "dedicated", "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": "included", "BurstablePerformance": "required", "RequireHibernateSupport": true, "NetworkInterfaceCount": { "Min": 0, "Max": 0 }, "LocalStorage": "excluded", "LocalStorageTypes": [ "ssd" ], "TotalLocalStorageGB": { "Min": 0.0, "Max": 0.0 }, "BaselineEbsBandwidthMbps": { "Min": 0, "Max": 0 }, "AcceleratorTypes": [ "inference" ], "AcceleratorCount": { "Min": 0, "Max": 0 }, "AcceleratorManufacturers": [ "amd" ], "AcceleratorNames": [ "a100" ], "AcceleratorTotalMemoryMiB": { "Min": 0, "Max": 0 } } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 0, "OnDemandTargetCapacity": 0, "SpotTargetCapacity": 0, "DefaultTargetCapacityType": "on-demand", "TargetCapacityUnitType": "memory-mib" }, "TerminateInstancesWithExpiration": true, "Type": "instant", "ValidFrom": "1970-01-01T00:00:00", "ValidUntil": "1970-01-01T00:00:00", "ReplaceUnhealthyInstances": true, "TagSpecifications": [ { "ResourceType": "fleet", "Tags": [ { "Key": "", "Value": "" } ] } ], "Context": "" }