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

Spot 队列 请求

要使用 Spot 队列,请创建一个 Spot 队列 请求,其中包括目标容量、可选的按需比例、实例的一个或多个启动规范以及您愿意支付的最高价。当 Spot 价格发生更改时,Amazon EC2 将尝试保持 Spot 队列 的目标容量。有关更多信息,请参阅 Spot 队列 的工作原理

有两种类型的 Spot 队列 请求:requestmaintain。您可以创建Spot 队列,以针对所需容量提交一次性请求,或者要求其随着时间的推移保持目标容量。两种请求类型都可以使用Spot 队列的分配策略。

在发出一次性请求时,Spot 队列 将提出所需的请求,但在容量减少时不会尝试补充 Spot 实例。如果没有可用的容量,则Spot 队列不会在其他 Spot 池中提交请求。

为了保持目标容量,Spot 队列将提出请求以满足目标容量,并自动补充任何中断的实例。

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

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

每个启动规范包括 Amazon EC2 启动实例所需的信息,如 AMI、实例类型、子网或可用区、一个或多个安全组。

Spot 队列请求状态

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

  • submitted – 正在评估 Spot 队列 请求,并且 Amazon EC2 正准备启动目标数量的实例。

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

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

  • cancelled_running – Spot 队列 已取消并且不会启动额外的 Spot 实例。其现有 Spot 实例继续运行,直至被中断或终止。请求会保持此状态,直到所有实例都已中断或终止。

  • cancelled_terminating – 已取消 Spot 队列,并且其 Spot 实例 正在终止。请求会保持此状态,直到所有实例都已终止。

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

以下显示了请求状态之间的转换。如果超出 Spot 队列限制,将会立即取消请求。


					Spot 队列 请求状态

Spot 队列运行状况检查

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

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

要求

  • 只有保持目标容量的 Spot 队列(而非一次性 Spot 队列)支持运行状况检查替换。

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

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

计划 Spot 队列请求

在创建 Spot 队列 请求前,请查看 Spot 最佳实践。使用这些最佳实践规划您的Spot 队列请求,以便以可能的最低价格预置需要的实例类型。还建议执行以下操作:

  • 确定您要创建的Spot 队列是针对所需目标容量提交一次性请求,还是随着时间推移维持目标容量。

  • 确定满足您的应用程序要求的实例类型。

  • 确定您的Spot 队列请求的目标容量。您可以采用实例或自定义单位设置目标容量。有关更多信息,请参阅Spot 队列实例权重

  • 确定 Spot 队列目标容量的多大部分必须是按需容量。可以将按需容量指定为 0。

  • 确定您的每单位价格 (如果使用实例权重)。要计算每单位价格,请将每实例小时价格除以该实例表示的单位数 (或权重)。如果不使用实例权重,则默认每单位价格为每实例小时价格。

  • 查看用于您的Spot 队列请求的可能选项。关于更多信息,请参阅 AWS CLI Command Reference 中的 request-spot-fleet 命令。有关其他示例,请参阅 Spot 队列示例配置

Spot 队列权限

如果 IAM 用户将创建或管理 Spot 队列,您需要为他们授予所需的权限。

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

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

为 IAM 用户授予 Spot 队列的权限

如果您的 IAM 用户将创建或管理 Spot 队列,请确保为其授予所需的权限,如下所示。

向 IAM 用户授予 Spot 队列权限

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/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": "*" } ] }

    上述示例策略为 IAM 用户授予大多数 Spot 队列使用案例所需的权限。要将用户限制为特定的 API 操作,请仅指定这些 API 操作。

    所需的 EC2 和 IAM API

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

    • ec2:RunInstances – 需要使用该 API 以在 Spot 队列中启动实例

    • ec2:CreateTags – 需要使用该 API 以标记 Spot 队列请求、实例或卷

    • iam:PassRole – 需要使用该 API 以指定 Spot 队列角色

    • iam:CreateServiceLinkedRole – 需要使用该 API 以创建服务相关角色

    • iam:ListRoles – 需要使用该 API 以枚举现有的 IAM角色

    • iam:ListInstanceProfiles – 需要使用该 API 以枚举现有的实例配置文件

    重要

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

    Spot 队列 API

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

    • ec2:RequestSpotFleet

    • ec2:ModifySpotFleetRequest

    • ec2:CancelSpotFleetRequests

    • ec2:DescribeSpotFleetRequests

    • ec2:DescribeSpotFleetInstances

    • ec2:DescribeSpotFleetRequestHistory

    可选的 IAM API

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

    • iam:AddRoleToInstanceProfile

    • iam:AttachRolePolicy

    • iam:CreateInstanceProfile

    • iam:CreateRole

    • iam:GetRole

    • iam:ListPolicies

  4. 选择查看策略

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

  6. 在导航窗格中,选择用户,然后选择相应用户。

  7. 选择 PermissionsAdd permissions

  8. 选择直接附加现有策略。选择之前创建的策略,然后选择Next: Review (下一步:查看)

  9. 选择 Add permissions (添加权限)

Spot 队列的服务相关角色

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

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

重要

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

AWSServiceRoleForEC2SpotFleet 授予的权限

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

  • ec2:RequestSpotInstances - 请求 Spot 实例

  • ec2:RunInstances - 启动实例

  • ec2:TerminateInstances - 终止实例

  • ec2:DescribeImages - 描述实例的 Amazon 系统映像 (AMI)

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

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

  • ec2:CreateTags - 在 Spot 队列请求、实例和卷中添加标签

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

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

创建服务相关角色

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

如果使用 AWS CLI 或 API,您必须确保该角色存在。

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

确保此角色存在,然后才使用 AWS CLI 或 API 来创建 Spot 队列。要创建该角色,请如下使用 IAM 控制台。

手动创建 AWSServiceRoleForEC2SpotFleet 服务相关角色

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在导航窗格中,选择 Roles

  3. 选择创建角色

  4. Select type of trusted entity (选择受信任实体的类型) 页面上,依次选择 EC2EC2 - Spot Fleet (EC2 - Spot 队列)Next: Permissions (下一步: 权限)

  5. 在下一页上,选择 Next:Review(下一步:审核)

  6. Review (审核) 页面上,选择 Create role (创建角色)

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

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

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

在提供权限时,授权是密钥策略的替代方法。有关更多信息,请参阅 AWS Key Management Service Developer Guide 中的使用授权在 AWS 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"

Spot 队列的 IAM 角色

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

重要

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

创建 IAM 角色以标记 Spot 队列

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在导航窗格中,选择 Roles

  3. Select type of trusted entity (选择受信任实体的类型) 页面上,依次选择 AWS service (AWS 服务)EC2EC2 - Spot Fleet Tagging (EC2 - Spot 队列标记)Next: Permissions (下一步: 权限)

  4. Attached permissions policy 页面上,选择 Next: Review

  5. Review (审核) 页面上,键入角色的名称(例如 aws-ec2-spot-fleet-tagging-role),然后选择 Create role (创建角色)

创建 Spot 队列请求

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

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

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

使用推荐设置创建 Spot 队列 请求(控制台)

  1. https://console.amazonaws.cn/ec2spot 处打开 Spot 控制台。

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

  3. 对于告诉我们您的应用程序或任务需要,选择负载均衡工作负载灵活的工作负载大数据工作负载已定义的持续时间工作负载

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

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

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

  5. 对于 Tell us how much capacity you need (告诉我们您需要多少容量) 下,对于 Total target capacity (总目标容量),指定要请求的目标容量单位数。您可以选择实例或 vCPU。

  6. 根据您的应用程序或任务选择,查看推荐的 Fleet request settings (队列请求设置),然后选择 Launch (启动)

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

您可以使用自己定义的参数创建 Spot 队列。

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

  1. https://console.amazonaws.cn/ec2spot 处打开 Spot 控制台。

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

  3. 对于告诉我们您的应用程序或任务需要,选择负载均衡工作负载灵活的工作负载大数据工作负载已定义的持续时间工作负载

  4. 对于 Configure your instances (配置您的实例),执行以下操作:

    1. (可选) 对于启动模板,请选择一个启动模板。启动模板必须指定 Amazon 系统映像 (AMI),因为如果您指定启动模板,则不能使用 Spot 队列覆盖 AMI。

      重要

      如果您打算指定 Optional On-Demand portion (可选的按需部分),则必须选择一个启动模板。

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

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

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

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

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

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

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

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

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

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

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

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

  5. (可选)对于 Additional configurations (其他配置),执行以下操作:

    1. (可选)要添加存储,请根据实例类型指定实例存储卷或 Amazon EBS 卷。

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

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

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

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

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

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

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

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

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

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

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

    11. (可选)要添加标签,请选择 Add new tag (添加新标签),然后输入该标签的键和值。对每个标签重复此操作。

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

  6. 对于 Tell us how much capacity you need (告诉我们您需要多少容量),执行以下操作:

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

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

      重要

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

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

  7. 对于 Fleet request settings (队列请求设置),执行以下操作:

    1. 根据您的应用程序或任务选择,查看队列请求和队列分配策略。要更改实例类型或分配策略,请清除 Apply recommendations (应用推荐设置)

    2. (可选)要删除实例类型,请对 Fleet request (队列请求) 选择 Remove (删除)。要添加实例类型,请选择 Select instance types (选择实例类型)

    3. (可选)对于 Fleet allocation strategy (队列分配策略),选择满足您需求的策略。有关更多信息,请参阅Spot 实例分配策略

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

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

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

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

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

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

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

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

  10. 选择 Launch

    Spot 队列 请求类型为 fleet。执行请求后,系统会添加请求类型 instance,此时其状态为 activefulfilled

使用 AWS CLI 创建 Spot 队列 请求

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 队列请求,仅分配给队列启动的实例,仅分配给附加到队列启动的实例的卷,或者分配给所有这三种内容。

注意

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

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

先决条件

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

授予 IAM 用户标记资源的权限

创建包含以下内容的 IAM 策略:

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

  • ec2:RequestSpotFleet 操作。这将授予 IAM 用户创建 Spot 队列 请求的权限。

  • 对于 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 队列请求(控制台)

使用 AWS CLI 标记新的 Spot 队列 请求

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

  • SpotFleetRequestConfig 中指定 Spot 队列 请求的标签。

  • 对于 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 队列及其启动的实例和卷

标记新的 Spot 队列请求及其使用 AWS CLI 启动的实例和卷

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

Spot 队列 请求标签:

  • SpotFleetRequestConfig 中指定 Spot 队列 请求的标签。

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

使用 AWS CLI 标记由 Spot 队列 启动的实例

要在队列启动实例时标记实例,您可以在 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 } }

使用 AWS CLI 标记附加到 Spot 队列 启动的按需实例的卷

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

注意

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

不支持 LaunchSpecifications 中的卷标记。

标记现有的 Spot 队列

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

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

  1. https://console.amazonaws.cn/ec2spot 处打开 Spot 控制台。

  2. 选择您的Spot 队列请求。

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

使用 AWS CLI 标记现有 Spot 队列 请求

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

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

查看 Spot 队列请求标签

使用控制台查看 Spot 队列 请求标签

  1. https://console.amazonaws.cn/ec2spot 处打开 Spot 控制台。

  2. 选择您的 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 队列

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

监控 Spot 队列(控制台)

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

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

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

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

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

监控 Spot 队列 (AWS 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 队列 请求。

当您提高目标容量时,Spot 队列启动其他 Spot 实例。当您提高按需部分时,Spot 队列启动其他按需实例。

当您提升目标容量时,Spot 队列 会根据其 Spot 队列 请求的分配策略来启动额外的 Spot 实例。如果分配策略是 lowestPrice,则 Spot 队列 从 Spot 队列 请求中价格最低的 Spot 实例 池启动实例。如果分配策略是 diversified,则 Spot 队列 在 Spot 队列 请求中的池间分配实例。

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

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

修改 Spot 队列 请求(控制台)

  1. https://console.amazonaws.cn/ec2spot/home/fleet 处打开 Spot 控制台。

  2. 选择您的Spot 队列请求。

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

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

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

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

    3. 选择 Submit

使用 AWS CLI 修改 Spot 队列 请求

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

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

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

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 队列请求

在使用完 Spot 队列 后,可以取消 Spot 队列 请求。这将取消与 Spot 队列 关联的所有 Spot 请求,从而不会为您的 Spot 队列 启动任何新的 Spot 实例。必须指定 Spot 队列 是否应终止其 Spot 实例。如果终止这些实例,则 Spot 队列 请求进入 cancelled_terminating 状态。否则, Spot 队列请求将进入 cancelled_running 状态,并且实例将继续运行直至它们中断或您手动终止它们。

取消 Spot 队列 请求(控制台)

  1. https://console.amazonaws.cn/ec2spot/home/fleet 处打开 Spot 控制台。

  2. 选择您的Spot 队列请求。

  3. 依次选择 Actions (操作)Cancel spot request (取消 Spot 请求)

  4. Cancel spot request (取消 spot 请求) 中,确认是否要取消 Spot 队列。要使队列保持其当前大小,请清除 Terminate instances (终止实例)。如果准备就绪,请选择 Confirm

使用 AWS CLI 取消 Spot 队列 请求

使用 cancel-spot-fleet-requests 命令可取消指定的 Spot 队列请求并终止实例。

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

可以按如下所示修改前面的命令,以取消指定的 Spot 队列请求而不终止实例。

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