使用 Spot 队列 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Spot 队列

要开始使用 Spot 队列,请创建一个 Spot 队列请求,其中包括目标容量、可选的按需部分、实例的一个或多个启动规范以及您愿意支付的最高价。队列请求必须包括定义队列启动实例所需信息(例如 AMI、实例类型、子网或可用区、一个或多个安全组)的启动规范。

如果队列包括竞价型实例,Amazon EC2 将尝试在 Spot 价格变化时保持队列的目标容量。

提交一次性请求后,其目标容量则无法修改。要更改目标容量,请取消请求并重新提交新请求。

Spot 队列请求在过期或您取消它之前保持有效。当您取消实例集请求时,您可以指定取消该请求是否终止该队列中的 Spot 实例。

Spot 队列请求状态

Spot 队列请求可以处于以下某种状态:

  • submitted – 正在评估竞价型实例集请求,并且 Amazon EC2 正准备启动目标数量的实例。如果请求超出竞价型实例集限制,则会被立即取消。

  • active – 已验证竞价型实例集,并且 Amazon EC2 正在尝试维护目标数量的正在运行的竞价型实例。请求会保持此状态,直到修改或取消它。

  • modifying – 竞价型实例集请求正在修改中。请求将保持该状态,直到完全处理修改或取消了 Spot 队列。无法修改一次性 request,并且这一状态不适用于此类 Spot 请求。

  • cancelled_running – 竞价型实例集已取消且不启动其他竞价型实例。其现有竞价型实例继续运行,直至被中断或终止。请求会保持此状态,直到所有实例都已中断或终止。

  • cancelled_terminating – 竞价型实例集已取消且其竞价型实例正在终止。请求会保持此状态,直到所有实例都已终止。

  • cancelled – 竞价型实例集已取消且没有正在运行的竞价型实例。Spot 队列请求将在其实例终止两天后被删除。

Spot 队列运行状况检查

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

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

您可以配置您的队列以替换运行状况不佳的竞价型实例。启用运行状况检查替换后,如果竞价型实例被报告为 unhealthy,则会被替换。在替换运行状况不佳的竞价型实例时,队列的容量可能在几分钟内降至其目标容量之下。

要求
  • 只有在保持目标容量(类型 maintain 的队列)的情况下 Spot 队列 才支持运行状况检查替换,而不支持一次性 Spot 队列(类型 request 的队列)。

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

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

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

Console
使用控制台配置竞价型实例集以替换运行状况不佳的竞价型实例
  1. 按创建 Spot 队列的步骤操作。有关更多信息,请参阅使用已定义的参数创建 Spot 队列请求(控制台)

  2. 要配置队列以替换运行状况不佳的 Spot 实例,请为 Health check(运行状况检查)选择 Replace unhealthy instances(替换运行状况不佳的实例)。要启用此选项,您必须先选择 Maintain target capacity (保持目标容量)

Amazon CLI
使用 Amazon CLI 配置竞价型实例集以替换运行状况不佳的竞价型实例
  1. 按创建 Spot 队列的步骤操作。有关更多信息,请参阅使用 Amazon CLI 创建竞价型实例集

  2. 要配置队列以替换运行状况不佳的 Spot 实例,对于 ReplaceUnhealthyInstances,请输入 true

Spot 队列权限

如果用户打算创建或管理竞价型实例集,您需要为其授予所需权限。

如果您使用 Amazon EC2 控制台创建竞价型实例集,将创建两个名为 AWSServiceRoleForEC2SpotFleetAWSServiceRoleForEC2Spot 的服务相关角色和一个名为 aws-ec2-spot-fleet-tagging-role 的角色,这些角色为竞价型实例集授予代表您请求、启动、终止和标记资源的权限。如果您使用 Amazon CLI 或 API,您必须确保这些角色存在。

按照以下说明授予所需的权限并创建角色。

向用户授予竞价型实例集权限

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

为竞价型实例集创建策略
  1. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

  2. 在导航窗格中,选择 PoliciesCreate policy

  3. Create policy (创建策略) 页面上,选择 JSON,然后将文本替换为以下内容。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances", "ec2:CreateTags", "ec2:RequestSpotFleet", "ec2:ModifySpotFleetRequest", "ec2:CancelSpotFleetRequests", "ec2:DescribeSpotFleetRequests", "ec2:DescribeSpotFleetInstances", "ec2:DescribeSpotFleetRequestHistory" ], "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::*:role/aws-ec2-spot-fleet-tagging-role" }, { "Effect": "Allow", "Action": [ "iam:CreateServiceLinkedRole", "iam:ListRoles", "iam:ListInstanceProfiles" ], "Resource": "*" } ] }

    上述示例策略为用户授予多数竞价型实例集使用案例所需的权限。要将用户限制为特定的 API 操作,请仅指定这些 API 操作。

    所需的 EC2 和 IAM API

    必须在策略中包含以下 API:

    • ec2:RunInstances – 需要其启动竞价型实例集中的实例

    • ec2:CreateTags – 需要其标记竞价型实例集请求、实例或卷

    • iam:PassRole – 需要其指定竞价型实例集角色

    • iam:CreateServiceLinkedRole – 需要其创建服务相关角色

    • iam:ListRoles – 需要其枚举现有的 IAM 角色

    • iam:ListInstanceProfiles – 需要其枚举现有的实例配置文件

    重要

    如果您在启动规范或启动模板中为 IAM 实例配置文件指定角色,则必须授予用户将该角色传递给服务的权限。为此,在 IAM policy 中,包括 "arn:aws:iam::*:role/IamInstanceProfile-role" 作为 iam:PassRole 操作的资源。有关更多信息,请参阅 IAM 用户指南中的向用户授予将角色传递给 Amazon 服务的权限

    竞价型实例集 API

    根据需要,将以下 Spot 队列 API 操作添加到策略中:

    • ec2:RequestSpotFleet

    • ec2:ModifySpotFleetRequest

    • ec2:CancelSpotFleetRequests

    • ec2:DescribeSpotFleetRequests

    • ec2:DescribeSpotFleetInstances

    • ec2:DescribeSpotFleetRequestHistory

    可选的 IAM API

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

    • iam:AddRoleToInstanceProfile

    • iam:AttachRolePolicy

    • iam:CreateInstanceProfile

    • iam:CreateRole

    • iam:GetRole

    • iam:ListPolicies

  4. 选择查看策略

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

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

Spot 队列的服务相关角色

Amazon EC2 使用服务相关角色获取代表您调用其他Amazon服务所需的权限。服务相关角色是一种独特类型的 IAM 角色,它与Amazon服务直接相关。服务相关角色提供了一种将权限委托给 Amazon 服务的安全方式,因为只有相关服务才能担任服务相关角色。有关更多信息,请参阅《 IAM 用户指南》中的使用服务相关角色

Amazon EC2 使用名为 AWSServiceRoleForEC2SpotFleet 的服务相关角色代表您启动和管理实例。

重要

如果在竞价型实例集中指定加密的 AMI 或加密的 Amazon EBS 快照,则必须为 AWSServiceRoleForEC2SpotFleet 角色授予使用该 CMK 的权限,以便 Amazon EC2 可以代表您启动实例。有关更多信息,请参阅授予对用于加密的 AMI 和 EBS 快照的 CMK 的访问权限

AWSServiceRoleForEC2SpotFleet 授予的权限

Amazon EC2 使用 AWSServiceRoleForEC2SpotFleet 完成以下操作:

  • ec2:RequestSpotInstances - 请求 Spot 实例

  • ec2:RunInstances - 启动实例

  • ec2:TerminateInstances - 终止实例

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

  • ec2:DescribeInstanceStatus - 监控实例的状态。

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

  • ec2:CreateTags – 在竞价型实例集请求、实例和卷中添加标签

  • elasticloadbalancing:RegisterInstancesWithLoadBalancer - 将指定的实例添加到指定的负载均衡器

  • elasticloadbalancing:RegisterTargets - 向指定目标组注册指定目标

创建服务相关角色

在大多数情况下,无需手动创建服务相关角色。Amazon EC2 在您首次使用控制台创建 Spot 队列时创建 AWSServiceRoleForEC2SpotFleet 服务相关角色。

如果在 2017 年 10 月之前具有活动 Spot 队列请求(此时 Amazon EC2 开始支持该服务相关角色),则 Amazon EC2 在您的Amazon账户中创建 AWSServiceRoleForEC2SpotFleet 角色。有关更多信息,请参阅 IAM 用户指南中的我的Amazon账户中出现新角色

如果您使用 Amazon CLI 或 API 来创建竞价型实例集,则必须确保此角色存在。

要使用控制台创建 AWSServiceRoleForEC2SpotFleet
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

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

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

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

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

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

    3. 对于使用案例,选择 EC2 - 竞价型实例集

    4. 选择下一步

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

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

要使用 Amazon CLI 创建 AWSServiceRoleForEC2SpotFleet

如下所示使用 create-service-linked-role 命令。

aws iam create-service-linked-role --aws-service-name spotfleet.amazonaws.com

如果您不再需要使用 Spot 队列,我们建议您删除 AWSServiceRoleForEC2SpotFleet 角色。从您的账户中删除该角色后,如果您使用控制台请求 Spot 队列,Amazon EC2 将再次创建该角色。有关更多信息,请参阅《IAM 用户指南》中的删除服务相关角色

授予对用于加密的 AMI 和 EBS 快照的 CMK 的访问权限

如果在竞价型实例集请求中指定加密的 AMI 或加密的 Amazon EBS 快照,并且您使用客户托管的密钥进行加密,则必须为 AWSServiceRoleForEC2SpotFleet 角色授予使用该 CMK 的权限,以便 Amazon EC2 可以代表您启动实例。为此,您必须在 CMK 中添加授权,如以下过程中所示。

在提供权限时,授权是密钥策略的替代方法。有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的使用授权在 Amazon KMS 中使用密钥策略

为 AWSServiceRoleForEC2SpotFleet 角色授予使用 CMK 的权限
  • 使用 create-grant 命令在 CMK 中添加授权,并指定授予权限的委托人(AWSServiceRoleForEC2SpotFleet 服务相关角色)以执行授权允许的操作。CMK 是由 key-id 参数和 CMK 的 ARN 指定的。委托人是由 grantee-principal 参数和 AWSServiceRoleForEC2SpotFleet 服务相关角色的 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/AWSServiceRoleForEC2SpotFleet \ --operations "Decrypt" "Encrypt" "GenerateDataKey" "GenerateDataKeyWithoutPlaintext" "CreateGrant" "DescribeKey" "ReEncryptFrom" "ReEncryptTo"

竞价型实例的服务相关角色

Amazon EC2 使用名为 AWSServiceRoleForEC2Spot 的服务相关角色代表您启动和管理 Spot 实例。有关更多信息,请参阅竞价型实例请求的服务相关角色

用于标记 Spot 队列的 IAM 角色

aws-ec2-spot-fleet-tagging-role IAM 角色授予竞价型实例集标记竞价型实例集请求、实例和卷的权限。有关更多信息,请参阅标记 Spot 队列

重要

如果您选择在实例集中标记实例并选择保持目标容量(竞价型实例集请求属于类型 maintain),用户与 IamFleetRole 的权限差异可能会导致实例集中实例的标记行为不一致。如果 IamFleetRole 不包含 CreateTags 权限,则可能不会标记由队列启动的某些实例。虽然我们正在努力修复这种不一致性,但为了确保队列启动的所有实例都被标记,我们建议您为 aws-ec2-spot-fleet-tagging-role 使用 IamFleetRole 角色。或者,要使用现有角色,请将 AmazonEC2SpotFleetTaggingRole Amazon 托管策略附加到现有角色。否则,您需要手动将 CreateTags 权限添加到现有策略。

创建用于标记 Spot 队列的 IAM 角色
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

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

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

  4. Select trusted entity(选择可信实体)页面中,在 Trusted entity type(可信实体类型)下选择 service(Amazon 服务)。

  5. 使用案例下,从其他 Amazon 服务的使用案例中选择 EC2,然后选择 EC2 – 竞价型实例集标记

  6. 选择下一步

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

  8. Name, review, and create(命名、检查和创建)页面上,对于 Role name(角色名称),输入角色的名称(例如 aws-ec2-spot-fleet-tagging-role)。

  9. 检查此页面上的信息,然后选择 Create role(创建角色)。

防止跨服务混淆座席

混淆代理问题是一个安全问题,即没有执行操作权限的实体可能会迫使更具权限的实体执行该操作。我们建议在 aws-ec2-spot-fleet-tagging-role 信任策略中使用 aws:SourceArnaws:SourceAccount 全局条件上下文键,以限制竞价型实例集为其他服务提供的资源访问权限。

将 aws:SourceArn 和 aws:SourceAccount 条件键添加到 aws-ec2-spot-fleet-tagging-role 信任策略
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择角色

  3. 查找您之前创建的 aws-ec2-spot-fleet-tagging-role,然后选择该链接(不是复选框)。

  4. Summary(摘要)下,选择 Trust relationships(信任关系)选项卡,然后选择 Edit trust policy(编辑信任策略)。

  5. 在 JSON 语句中,添加一个包含您的 aws:SourceAccountaws:SourceArn 全局条件上下文键的 Condition 元素,以防止混淆代理人问题,如下所示:

    "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:ec2:us-east-1:account_id:spot-fleet-request/sfr-*" }, "StringEquals": { "aws:SourceAccount": "account_id" }
    注意

    如果 aws:SourceArn 值包含账户 ID,并且您同时使用了这两个全局条件上下文键,则 aws:SourceAccount 值和 aws:SourceArn 值中的账户在同一策略语句中使用时,必须使用相同的账户 ID。

    最终的信任策略将如下所示:

    { "Version": "2012-10-17", "Statement": { "Sid": "ConfusedDeputyPreventionExamplePolicy", "Effect": "Allow", "Principal": { "Service": "spotfleet.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:ec2:us-east-1:account_id:spot-fleet-request/sfr-*" }, "StringEquals": { "aws:SourceAccount": "account_id" } } } }
  6. 选择更新策略

下表提供了 aws:SourceArn 的潜在值,以根据不同的明确程度限制 aws-ec2-spot-fleet-tagging-role 的范围。

API 操作 调用的服务 范围 aws:SourceArn
RequestSpotFleet Amazon STS (AssumeRole) aws-ec2-spot-fleet-tagging-role 上的 AssumeRole 功能限定为指定账户中的竞价型实例集请求。 arn:aws:ec2:*:123456789012:spot-fleet-request/sfr-*
RequestSpotFleet Amazon STS (AssumeRole) aws-ec2-spot-fleet-tagging-role 上的 AssumeRole 功能限定为指定账户和指定区域中的竞价型实例集请求。请注意,此角色将不能在其他区域使用。 arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-*
RequestSpotFleet Amazon STS (AssumeRole) aws-ec2-spot-fleet-tagging-role 上的 AssumeRole 功能限定为仅影响实例集 sfr-11111111-1111-1111-1111-111111111111 的操作。请注意,此角色可能无法用于其他竞价型实例集。此外,此角色不能用于通过请求竞价型实例集来启动任何新的竞价型实例集。 arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-11111111-1111-1111-1111-111111111111

创建 Spot 队列请求

使用 Amazon Web Services Management Console 快速创建竞价型实例集请求,只需选择您的应用程序或任务需要及最低计算规格即可。Amazon EC2 会配置一个最符合您需求并遵循 Spot 最佳实践的队列。有关更多信息,请参阅快速创建 Spot 队列请求(控制台)。否则,您可以修改任意默认设置。有关更多信息,请参阅使用已定义的参数创建 Spot 队列请求(控制台)使用 Amazon CLI 创建竞价型实例集

快速创建 Spot 队列请求(控制台)

按照以下步骤快速创建 Spot 队列请求。

使用推荐设置创建 Spot 队列请求(控制台)
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,请选择 Spot Requests

  3. 如果您是首次接触 Spot,则会看到一个欢迎页面;请选择 Get started。否则,请选择 Request Spot 实例 (请求 Spot 实例)

  4. Launch parameters(启动参数)下,选择 Manually configure launch parameters(手动配置启动参数)。

  5. 对于 AMI,选择一个 AMI。

  6. Target capacity(目标容量)下,对于 Total target capacity(总目标容量),请指定要请求的单位数。对于单位类型,您可以选择 Instances(实例)、vCPUMemory (MiB)(内存 (MiB))。

  7. 对于 Your fleet request at a glance(您的机群请求概览),查看您的机群配置,然后选择 Launch(启动)。

使用已定义的参数创建 Spot 队列请求(控制台)

您可以使用自己定义的参数创建竞价型实例集。

使用已定义的参数创建 Spot 队列请求(控制台)
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,请选择 Spot Requests

  3. 如果您是首次接触 Spot,则会看到一个欢迎页面;请选择 Get started。否则,请选择 Request Spot 实例 (请求 Spot 实例)

  4. 对于 Launch parameters(启动参数),请执行以下操作:

    1. 要在 Spot 控制台中定义启动参数,请选择 Manually configure launch parameters(手动配置启动参数)。

    2. 对于 AMI,选择 Amazon 提供的基本 AMI,或者选择 Search for AMI(搜索 AMI)以使用来自我们用户社群、Amazon Web Services Marketplace 或您自己的 AMI。

    3. (可选)对于 Key pair name (密钥对名称),选择现有密钥对或新建一个密钥对。

      [现有密钥对] 选择所需的密钥对。

      [新密钥对] 选择 Create new key pair(创建新密钥对)以前往 Key Pairs(密钥对)页面。完成之后,返回 Spot Requests(竞价型请求)页面并刷新列表。

    4. (可选)展开 Additional launch parameters(其它启动参数),然后执行以下操作:

      1. (可选)要启用 Amazon EBS 优化,对于 EBS-optimized(EBS 优化),请选择 Launch EBS-optimized instances(启动 EBS 优化实例)。

      2. (可选)要为实例添加临时性块级存储,请对 Instance store (实例存储) 选择 Attach at launch (启动时附加)

      3. (可选)要添加存储,请选择 Add new volume(添加新卷),然后根据实例类型指定其它实例存储卷或 Amazon EBS 卷。

      4. (可选) 默认情况下,已为您的实例启用基本监控。要启用详细监控,对于 Monitoring(监控),请选择 Enable CloudWatch detailed monitoring(启用 CloudWatch 详细监控)。

      5. (可选)要运行专用 Spot 实例,请为 Tenancy (租期) 选择 Dedicated - run a dedicated instance (专用 – 运行专用实例)

      6. (可选)对于 Security groups (安全组),选择一个或多个安全组,或者新建一个。

        [现有安全组] 选择一个或多个所需的安全组。

        [新安全组] 选择 Create new security group(新建安全组)以前往 Security Groups(安全组)页面。完成之后,返回 Spot Requests(Spot 请求)并刷新列表。

      7. (可选)要能够通过 Internet 访问实例,请对 Auto-assign IPv4 Public IP (自动分配 IPv4 公有 IP) 选择 Enable (启用)

      8. (可选)要使用 IAM 角色启动 Spot 实例,请对 IAM 实例配置文件选择角色。

      9. (可选) 要运行启动脚本,请将其复制到 User data

      10. (可选)要添加标签,请选择 Create tag(创建标签),输入标签的键和值,然后选择 Create(创建)。对每个标签重复此操作。

        对于每个标签,要使用相同标签标记实例和竞价型实例集请求,请确保同时选择了 Instance(实例)和 Fleet(机群)。要仅标记由队列启动的实例,清除 Fleet(队列)。要仅标记竞价型实例集请求,请清除 Instance(实例)。

  5. 对于 Additional request details (其他请求详细信息),执行以下操作:

    1. 查看其他请求详细信息。要进行更改,请清除 Apply defaults (应用默认设置)

    2. (可选)对于 IAM fleet role (IAM 队列角色),您可以使用默认角色或选择其他角色。要在更改角色后使用默认角色,请选择 Use default role (使用默认角色)

    3. (可选)对于 Maximum price (最高价),您可以使用默认最高价(按需价格),也可以指定您愿意支付的最高价。如果您的最高价低于选定的实例类型的 Spot 价格,则不会启动您的竞价型实例。

    4. (可选) 要创建仅在特定时间段内有效的请求,请编辑请求有效起始时间请求有效截止时间

    5. (可选)默认情况下,我们会在竞价型实例集请求过期时终止竞价型实例。要保持这些实例在请求过期后继续运行,请清除 Terminate the instances when the request expires (请求到期时终止实例)

    6. (可选)要向负载均衡器注册 Spot 实例,请选择 Receive traffic from one or more load balancers (从一个或多个负载均衡器接收流量),然后选择一个或多个经典负载均衡器或目标组。

  6. 对于 Minimum compute unit (最小计算单位),选择您的应用程序或任务所需的最低硬件规格(vCPU、内存和存储),即 as specs (按规格)as an instance type (按实例类型)

    • 对于 as specs (按规格),请指定所需的 vCPUs 数和内存量。

    • 对于 as an instance type (按实例类型),接受默认实例类型,或者选择 Change instance type (更改实例类型) 以选择其他实例类型。

  7. 对于 Target capacity(目标容量),执行以下操作:

    1. 对于 Total target capacity(总目标容量),请指定要请求的单位数。对于单位类型,您可以选择 Instances(实例)、vCPUMemory (MiB)(内存 (MiB))。要将目标容量指定为 0 以便以后可增加容量,请选择 Maintain target capacity (保持目标容量)

    2. (可选)对于 Include On-Demand base capacity(包括按需基本容量),请指定要请求的按需单位数。该数字必须小于 Total target capacity (总目标容量)。Amazon EC2 会计算差值,并将差值分配给要请求的 Spot 单位。

      重要

      要指定可选的按需容量,您必须先选择一个启动模板。

    3. (可选) 预设情况下,在竞价型实例中断时,Spot 服务将终止这些实例。要保持目标容量,请选择保持目标容量。这样,您就可以指定 Spot 服务在竞价型实例中断时终止、停止或休眠这些实例。为此,请从中断行为中选择相应的选项。

    4. (可选)要允许竞价型实例集在系统针对实例集中的现有竞价型实例发出实例再平衡通知时启动替换竞价型实例,请选择 Capacity rebalance(容量再平衡),然后选择实例替换策略。如果选择 Launch before terminate(终止前启动),请指定竞价型实例集终止旧实例之前的延迟(以秒为单位)。有关更多信息,请参阅容量再平衡

    5. (可选)要控制每小时为队列中所有的 Spot 实例支付的金额,请选择 Set maximum cost for Spot Instances(设置 Spot 实例的最大成本),然后输入您每小时愿意支付的最大总额。当达到最大总额后,即使未达到目标容量,竞价型实例集也会停止启动竞价型实例。有关更多信息,请参阅控制支出

  8. 对于 Network(网络),执行以下操作:

    1. 对于 Network (网络),选择现有 VPC 或新建一个。

      [现有 VPC] 选择所需的 VPC。

      [新 VPC] 选择 Create new VPC (新建 VPC) 以前往 Amazon VPC 控制台。完成之后,请返回向导并刷新列表。

    2. (可选)对于 Availability Zone (可用区),让 Amazon 为 Spot 实例选择可用区,或者指定一个或多个可用区。

      如果您在一个可用区中有多个子网,则请从 Subnet (子网) 中选择合适的子网。要添加子网,请选择 Create new subnet (新建子网) 以前往 Amazon VPC 控制台。完成之后,请返回向导并刷新列表。

  9. 对于 Instance type requirements(实例类型要求),可以指定实例属性,然后让 Amazon EC2 使用这些属性识别最佳实例类型,也可以指定实例列表。有关更多信息,请参阅竞价型实例集的基于属性的实例类型选择

    1. 如果选择 Specify instance attributes that match your compute requirements(指定符合计算要求的实例属性),请按如下方式指定实例属性:

      1. 对于 vCPU,请输入所需的最小和最大 vCPU 数。要指定没有限制,请选择 No minimum(没有最小值)和/或 No maximum(没有最大值)。

      2. 对于 Memory (GiB)(内存 (GiB)),输入所需的最小和最大内存量。要指定没有限制,请选择 No minimum(没有最小值)和/或 No maximum(没有最大值)。

      3. (可选)对于 Additional instance attributes(其它实例属性),您可以选择指定一个或多个属性以更详细地表达计算要求。每个额外属性都会进一步增加对您的请求的限制。您可以省略其它属性;如果省略,则使用默认值。有关每个属性及其默认值的描述,请参阅 Amazon EC2 命令行参考中的 get-spot-placement-scores

      4. (可选)要查看具有指定属性的实例类型,请展开 Preview matching instance types(预览匹配的实例类型)。要排除在请求中使用的实例类型,请选择实例,然后选择 Exclude selected instance types(排除选定的实例类型)。

    2. 如果选择 Manually select instance types(手动选择实例类型),竞价型实例集将提供实例类型默认列表。要选择更多实例类型,请选择 Add instance types(添加实例类型),选择要在请求中使用的实例类型,然后选择 Select(选择)。要删除实例类型,请选择实例类型,然后选择 Delete(删除)。

  10. 对于 Allocation strategy(分配策略),选择满足您的需求的策略。有关更多信息,请参阅竞价型实例的分配策略

  11. 对于 Your fleet request at a glance(您的机群请求概览),查看您的机群配置,并在必要时进行任何调整。

  12. (可选)要下载一个启动配置副本以用于 Amazon CLI,请选择 JSON config (JSON 配置)

  13. 选择 Launch

    竞价型实例集请求类型为 fleet。执行请求后,系统会添加请求类型 instance,此时其状态为 activefulfilled

使用 Amazon CLI 创建竞价型实例集

使用 Amazon CLI 创建竞价型实例集请求
aws ec2 request-spot-fleet --spot-fleet-request-config file://config.json

有关示例配置文件,请参阅Spot 队列示例配置

下面是示例输出:

{ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" }

标记 Spot 队列

要对您的 Spot 队列请求进行分类和管理,您可使用自定义元数据标记它们。您可以在创建 Spot 队列请求时或之后为其分配标签。您可以使用 Amazon EC2 控制台或命令行工具分配标签。

在标记 Spot 队列请求时,不会自动标记 Spot 队列启动的实例和卷。您需要明确标记 Spot 队列启动的实例和卷。您可以选择仅将标签分配给 Spot 队列请求,仅分配给队列启动的实例,仅分配给附加到队列启动的实例的卷,或者分配给所有这三种内容。

注意

仅附加到按需型实例的卷支持卷标签。您无法标记附加到竞价型实例的卷。

有关标签的工作原理的更多信息,请参阅标记 Amazon EC2 资源

先决条件

授予用户标记资源的权限。有关更多信息,请参阅示例:标记资源

授予用户标记资源的权限

创建包含以下内容的 IAM policy:

  • ec2:CreateTags 操作。这将授予用户创建标签的权限。

  • ec2:RequestSpotFleet 操作。这将授予用户创建竞价型实例集请求的权限。

  • 对于 Resource,您必须指定 "*"。这允许用户标记所有资源类型。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "TagSpotFleetRequest", "Effect": "Allow", "Action": [ "ec2:CreateTags", "ec2:RequestSpotFleet" ], "Resource": "*" } ] }
重要

对于 spot-fleet-request 资源,我们目前不支持资源级权限。如果您指定 spot-fleet-request 以作为资源,在您尝试标记队列时,将会发生未经授权异常。以下示例说明如何 设置策略。

{ "Effect": "Allow", "Action": [ "ec2:CreateTags", "ec2:RequestSpotFleet" ], "Resource": "arn:aws:ec2:us-east-1:111122223333:spot-fleet-request/*" }

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

标记新的 Spot 队列

使用控制台标记新的 Spot 队列请求
  1. 按照使用已定义的参数创建 Spot 队列请求(控制台)过程操作。

  2. (可选)要添加标签,请展开 Additional configurations (其他配置),选择 Add new tag (添加新标签),然后输入标签的键和值。对每个标签重复此操作。

    对于每个标签,您可以使用相同标签标记 Spot 队列请求和实例。要对两者进行标记,请确保同时选择 Instance tags (实例标签)Fleet tags (队列标签)。要仅标记 Spot 队列请求,请清除 Instance tags (实例标签)。要仅标记由队列启动的实例,请清除 Fleet tags (队列标签)

  3. 填写必填字段以创建 Spot 队列请求,然后选择 Launch (启动)。有关更多信息,请参阅使用已定义的参数创建 Spot 队列请求(控制台)

使用 Amazon CLI 标记新的竞价型实例集请求

要在创建 Spot 队列请求时标记该请求,请按以下方式配置 Spot 队列请求配置:

  • SpotFleetRequestConfig 中指定竞价型实例集请求的标签。

  • 对于 ResourceType,请指定 spot-fleet-request。如果指定其他值,队列请求将失败。

  • 对于 Tags,请指定键值对。您可以指定多个键值对。

在以下示例中,使用两个标签来标记 Spot 队列请求:键=环境,值=生产;键=成本中心,值=123。

{ "SpotFleetRequestConfig": { "AllocationStrategy": "lowestPrice", "ExcessCapacityTerminationPolicy": "default", "IamFleetRole": "arn:aws:iam::111122223333:role/aws-ec2-spot-fleet-tagging-role", "LaunchSpecifications": [ { "ImageId": "ami-0123456789EXAMPLE", "InstanceType": "c4.large" } ], "SpotPrice": "5", "TargetCapacity": 2, "TerminateInstancesWithExpiration": true, "Type": "maintain", "ReplaceUnhealthyInstances": true, "InstanceInterruptionBehavior": "terminate", "InstancePoolsToUseCount": 1, "TagSpecifications": [ { "ResourceType": "spot-fleet-request", "Tags": [ { "Key": "Environment", "Value":"Production" }, { "Key": "Cost-Center", "Value":"123" } ] } ] } }

标记新的 Spot 队列及其启动的实例和卷

标记新的竞价型实例集请求及其使用 Amazon CLI 启动的实例和卷

要在创建 Spot 队列请求时标记该请求,并在队列启动实例和卷时标记它们,请按以下方式配置 Spot 队列请求配置:

Spot 队列请求标签:
  • SpotFleetRequestConfig 中指定竞价型实例集请求的标签。

  • 对于 ResourceType,请指定 spot-fleet-request。如果指定其他值,队列请求将失败。

  • 对于 Tags,请指定键值对。您可以指定多个键值对。

实例标签:
  • LaunchSpecifications 中的实例指定标签。

  • 对于 ResourceType,请指定 instance。如果指定其他值,队列请求将失败。

  • 对于 Tags,请指定键值对。您可以指定多个键值对。

    或者,您可以在 Spot 队列请求中引用的启动模板中为实例指定标签。

卷标签:
  • 在 Spot 队列请求中引用的启动模板中为卷指定标签。不支持 LaunchSpecifications 中的卷标记。

在以下示例中,使用两个标签来标记 Spot 队列请求:键=环境,值=生产;键=成本中心,值=123。由队列启动的实例使用一个标签(与 Spot 队列请求的其中一个标签相同)进行标记:键=成本中心,值=123。

{ "SpotFleetRequestConfig": { "AllocationStrategy": "lowestPrice", "ExcessCapacityTerminationPolicy": "default", "IamFleetRole": "arn:aws:iam::111122223333:role/aws-ec2-spot-fleet-tagging-role", "LaunchSpecifications": [ { "ImageId": "ami-0123456789EXAMPLE", "InstanceType": "c4.large", "TagSpecifications": [ { "ResourceType": "instance", "Tags": [ { "Key": "Cost-Center", "Value": "123" } ] } ] } ], "SpotPrice": "5", "TargetCapacity": 2, "TerminateInstancesWithExpiration": true, "Type": "maintain", "ReplaceUnhealthyInstances": true, "InstanceInterruptionBehavior": "terminate", "InstancePoolsToUseCount": 1, "TagSpecifications": [ { "ResourceType": "spot-fleet-request", "Tags": [ { "Key": "Environment", "Value":"Production" }, { "Key": "Cost-Center", "Value":"123" } ] } ] } }
使用 Amazon CLI 标记由竞价型实例集启动的实例

要在队列启动实例时标记实例,您可以在 Spot 队列请求中引用的启动模板中指定标记,也可以在 Spot 队列请求配置中指定标记,如下所示:

  • LaunchSpecifications 中的实例指定标签。

  • 对于 ResourceType,请指定 instance。如果指定其他值,队列请求将失败。

  • 对于 Tags,请指定键值对。您可以指定多个键值对。

在以下示例中,由队列启动的实例使用一个标签进行标记:键=成本中心,值=123。

{ "SpotFleetRequestConfig": { "AllocationStrategy": "lowestPrice", "ExcessCapacityTerminationPolicy": "default", "IamFleetRole": "arn:aws:iam::111122223333:role/aws-ec2-spot-fleet-tagging-role", "LaunchSpecifications": [ { "ImageId": "ami-0123456789EXAMPLE", "InstanceType": "c4.large", "TagSpecifications": [ { "ResourceType": "instance", "Tags": [ { "Key": "Cost-Center", "Value": "123" } ] } ] } ], "SpotPrice": "5", "TargetCapacity": 2, "TerminateInstancesWithExpiration": true, "Type": "maintain", "ReplaceUnhealthyInstances": true, "InstanceInterruptionBehavior": "terminate", "InstancePoolsToUseCount": 1 } }
使用 Amazon CLI 标记挂载至由竞价型实例集启动的按需型实例的卷

要在队列创建卷时标记这些卷,您必须在 Spot 队列请求中引用的启动模板中指定标签。

注意

仅附加到按需型实例的卷支持卷标签。您无法标记附加到竞价型实例的卷。

不支持 LaunchSpecifications 中的卷标记。

标记现有的 Spot 队列

使用控制台标记现有 Spot 队列请求

创建 Spot 队列请求后,您可以使用控制台向队列请求添加标签。

  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,请选择 Spot Requests

  3. 选择 Spot 队列请求。

  4. 选择 Tags (标签) 选项卡,然后选择 Create Tag (创建标签)

使用 Amazon CLI 标记现有竞价型实例集请求

可以使用 create-tags 命令标记现有的资源。在以下示例中,使用以下标签标记现有 Spot 队列请求:键=目的,值=测试。

aws ec2 create-tags \ --resources sfr-11112222-3333-4444-5555-66666EXAMPLE \ --tags Key=purpose,Value=test

查看 Spot 队列请求标签

使用控制台查看 Spot 队列请求标签
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,请选择 Spot Requests

  3. 选择您的 Spot 队列请求并选择 Tags (标签) 选项卡。

描述 Spot 队列请求标记

使用 describe-tags 命令可查看指定资源的标签。在以下示例中,您将描述指定 Spot 队列请求的标签。

aws ec2 describe-tags \ --filters "Name=resource-id,Values=sfr-11112222-3333-4444-5555-66666EXAMPLE"
{ "Tags": [ { "Key": "Environment", "ResourceId": "sfr-11112222-3333-4444-5555-66666EXAMPLE", "ResourceType": "spot-fleet-request", "Value": "Production" }, { "Key": "Another key", "ResourceId": "sfr-11112222-3333-4444-5555-66666EXAMPLE", "ResourceType": "spot-fleet-request", "Value": "Another value" } ] }

您还可以通过描述 Spot 队列请求来查看 Spot 队列请求的标签。

使用 describe-spot-fleet-requests 命令可查看指定的 Spot 队列请求的配置,其中包括为队列请求指定的任何标签。

aws ec2 describe-spot-fleet-requests \ --spot-fleet-request-ids sfr-11112222-3333-4444-5555-66666EXAMPLE
{ "SpotFleetRequestConfigs": [ { "ActivityStatus": "fulfilled", "CreateTime": "2020-02-13T02:49:19.709Z", "SpotFleetRequestConfig": { "AllocationStrategy": "capacityOptimized", "OnDemandAllocationStrategy": "lowestPrice", "ExcessCapacityTerminationPolicy": "Default", "FulfilledCapacity": 2.0, "OnDemandFulfilledCapacity": 0.0, "IamFleetRole": "arn:aws:iam::111122223333:role/aws-ec2-spot-fleet-tagging-role", "LaunchSpecifications": [ { "ImageId": "ami-0123456789EXAMPLE", "InstanceType": "c4.large" } ], "TargetCapacity": 2, "OnDemandTargetCapacity": 0, "Type": "maintain", "ReplaceUnhealthyInstances": false, "InstanceInterruptionBehavior": "terminate" }, "SpotFleetRequestId": "sfr-11112222-3333-4444-5555-66666EXAMPLE", "SpotFleetRequestState": "active", "Tags": [ { "Key": "Environment", "Value": "Production" }, { "Key": "Another key", "Value": "Another value" } ] } ] }

描述竞价型实例集

在最高价超过 Spot 价格并具有可用的容量时,竞价型实例集会启动竞价型实例。竞价型实例 将一直运行,直到这些实例中断,或者您终止这些实例。

描述竞价型实例集(控制台)
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,请选择 Spot Requests

  3. 选择 Spot 队列请求。要查看配置详细信息,请选择 Description (描述)

  4. 要列出 Spot 队列的 Spot 实例,请选择 Instances (实例)

  5. 要查看 Spot 队列的历史记录,请选择 History (历史记录)

描述竞价型实例集 (Amazon CLI)

使用 describe-spot-fleet-requests 命令可描述 Spot 队列请求。

aws ec2 describe-spot-fleet-requests

使用 describe-spot-fleet-instances 命令可描述指定 Spot 队列的 Spot 实例。

aws ec2 describe-spot-fleet-instances \ --spot-fleet-request-id sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE

使用 describe-spot-fleet-request-history 命令可描述指定 Spot 队列请求的历史记录。

aws ec2 describe-spot-fleet-request-history \ --spot-fleet-request-id sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE \ --start-time 2015-05-18T00:00:00Z

修改 Spot 队列请求

您可以修改活动的 Spot 队列请求以完成以下任务:

  • 提高目标容量和按需部分

  • 降低目标容量和按需部分

注意

您无法修改一次性 Spot 队列请求。您只能在创建 Spot 队列请求时选择了 Maintain target capacity (保持目标容量) 的情况下修改 Spot 队列请求。

当您增加目标容量时,竞价型实例集会启动其他竞价型实例。当您提高按需部分时,竞价型实例集会启动其他按需型实例。

当您增加目标容量时,竞价型实例集会根据其竞价型实例集请求的分配策略启动其他竞价型实例。如果分配策略为 lowestPrice,竞价型实例集将从竞价型实例集请求中价格最低的 Spot 容量池启动实例。如果分配策略为 diversified,竞价型实例集将在竞价型实例集请求中的池间分配实例。

在减少目标容量时,Spot 队列将取消超过新目标容量的任何打开的请求。您可以请求竞价型实例集终止竞价型实例,直到队列的大小达到新目标容量。如果分配策略为 lowestPrice,则竞价型实例集将终止每单位价格最高的实例。如果分配策略为 diversified,则竞价型实例集将在池间终止实例。或者,您可以请求竞价型实例集保持队列当前的队列大小,而不替换已中断的任何竞价型实例或者您手动终止的任何竞价型实例。

当竞价型实例集因目标容量下降而终止某个实例时,该实例将收到一条竞价型实例中断通知。

修改 Spot 队列请求(控制台)
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,请选择 Spot Requests

  3. 选择 Spot 队列请求。

  4. 依次选择 Actions (操作)Modify target capacity (修改目标容量)

  5. Modify target capacity 中,执行以下操作:

    1. 输入新的目标容量和按需部分。

    2. (可选)如果您要减少目标容量,但是要使队列保持其当前大小,请清除 Terminate instances (终止实例)

    3. 选择提交

使用 Amazon CLI 修改竞价型实例集请求

使用 modify-spot-fleet-request 命令可更新指定 Spot 队列请求的目标容量。

aws ec2 modify-spot-fleet-request \ --spot-fleet-request-id sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE \ --target-capacity 20

可以按如下所示修改前面的命令,以减少指定竞价型实例集的目标容量而不因此终止任何竞价型实例。

aws ec2 modify-spot-fleet-request \ --spot-fleet-request-id sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE \ --target-capacity 10 \ --excess-capacity-termination-policy NoTermination

取消 Spot 队列请求

如果您不再需要竞价型实例集,可以取消竞价型实例集请求。取消实例集请求后,与实例集关联的所有竞价型实例请求也将取消,从而不会启动任何新的竞价型实例。

取消竞价型实例集请求后,您还必须指定是否要终止其所有实例。包括按需型实例和竞价型实例。

如果您指定必须在取消实例集请求后终止实例,实例集请求会进入 cancelled_terminating 状态。否则,实例集请求将进入 cancelled_running 状态,并且实例将继续运行直至遇到中断或您手动将其终止。

取消 Spot 队列请求(控制台)
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,请选择 Spot Requests

  3. 选择 Spot 队列请求。

  4. 依次选择操作取消请求

  5. 取消竞价型实例请求对话框中,执行以下操作:

    1. 要取消竞价型实例集请求同时终止关联实例,请将终止实例复选框保持为选中状态。要取消竞价型实例集请求而不终止关联实例,请清除终止实例复选框。

    2. 选择确认

使用 Amazon CLI 取消竞价型实例集请求并终止其实例

使用 cancel-spot-fleet-requests 命令可以取消指定的竞价型实例集请求并终止其按需型实例和竞价型实例。

aws ec2 cancel-spot-fleet-requests \ --spot-fleet-request-ids sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE \ --terminate-instances

示例输出

{ "SuccessfulFleetRequests": [ { "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", "CurrentSpotFleetRequestState": "cancelled_terminating", "PreviousSpotFleetRequestState": "active" } ], "UnsuccessfulFleetRequests": [] }
使用 Amazon CLI 取消竞价型实例集请求而不终止其实例

您可以使用 --no-terminate-instances 参数修改上一个命令,以取消指定的竞价型实例集而不终止其按需型实例和竞价型实例。

aws ec2 cancel-spot-fleet-requests \ --spot-fleet-request-ids sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE \ --no-terminate-instances

示例输出

{ "SuccessfulFleetRequests": [ { "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", "CurrentSpotFleetRequestState": "cancelled_running", "PreviousSpotFleetRequestState": "active" } ], "UnsuccessfulFleetRequests": [] }