创建 EC2 实例集 - Amazon Elastic Compute Cloud

创建 EC2 实例集

要创建 EC2 实例集,请在 JSON 文件中定义实例集配置,然后使用 create-fleet AWS CLI 命令引用该文件。在 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(AWS CLI)命令创建实例集,并指定包含实例集配置参数的 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 文件。有关每个参数的说明,请参阅 AWS CLI 命令参考中的 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": "" }