【问题标题】:In an AWS CloudFormation template, how can I place an EC2 instance in the subnet determined by a Spot Fleet?在 AWS CloudFormation 模板中,如何将 EC2 实例放置在由 Spot 队列确定的子网中?
【发布时间】:2016-02-05 03:46:59
【问题描述】:

我在我的 CloudFormation 模板中指定了一个带有动态子网的 Spot 队列和一个(按需)EC2 实例,如下所示:

"Resources": {
  "myInstance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      ...
    }
  },
  "myFleet": {
    "Type": "AWS::EC2::SpotFleet",
    "Properties" : {
      "SpotFleetRequestConfigData" : {
        ...
        "LaunchSpecifications": [
          {
            ...
            "SubnetId": "subnet-1a1a1a, subnet-2b2b2b, subnet-3c3c3c"
          }
        ]
      }
    }
  }
}

我的每个子网都位于不同的可用区中,例如subnet-1a1a1aus-east-1asubnet-2b2b2bus-east-1b,等等

我想将 myInstance 放置在与我的 Spot 队列实例相同的子网中,以避免为跨可用区的网络流量付费,但我不知道如何执行此操作:

"myInstance": {
  "Type": "AWS.::EC2::Instance",
  "Properties": {
    ...
    "SubnetId": ???? // WHAT GOES HERE?
  }
}

看起来我不能在myFleet 上使用Fn::GetAtt,即使我让myInstance 依赖于myFleet,我仍然不确定如何查找 Spot Fleet 的结果位置。

我能做到吗?谢谢!

【问题讨论】:

  • 您需要这个单一实例的原因是什么?
  • 这都是集群系统的一部分(不是我设计的);按需实例是主管/经理,而现场车队是一组动态的工人。
  • 执行此操作的方法通常是选举过程。您将所有实例作为现场实例启动,并且您有一个选举过程,该过程决定其中哪些现场实例将充当主实例。其余的充当家属。
  • 我同意,但这不是这个软件的工作方式,也不是我可以控制的。因此我的问题。 :)

标签: amazon-web-services amazon-ec2 amazon-cloudformation


【解决方案1】:

在您的现场车队配置中,如果您执行以下操作:

"SubnetId": "subnet-1a1a1a, subnet-2b2b2b, subnet-3c3c3c"

那么您是在告诉 Spot 队列将 Spot 实例放置在这三个子网中的任何中。 Spot 实例可能同时位于所有 3 个子网中。

由于您只有一个 EC2 实例,因此无法保证您的 EC2 实例与所有 Spot 实例位于同一子网中。

您的 EC2 实例只能存在于单个子网中,您必须指定该子网,或者让 AWS 为您决定。

所以你有一个选择:

  1. 为 EC2 实例指定三个子网之一,这样,该实例将(希望)与一些 Spot 队列位于同一可用区,或者
  2. 将您的现场车队减少到一个子网

【讨论】:

  • 我基于the docs 的理解是,使用lowestPrice 分配策略将强制我的所有现货实例位于从列表中选择的同一子网中(基于价格),这正是我想要 - 然后我想要将按需实例放在同一个子网中。
  • 明白。问题是 Spot 实例在 Spot 队列有时间启动和思考之后由 Spot 实例化,这可能是 CloudFormation 堆栈完成后的一段时间。而单个 EC2 实例需要在堆栈设置期间定位。此外,理论上最低价格 AZ 可能会随着时间而变化,并且您的 Spot 实例可能会终止并重新启动以保持在最低 AZ 中。
  • 这就是为什么我考虑使用DependsOn 来强制执行排序,但我仍然不确定如何从队列中获取选定的子网值。我可以用CreationPolicyWaitHandle 和cfg-signal 来伪造它吗?
  • 您可以使用WaitHandlecfg-signal 来伪造它。但这超出了我的知识范围。
  • 看看这个。 docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/… 您可以在发出等待条件信号时传递数据。因此,您可以让您的 EC2 实例 DependOn 成为等待条件,看看您是否可以提取数据值。
猜你喜欢
  • 1970-01-01
  • 2017-06-02
  • 2021-03-21
  • 2017-06-25
  • 1970-01-01
  • 2013-02-22
  • 2018-05-28
  • 2017-04-16
  • 2020-08-03
相关资源
最近更新 更多