创建 EC2 实例集 - Amazon Elastic Compute Cloud

创建 EC2 实例集

要创建 EC2 实例集,请在 JSON 文件中定义实例集配置,然后使用 create-fleet 命令引用该文件。在 JSON 文件中,您必须指定实例集的总目标容量、竞价型实例和按需型实例的单独目标容量,以及用于定义实例集中实例配置(例如 AMI、实例类型、子网、可用区、一个或多个安全组)的启动模板。您可以选择指定其他配置,例如用于覆盖启动模板配置的参数、从 EC2 容量池中选择竞价型实例和按需型实例的分配策略,以及愿意为实例集支付的最高金额。有关更多信息,请参阅 EC2 实例集或竞价型实例集配置选项

EC2 实例集在有可用容量时启动按需型实例,在最高价超过竞价型实例价格并且有可用容量时启动竞价型实例。

如果实例集包含竞价型实例且类型为 maintain,Amazon EC2 会尝试在竞价型实例中断时维持实例集的目标容量。

EC2 队列限制

以下限制适用于 EC2 队列。

  • EC2 实例集仅可通过 Amazon EC2 APIAWS CLIAWS SDKAWS CloudFormation 创建。

  • EC2 队列请求不能跨 AWS 区域。您需要为每个区域创建单独的 EC2 队列。

  • EC2 队列请求不能跨同一可用区内的不同子网。

EC2 队列先决条件

启动模板

启动模板指定要启动的实例的相关配置信息,例如实例类型和可用区。有关启动模板的更多信息,请参阅在 Amazon EC2 启动模板中存储实例启动参数

EC2 队列的服务相关角色

AWSServiceRoleForEC2Fleet 角色授予 EC2 实例集权限以代表您请求、启动、终止和标记实例。Amazon EC2 使用此服务相关角色来完成以下操作:

  • ec2:RunInstances – 启动实例。

  • ec2:RequestSpotInstances – 请求 Spot 实例。

  • ec2:TerminateInstances – 终止实例。

  • ec2:DescribeImages:描述实例的亚马逊机器映像(AMI)。

  • ec2:DescribeInstanceStatus:描述实例的状态。

  • ec2:DescribeSubnets:描述实例的子网。

  • ec2:CreateTags – 将标签添加到 EC2 队列、实例和卷中。

确保此角色存在,然后才使用 AWS CLI 或 API 来创建 EC2 实例集。

注意

instant EC2 队列不需要此角色。

要创建该角色,请如下使用 IAM 控制台。

为 EC2 队列创建 AWSServiceRoleForEC2Fleet 角色
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择 Roles(角色)。

  3. 选择 Create role(创建角色)。

  4. 选择受信任的实体页面上,请执行以下操作:

    1. 可信实体类型中选择 AWS 服务

    2. 使用案例下,对于服务或使用案例,选择 EC2 - 实例集

      提示

      请务必选择 EC2 - 实例集。如果您选择 EC2,则 EC2 - 实例集使用案例不会出现在使用案例列表中。EC2 - 实例集使用案例将自动创建具有所需 IAM 权限的策略,并建议将 AWSServiceRoleForEC2Fleet 作为角色名称。

    3. 选择 Next(下一步)。

  5. 添加权限页面上,选择下一步

  6. 命名、检查并创建页面上,选择创建角色

如果您不再需要使用 EC2 队列,我们建议您删除 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 实例集用户的权限

如果用户打算创建或管理 EC2 实例集,请确保为其授予所需权限。

为 EC2 实例集创建策略
  1. 打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择策略

  3. 选择 Create policy

  4. 创建策略页面上,选择 JSON 选项卡,将文本替换为以下内容,并选择查看策略

    { "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 实例集角色以及调用 iam:ListInstanceProfiles 操作以枚举现有实例配置文件。

    (可选)要允许用户使用 IAM 控制台创建角色或实例配置文件,还必须在策略中添加以下操作:

    • iam:AddRoleToInstanceProfile

    • iam:AttachRolePolicy

    • iam:CreateInstanceProfile

    • iam:CreateRole

    • iam:GetRole

    • iam:ListPolicies

  5. 查看策略页面上,输入策略名称和描述,然后选择创建策略

  6. 要提供访问权限,请为您的用户、组或角色添加权限:

创建 EC2 实例集

要使用 EC2 实例集启动实例的实例集,只需在实例集请求中指定以下参数,实例集会使用其他参数的默认值:

  • LaunchTemplateIdLaunchTemplateName – 指定要使用的启动模板(其中包含要启动的实例的参数,例如实例类型和可用区)

  • TotalTargetCapacity – 指定机群的总目标容量

  • DefaultTargetCapacityType – 指定默认购买选项是按需型还是竞价型

要覆盖启动模板中指定的参数,可指定一个或多个覆盖。每个覆盖可以有不同的实例类型、可用区、子网和最高价,并且可以包含不同的权重容量。除了指定实例类型外,还可以指定实例必须具有的属性,Amazon EC2 将使用这些属性标识所有实例类型。有关更多信息,请参阅指定 EC2 实例集或竞价型实例集的实例类型选择属性

对于 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": [] }

创建 EC2 实例集来替换运行状况不佳的竞价型实例

EC2 队列每 2 分钟检查一次队列中实例的运行状况。实例的运行状况为 healthyunhealthy

EC2 队列 将使用 Amazon EC2 提供的状态检查来确定实例的运行状况。如果在连续三次运行状况检查中,实例状态检查或系统状态检查的状态有任一项为 unhealthy,则确定该实例的运行状况为 impaired。有关更多信息,请参阅Amazon EC2 实例的状态检查

您可以配置您的队列以替换运行状况不佳的竞价型实例。将 ReplaceUnhealthyInstances 设置为 true 以后,若竞价型实例报告为 unhealthy 则将其替换。在替换运行状况不佳的竞价型实例时,队列可能在几分钟内降至其目标容量之下。

要求
  • 仅对保持目标容量的 EC2 队列(类型 maintain 的队列)支持运行状况检查替换,不支持类型为 requestinstant 的队列。

  • 仅对竞价型实例支持运行状况检查替换。对于 按需型实例 不支持此功能。

  • 您可以将 EC2 队列配置为仅在您创建它时替换运行状况不佳的实例。

  • 用户仅在其有权调用 ec2:DescribeInstanceStatus 操作时才能使用运行状况检查替换。

配置 EC2 实例集 以替换运行状况不佳的竞价型实例
  1. 使用创建 EC2 实例集中用于创建 EC2 实例集的信息。

  2. 要将实例集配置为替换运行状况不佳的竞价型实例,请在 JSON 文件中将 ReplaceUnhealthyInstances 指定 true

查看所有的 EC2 实例集配置选项

要查看 EC2 机群配置参数的完整列表,可以生成 JSON 文件。有关每个参数的描述,请参阅 create-fleet

通过所有可能的 EC2 实例集参数生成 JSON 文件

使用 create-fleet (AWS CLI) 命令和 --generate-cli-skeleton 参数生成 EC2 机群 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": "" }