使用竞价型实例
要使用竞价型实例,您需要创建竞价型实例请求,其中包括所需实例数量、实例类型以及可用区。当有容量可用时,Amazon EC2 将立即满足您的请求。否则,Amazon EC2 将等待直至可以完成您的请求,或者直至您取消请求。
以下演示了竞价型实例请求的运行方式。请注意,请求类型(一次性或持久性)确定在 Amazon EC2 中断竞价型实例时或者在您停止竞价型实例时是否重新打开请求。如果请求是持久性请求,则在中断竞价型实例之后将重新打开请求。如果请求是持久性的,并且您停止了竞价型实例,则请求仅在您启动竞价型实例后打开。

目录
竞价型实例请求状态
竞价型实例请求可以处于以下某种状态:
-
open
– 请求正在等待执行。 -
active
– 请求已执行并有关联的竞价型实例。 -
failed
– 请求的一个或多个参数错误。 -
closed
– 竞价型实例被中断或终止。 -
disabled
– 您停止了竞价型实例。 -
cancelled
– 您取消了请求或请求已过期。
以下显示了请求状态之间的转换。请注意,转换取决于请求类型 (一次性还是持久性)。

一次性竞价型实例请求在 Amazon EC2 启动竞价型实例、请求过期前或者您取消请求前保持有效。当没有容量可用时,将终止您的竞价型实例并关闭竞价型实例请求。
持久性竞价型实例请求在过期或您取消它之前保持有效,即使该请求已完成也如此。当没有容量可用时,您的竞价型实例将会中断。在您的实例中断后,在再次具有可用的容量时,将会启动竞价型实例(如果已停止)或将其恢复(如果已休眠)。您可以停止竞价型实例,然后在有容量可用是重新启动实例。如果竞价型实例终止(无论竞价型实例处于停止状态还是正在运行状态),则会重新打开竞价型实例请求,并且 Amazon EC2 启动一个新的竞价型实例。有关更多信息,请参阅停止竞价型实例、启动竞价型实例和终止竞价型实例。
您可以跟踪竞价型实例请求的状态以及通过该状态启动的竞价型实例的状态。有关更多信息,请参阅Spot 请求状态。
指定竞价型实例的租期
您可以在单租户硬件上运行竞价型实例。专用竞价型实例与属于其他 Amazon 账户的实例物理隔离。有关更多信息,请参阅Dedicated Instances和 Amazon EC2 专用实例
要运行专用竞价型实例,请执行以下操作之一:
-
在创建竞价型实例请求时,请指定租期
dedicated
。有关更多信息,请参阅创建竞价型实例请求。 -
在 VPC 中请求实例租期为
dedicated
的竞价型实例。有关更多信息,请参阅创建有专用实例租赁的 VPC。如果您在 VPC 中请求实例租期为dedicated
的竞价型实例,则无法请求租期为default
的竞价型实例。
所有实例系列都支持除 T 实例外的专用竞价型实例。对于每个受支持的实例系列,只有最大的实例或设备支持专用竞价型实例。
竞价型实例请求的服务相关角色
Amazon EC2 使用服务相关角色获取代表您调用其他Amazon服务所需的权限。服务相关角色是一种独特类型的 IAM 角色,它与Amazon服务直接相关。服务相关角色提供了一种将权限委托给 Amazon 服务的安全方式,因为只有相关服务才能担任服务相关角色。有关更多信息,请参阅 IAM 用户指南 中的使用服务相关角色。
Amazon EC2 使用名为 Amazon Web Services ServiceRoleForEC2Spot 的服务相关角色代表您启动和管理 Spot 实例。
Amazon Web Services ServiceRoleForEC2Spot 授予的权限
Amazon EC2 使用 Amazon Web Services ServiceRoleForEC2Spot 完成以下操作:
-
ec2:DescribeInstances
– 描述竞价型实例 -
ec2:StopInstances
– 停止竞价型实例 -
ec2:StartInstances
– 启动竞价型实例
创建服务相关角色
在大多数情况下,无需手动创建服务相关角色。Amazon EC2 在您首次使用控制台请求 Spot 实例时创建 Amazon Web Services ServiceRoleForEC2Spot 服务相关角色。
如果在 2017 年 10 月之前具有活动Spot 实例请求(此时 Amazon EC2 开始支持该服务相关角色),则 Amazon EC2 在您的Amazon账户中创建 Amazon Web Services ServiceRoleForEC2Spot 角色。有关更多信息,请参阅IAM 用户指南中的我的账户中出现新角色。
如果您使用 Amazon CLI 或 API 来请求竞价型实例,则必须确保此角色存在。
要使用控制台创建 Amazon Web Services ServiceRoleForEC2Spot
通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
在导航窗格中,选择 Roles(角色)。
-
选择创建角色。
-
在 Select type of trusted entity (选择受信任实体的类型) 页面上,依次选择 EC2、EC2 - Spot Instances (EC2 - Spot 实例) 和 Next: Permissions (下一步: 权限)。
-
在下一页上,选择 Next:Review(下一步:审核)。
-
在 Review (审核) 页面上,选择 Create role (创建角色)。
要使用 Amazon CLI 创建 Amazon Web Services ServiceRoleForEC2Spot
如下所示使用 create-service-linked-role 命令。
aws iam create-service-linked-role --aws-service-name spot.amazonaws.com
如果您不再需要使用 Spot 实例,我们建议您删除 Amazon Web Services ServiceRoleForEC2Spot 角色。从账户中删除该角色后,如果您请求竞价型实例,Amazon EC2 将再次创建该角色。
授予对用于加密的 AMI 和 EBS 快照的客户托管密钥的访问权限
如果为 Spot 实例指定加密的 AMI 或加密的 Amazon EBS 快照,并且您使用客户托管密钥进行加密,则必须为 Amazon Web Services ServiceRoleForEC2Spot 角色授予使用客户托管密钥的权限,以便 Amazon EC2 可以代表您启动 Spot 实例。为此,您必须在客户托管密钥中添加授权,如以下过程中所示。
在提供权限时,授权是密钥策略的替代方法。有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的使用授权和在 Amazon KMS 中使用密钥策略。
为 Amazon Web Services ServiceRoleForEC2Spot 角色授予使用客户托管密钥的权限
-
使用 create-grant 命令在客户托管密钥中添加授权,并指定授予权限的委托人(Amazon Web Services ServiceRoleForEC2Spot 服务相关角色),以执行授权允许的操作。客户托管密钥由
key-id
参数和客户托管密钥的 ARN 指定。委托人是由grantee-principal
参数和 Amazon Web Services ServiceRoleForEC2Spot 服务相关角色的 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/AWSServiceRoleForEC2Spot \ --operations "Decrypt" "Encrypt" "GenerateDataKey" "GenerateDataKeyWithoutPlaintext" "CreateGrant" "DescribeKey" "ReEncryptFrom" "ReEncryptTo"
创建竞价型实例请求
您可以使用 Amazon EC2 控制台中的启动实例向导或 run-instances Amazon CLI 命令以与启动按需型实例相同的方式请求竞价型实例。建议使用此方法的原因如下:
-
您已经在使用启动实例向导或 run-instances 命令启动按需型实例,而且只想通过更改单个参数来更改为启动竞价型实例。
-
您不需要多个实例类型不同的实例。
通常不建议使用此方法来启动竞价型实例,因为您无法指定多种实例类型,也无法在同一请求中启动竞价型实例和按需型实例。有关启动竞价型实例的首选方法(包括启动实例集,其中包含具有多种实例类型的竞价型实例和按需型实例类型),请参阅 使用哪种竞价型请求方法最好?
如果您一次请求了多个竞价型实例,Amazon EC2 将创建单独的竞价型实例,这样您可以分别跟踪各个请求的状态。有关跟踪竞价型实例请求的更多信息,请参阅 Spot 请求状态。
查找正在运行的竞价型实例
当有容量可用时,Amazon EC2 会启动竞价型实例。竞价型实例将一直运行,直到该实例中断,或者您自行终止该实例。
查找正在运行的竞价型实例(控制台)
-
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在导航窗格中,请选择 Spot Requests。您可以同时查看竞价型实例请求和竞价型实例集请求。如果 Spot 实例请求已执行,那么 Capacity (容量) 就是 Spot 实例的 ID。对于 Spot 实例集,Capacity (容量) 表示已执行的请求容量。要查看 Spot 实例集中的实例的 ID,请选择扩展箭头,或者选择队列,然后选择 Instances (实例)。
注意
对于由竞价型实例集创建的竞价型实例请求,不会立即为这些请求添加用于指示它们所属的竞价型实例的系统标签,并且这些请求在一段时间内可能会独立于竞价型实例请求显示。
或者,在导航窗格中,选择 Instances。在右上角,选择设置图标 (
),然后在属性列下选择实例生命周期。对于每个实例,实例生命周期为
normal
、spot
或scheduled
。
查找正在运行的竞价型实例(Amazon CLI)
要枚举您的 Spot 实例,请结合使用 describe-spot-instance-requests 命令和 --query
选项。
aws ec2 describe-spot-instance-requests \ --query "SpotInstanceRequests[*].{ID:InstanceId}"
下面是示例输出:
[
{
"ID": "i-1234567890abcdef0"
},
{
"ID": "i-0598c7d356eba48d7"
}
]
或者,您可结合使用 describe-instances 命令和 --filters
选项来枚举您的 Spot 实例。
aws ec2 describe-instances \ --filters "Name=instance-lifecycle,Values=spot"
要描述单个 Spot 实例,请使用带 --spot-instance-request-ids
选项的 describe-spot-instance-requests 命令。
aws ec2 describe-spot-instance-requests \ --spot-instance-request-ids
sir-08b93456
标记竞价型实例请求
要对您的竞价型实例请求进行分类和管理,您可使用自定义元数据标记它们。您可以在创建竞价型实例请求时或之后为其分配标签。您可以使用 Amazon EC2 控制台或命令行工具分配标签。
在标记竞价型实例请求时,不会自动标记由竞价型实例请求启动的实例和卷。您需要明确标记由竞价型实例请求启动的实例和卷。您可以在启动期间或之后为竞价型实例和卷分配标签。
有关标签的工作原理的更多信息,请参阅标记 Amazon EC2 资源。
先决条件
授予用户标记资源的权限。有关 IAM policies 和示例策略的更多信息,请参阅示例:标记资源。
您创建的 IAM policy 由您用于创建竞价型实例请求的方法决定。
-
如果您使用启动实例向导或
run-instances
请求 Spot 实例,请参阅To grant a user the permission to tag resources when using the launch instance wizard or run-instances。 -
如果您使用
request-spot-instances
命令请求竞价型实例,请参阅 To grant a user the permission to tag resources when using request-spot-instances。
在使用启动实例向导或 run-instances 时向用户授予资源标记权限
创建包含以下内容的 IAM policy:
-
ec2:RunInstances
操作。这将授予用户授予启动实例的权限。 -
对于
Resource
,请指定spot-instances-request
。这允许用户创建竞价型实例请求,以请求竞价型实例。 -
ec2:CreateTags
操作。这将授予用户创建标签的权限。 -
对于
Resource
,请指定*
。这将允许用户标记在实例启动期间创建的所有资源。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowLaunchInstances", "Effect": "Allow", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:us-east-1::image/*", "arn:aws:ec2:us-east-1:*:subnet/*", "arn:aws:ec2:us-east-1:*:network-interface/*", "arn:aws:ec2:us-east-1:*:security-group/*", "arn:aws:ec2:us-east-1:*:key-pair/*", "arn:aws:ec2:us-east-1:*:volume/*", "arn:aws:ec2:us-east-1:*:instance/*", "arn:aws:ec2:us-east-1:*:spot-instances-request/*" ] }, { "Sid": "TagSpotInstanceRequests", "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "*" } ] }
注意
当您使用 RunInstances 操作创建竞价型实例请求并在创建时标记竞价型实例请求时,您需要了解 Amazon EC2 如何在 RunInstances 语句中评估 spot-instances-request
资源。
在 IAM policy 中评估 spot-instances-request
资源,如下所示:
-
如果您在创建时未标记竞价型实例请求,则 Amazon EC2 不会在 RunInstances 语句中评估
spot-instances-request
资源。 -
如果您在创建时标记竞价型实例请求,则 Amazon EC2 会在 RunInstances 语句中评估
spot-instances-request
资源。
因此,对于 spot-instances-request
资源,以下规则适用于 IAM policy:
-
如果您使用 RunInstances 创建竞价型实例请求,并且您不打算在创建时标记竞价型实例请求,则无需明确允许
spot-instances-request
资源;调用将成功。 -
如果您使用 RunInstances 创建竞价型实例请求并打算在创建时标记竞价型实例请求,则必须在 RunInstances 允许语句中包含
spot-instances-request
资源,否则调用将失败。 -
如果您使用 RunInstances 创建竞价型实例请求并打算在创建时标记竞价型实例请求,则必须在 CreateTags 允许语句中指定
spot-instances-request
资源或包括*
通配符,否则调用将失败。
有关示例 IAM policy(包括竞价型实例请求不支持的策略),请参阅 使用竞价型实例。
在使用 request-spot-instances 时向用户授予资源标记权限
创建包含以下内容的 IAM policy:
-
ec2:RequestSpotInstances
操作。这将授予用户创建竞价型实例请求的权限。 -
ec2:CreateTags
操作。这将授予用户创建标签的权限。 -
对于
Resource
,请指定spot-instances-request
。这将允许用户仅标记竞价型实例请求。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "TagSpotInstanceRequest", "Effect": "Allow", "Action": [ "ec2:RequestSpotInstances", "ec2:CreateTags" ], "Resource": "arn:aws:ec2:
us-east-1
:111122223333
:spot-instances-request/*" }
标记新的竞价型实例请求
使用控制台标记新的竞价型实例请求
使用 Amazon CLI 标记新的竞价型实例请求
要在创建时标记竞价型实例请求请求,请按以下方式配置竞价型实例请求配置:
-
使用
--tag-specification
参数指定竞价型实例请求的标签。 -
对于
ResourceType
,请指定spot-instances-request
。如果指定其他值,则竞价型实例请求将失败。 -
对于
Tags
,请指定键值对。您可以指定多个键值对。
在以下示例中,使用两个标签来标记竞价型实例请求:键=环境,值=生产;键=成本中心,值=123。
aws ec2 request-spot-instances \ --instance-count
5
\ --type "one-time" \ --launch-specification file://specification.json
\ --tag-specification 'ResourceType=spot-instances-request,Tags=[{Key=Environment
,Value=Production
},{Key=Cost-Center
,Value=123
}]'
标记现有竞价型实例请求
使用控制台标记现有的竞价型实例请求
创建竞价型实例请求后,您可以使用控制台向竞价型实例请求添加标签。
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
-
在导航窗格中,请选择 Spot Requests。
-
选择您的竞价型实例请求。
-
选择 Tags (标签) 选项卡,然后选择 Create Tag (创建标签)。
使用控制台标记现有的竞价型实例
在竞价型实例请求启动竞价型实例后,您可以使用控制台向实例添加标签。有关更多信息,请参阅在单个资源上添加和删除标签。
使用 Amazon CLI 标记现有的竞价型实例请求或竞价型实例
使用 create-tags 命令标记现有的资源。在以下示例中,使用以下标签标记现有竞价型实例请求和竞价型实例:键=目的,值=测试。
aws ec2 create-tags \ --resources
sir-08b93456
i-1234567890abcdef0
\ --tags Key=purpose
,Value=test
查看竞价型实例请求标记
使用控制台查看竞价型实例请求标签
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
-
在导航窗格中,请选择 Spot Requests。
-
选择您的 Spot 实例请求并选择 Tags (标签) 选项卡。
描述竞价型实例请求标记
使用 describe-tags 命令可查看指定资源的标签。在以下示例中,您将描述指定请求的标签。
aws ec2 describe-tags \ --filters "Name=resource-id,Values=
sir-11112222-3333-4444-5555-66666EXAMPLE
"
{
"Tags": [
{
"Key": "Environment",
"ResourceId": "sir-11112222-3333-4444-5555-66666EXAMPLE",
"ResourceType": "spot-instances-request",
"Value": "Production"
},
{
"Key": "Another key",
"ResourceId": "sir-11112222-3333-4444-5555-66666EXAMPLE",
"ResourceType": "spot-instances-request",
"Value": "Another value"
}
]
}
您还可以通过描述竞价型实例请求来查看竞价型实例请求的标签。
使用 describe-spot-instance-requests 命令可查看指定的 Spot 实例请求的配置,其中包括为请求指定的任何标签。
aws ec2 describe-spot-instance-requests \ --spot-instance-request-ids
sir-11112222-3333-4444-5555-66666EXAMPLE
{
"SpotInstanceRequests": [
{
"CreateTime": "2020-06-24T14:22:11+00:00",
"InstanceId": "i-1234567890EXAMPLE",
"LaunchSpecification": {
"SecurityGroups": [
{
"GroupName": "launch-wizard-6",
"GroupId": "sg-1234567890EXAMPLE"
}
],
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"DeleteOnTermination": true,
"VolumeSize": 8,
"VolumeType": "gp2"
}
}
],
"ImageId": "ami-1234567890EXAMPLE",
"InstanceType": "t2.micro",
"KeyName": "my-key-pair",
"NetworkInterfaces": [
{
"DeleteOnTermination": true,
"DeviceIndex": 0,
"SubnetId": "subnet-11122233"
}
],
"Placement": {
"AvailabilityZone": "eu-west-1c",
"Tenancy": "default"
},
"Monitoring": {
"Enabled": false
}
},
"LaunchedAvailabilityZone": "eu-west-1c",
"ProductDescription": "Linux/UNIX",
"SpotInstanceRequestId": "sir-1234567890EXAMPLE",
"SpotPrice": "0.012600",
"State": "active",
"Status": {
"Code": "fulfilled",
"Message": "Your spot request is fulfilled.",
"UpdateTime": "2020-06-25T18:30:21+00:00"
},
"Tags": [
{
"Key": "Environment",
"Value": "Production"
},
{
"Key": "Another key",
"Value": "Another value"
}
],
"Type": "one-time",
"InstanceInterruptionBehavior": "terminate"
}
]
}
取消竞价型实例请求
如果您不再需要竞价型实例请求,您可以将其取消。您只能取消 open
、active
或 disabled
的竞价型实例请求。
-
当您的请求未执行,且实例没有启动时,您的竞价型实例请求处于
open
状态。 -
当您的请求完成且竞价型实例因此已启动时,您的竞价型实例请求处于
active
状态。 -
当您停止竞价型实例时,您的竞价型实例请求处于
disabled
状态。
如果您的竞价型实例请求处于 active
状态,且关联的竞价型实例正在运行,那么取消请求不会终止该实例。有关终止竞价型实例的更多信息,请参阅 终止竞价型实例。
取消竞价型实例请求(控制台)
-
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在导航窗格中,选择 Spot Requests (Spot 请求),然后选择 Spot 请求。
-
依次选择操作和取消请求。
-
(可选) 如果不再使用关联的竞价型实例,可以将其终止。在取消竞价请求对话框中,选择终止实例,然后选择确认。
取消 Spot 实例请求 (Amazon CLI)
-
使用 cancel-spot-instance-requests 命令可取消指定的 Spot 实例请求。
aws ec2 cancel-spot-instance-requests --spot-instance-request-ids
sir-08b93456
停止竞价型实例
如果您现在不需要竞价型实例,但希望在以后重启它们且不会丢失 Amazon EBS 卷中保留的数据,您可以停止它们。停止竞价型实例的步骤与停止按需型实例的步骤类似。
注意
在停止竞价型实例后,您可以修改其部分实例属性,但不能修改实例类型。
我们不会对已停止的竞价型实例收费,也不会收取数据传输费,但我们会对所有 Amazon EBS 卷的存储收费。
限制
-
只有当竞价型实例是从
persistent
竞价型实例请求启动时,您才能停止竞价型实例。 -
如果关联的竞价型实例请求被取消,则无法停止竞价型实例。当竞价型实例请求被取消后,您只能终止竞价型实例。
-
如果竞价型实例是某个队列或启动组或可用区组的一部分,则无法停止它。
启动竞价型实例
您可以启动以前停止的竞价型实例。启动竞价型实例的步骤与启动按需型实例的步骤类似。
先决条件
您只能在以下情况下启动竞价型实例:
-
您手动停止了竞价型实例。
-
竞价型实例是 EBS 支持的实例。
-
竞价型实例容量可用。
-
Spot 价格低于您的最高价格。
限制
-
如果竞价型实例是某个队列或启动组或可用区组的一部分,则无法启动它。
终止竞价型实例
如果您终止的运行中或已停止竞价型实例是由持久性竞价型实例请求启动的,则竞价型实例请求会转换为 open
状态,这样就可以启动新的竞价型实例。要确保没有启动新的竞价型实例,您必须首先取消该竞价型实例请求。
如果您取消含有正在运行的竞价型实例的 active
竞价型实例请求,则正在运行的竞价型实例不会自动终止;您必须手动终止该竞价型实例。
如果您取消含有已停止的竞价型实例的 disabled
竞价型实例请求,则 Amazon EC2 Spot 服务将自动终止已停止的竞价型实例。取消竞价型实例请求与 Spot 服务终止竞价型实例之间可能存在短暂的滞后。
有关取消 Spot 实例请求的信息,请参阅取消竞价型实例请求。