如何在模板中像网络界面一样无指定指定子网?

时间:2019-05-19 07:32:39

标签: amazon-cloudformation

在使用控制台创建竞价型实例时,不必选择子网。我可以...

Subnet: No preference (default subnet in any Availability Zone)

但是在使用cloudformation模板创建竞价型实例时,我需要选择一个子网,并且不确定要选择哪个子网以获取最佳价格。 这是否意味着使用Web界面优于cloudformation模板(对于竞价型实例)?

2 个答案:

答案 0 :(得分:1)

需求和相应的分配策略

我将您的要求“最佳价格”解释为获得配置用于成本优化的SpotFleet [1]。 AWS在文档[2]中介绍了如何创建成本优化的现货车队:

  

要优化使用竞价型实例的成本,请指定最低价格分配策略,以便竞价型舰队根据当前竞价价格自动部署实例类型和可用区的最便宜组合。

您已经在上述注释中提供的CloudFormation模板中为此情况指定了正确的 AllocationStrategy lowestPrice。 AWS将这种分配策略描述为:

  

竞价型实例来自价格最低的池。这是默认策略。

什么是竞价型实例池?

  

竞价型实例池是一组具有相同实例类型(例如,m5.large),操作系统可用区的未使用EC2实例的集合网络平台 [即EC2-Classic或EC2-VPC,请参阅[3]。

     

竞价型队列根据竞价型队列请求中包含的启动规范和竞价型队列请求的配置,选择用于满足请求的竞价型实例池。 / strong> [在我们的例子中是最低价格] 。 [2]

这回答了您问题的一部分:

否,子网不能直接确定现货价格。由可用区确定价格,即,如果相同实例类型,操作系统和网络平台的实例位于相同的可用区中,则它们始终具有相同的现货价格。由于子网不能跨越多个可用区域,因此特定子网中实例的现货价格始终是相同的-即(可用区,实例类型,操作系统,网络平台)组合的价格。

自动子网和可用区选择

您在问题中指出必须选择一个子网。那是不对的。 LaunchSpecification [4]的 NetworkInterfaces 属性是可选的。 如果您忽略它,则CloudFormation的行为与AWS管理控制台完全相同。 您可以在文档[5]的现货机队示例部分中了解其内容:

  

示例1:使用该区域中价格最低的可用区或子网启动竞价型实例

     

以下示例指定了没有可用区或子网的单个启动规范。 Spot Fleet在具有默认子网的价格最低的可用区中启动实例。您支付的价格不超过按需价格。

{
  "TargetCapacity": 20,
  "IamFleetRole": "arn:aws:iam::123456789012:role/aws-ec2-spot-fleet-tagging-role",
  "LaunchSpecifications": [
      {
          "ImageId": "ami-1a2b3c4d",
          "KeyName": "my-key-pair",
          "SecurityGroups": [
              {
                  "GroupId": "sg-1a2b3c4d"
              }
          ],
          "InstanceType": "m3.medium",
          "IamInstanceProfile": {
              "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
          }
      }
  ]
}

如果您确实需要为您的实例分配一个NetworkInterface(例如,因为您需要一个公共IP地址),则在[5]中也列出了一个解决方案:

      {
          "ImageId": "ami-1a2b3c4d",
          "KeyName": "my-key-pair",
          "InstanceType": "m3.medium",
          "NetworkInterfaces": [
              {
                  "DeviceIndex": 0,
                  "SubnetId": "subnet-1a2b3c4d",
                  "Groups": [ "sg-1a2b3c4d" ],
                  "AssociatePublicIpAddress": true
              }
          ],
          "IamInstanceProfile": {
              "Arn": "arn:aws:iam::880185128111:instance-profile/my-iam-role"
          }
      }

据我所知,这正是您在CloudFormation模板中实现的。 AWS声明了这种方法:

  

Spot服务将在价格最低的可用区中任何子网中启动实例。

  

您不能在Spot Fleet请求中从同一可用区指定不同的子网。

这意味着,您应该为要在其中分布实例的每个可用性区域创建一个启动规范。每个启动规范都应因SubnetId而有所不同:

[...]
  LaunchSpecifications: [
      {
          [...]
          "NetworkInterfaces": [
              {
                  "DeviceIndex": 0,
                  "SubnetId": "subnet-1a2b3c4d",  // choose a subnet from AZ a
                  "Groups": [ "sg-1a2b3c4d" ],
                  "AssociatePublicIpAddress": true
              }
          ],
          [...]
      },
      {
          [...]
          "NetworkInterfaces": [
              {
                  "DeviceIndex": 0,
                  "SubnetId": "subnet-xxxxxxxx",  // choose a subnet from AZ b
                  "Groups": [ "sg-1a2b3c4d" ],
                  "AssociatePublicIpAddress": true
              }
          ],
          [...]
      },
      [... etc. for each AZ]
  ],
[...]

参考文献

[1] https://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-spotfleet.html
[2] https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet.html#spot-fleet-allocation-strategy
[3] https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-classic-platform.html
[4] https://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata-launchspecifications.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-launchspecifications-networkinterfaces
[5] https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-examples.html#fleet-config1

答案 1 :(得分:0)

竞价型实例的定价由long term trends of supply and demand for EC2 instances决定,而不是您选择将竞价型实例启动到哪个子网。

始终对于为您的每个AWS解决方案开发一个cloudformation模板都是有益的。这与"Infrastructure as Code"的咒语保持一致,该咒语具有许多积极的好处,例如重用,通过修订控制跟踪变更,牛而不是宠物等。

关于默认子网:对于您的帐户,每个区域都有一个默认VPC,其中每个可用区都包含默认子网。这是AWS提供的一项便利功能,因此您可以快速开始启动实例。这些默认子网为public subnets,如果您将实例启动到其中,这些实例将获得公共ip并暴露给Internet。为了获得更好的安全性,请开发一个私有子网并将实例启动到该私有子网中,然后通过堡垒主机访问它们。