我已经在几个不同的 AWS 区域创建了现货请求。在大多数区域中,总有一个区域的价格低于其他区域,因此如果我在该区域创建低价现货请求,则创建的所有实例最终都会出现在低价区域。这并不奇怪。
但是,今天我在一个新区域创建了现货请求。我创建了 20 个请求,所有请求的价格都相同。当时,该区域两个区域的现货价格大致相同,而我的出价高于该价格。我的一些请求得到了满足,并且它们都在一个区域中有实例。当然,该区域的价格上涨了,并且与我的出价相匹配。由于我的出价现在等于现货价格,所以我的一些请求无法得到满足。即使另一个区域的价格保持在同一水平,并且低于我的出价,也发生了这种情况。
为什么我的所有请求都集中在一个区域,即使其他区域有可用容量(价格较低)?在提出请求时,我没有指定区域(也没有指定组)。
编辑:恕我直言,我没有使用测试版现货请求界面。本月早些时候我尝试过几次,但我觉得它有点问题,所以我仍然使用原始界面。
答案1
当您创建 AWS 账户时,Amazon 会自动在每个区域创建一个跨区域的默认 VPC。它还会在每个区域为您创建默认子网;每个子网跨单个区域。(请注意复数“子网”。)子网无法跨多个区域。
创建现货请求时,您可以选择指定 VPC 和子网。如果您希望现货请求仅针对特定区域,请选择该区域的默认生成子网。(这解决了上述 Michael 的评论。)这很好用,这就是我期望的。
但是,您还可以选择对子网(和隐含区域)“无偏好”。我理解“无偏好”的意思是“任何子网”。看起来情况并非如此(但我希望在这里进行更正),并且“无偏好”意味着亚马逊从默认子网中为您选择一个子网。也就是说,他们为您选择一个区域(因为该区域在他们选择的子网中是隐含的)。看起来他们选择了当时的低价区域,但当然这不会一直是永远的低价区域。一旦选择了区域,它就会在请求的整个生命周期内固定下来。(对于持久请求,这是永远的。)
值得一提的是,另一种可能性是创建一个自动扩展组,并让其使用现货实例而不是按需实例。使用自动扩展组,您可以让该组跨越多个区域。但是,无论价格如何,该组似乎总是试图将请求均匀地分布在所有区域。该组似乎没有将请求放在最低价格区域的选项。但我想这是另一个问题的主题……
更新:我最初没有使用自动扩展组,因为它比创建一堆现货请求更复杂。但当然,这也行不通。答案是:获得最低价格区域的唯一方法是使用现货队列请求。
我最初也没有这样做,因为创建起来比较复杂,它要求创建队列的 IAM 用户拥有(略)多于ec2:*
操作的权限,而且界面仍然有点不稳定。请参阅https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-requests.html开始。但是,请注意这仍处于测试阶段,文档也不是最新的。权限还需要“iam:GetRole”、“iam:CreateRole”、“iam:AttachRolePolicy”。(当您尝试创建第一个 Spot Fleet 时,控制台会就此发出警告。显然,即使正确的角色已经存在,您仍然需要这些权限……去想想吧。)
回到我最初的问题:创建现货车队时,选择“最低价格”策略(这不是文档中所说的默认策略,但可用)。然后——与自动缩放组或现货请求一样——您必须“选择”区域并勾选所有区域(否则只会再次使用默认区域)。
希望有人觉得这有用。