使用AWS :: Include和嵌套堆栈编写可重用的CloudFormation代码段

时间:2018-02-05 20:19:30

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

我在CloudFormation中使用nested stacks已有好几个月了,它们非常有用。所以我认为我应该花一些时间让每个嵌套堆栈可以重用于组织中的其他团队。

我在AWS::Includehere等几个地方看到here的用例,这对我来说很有意义。

我想到的一种方法是每个资源都有一个代码段,例如AWS::EC2::SubnetAWS::EC2::InternetGateway,可以包含零次或多次进入vpc.json模板,该模板本身可以在较大的应用程序中用作嵌套堆栈。

该代码段不接受任何参数,但可以引用父模板中存在的参数。

乍一看,这对我来说似乎不够。考虑这个例子:

"PublicSubnet": {
  "Type": "AWS::EC2::Subnet",
  "Properties": {
    "VpcId": {"Ref": "VPC"},
    "AvailabilityZone": {
       "Fn::Select" : [ "0", { "Fn::GetAZs" : {"Ref": "AWS::Region"} }]
    },
    "CidrBlock": {
      "Fn::FindInMap": ["AZSubnetMap", {
         "Fn::Select" : [ "0", { "Fn::GetAZs" : {"Ref": "AWS::Region"} }]},
         "PublicSubnet"]},
    "MapPublicIpOnLaunch": "true",
    "Tags": [..]
  }
}

例如,如何避免在子网代码段中对AZ "0"进行硬编码?

3 个答案:

答案 0 :(得分:2)

不幸的是,AWS没有提供根据要求动态更新模板的方法。

我使用Java库Mustache Templates使用Handle Bars解决了类似的问题。使用此库,您可以根据需要动态生成模板。

希望这会有所帮助。

答案 1 :(得分:1)

您将不得不使用位于以下位置的两个AWS :: Include文件:

  • s3://您的名称/PublicSubnetA.yaml
  • s3://您的名称/PublicSubnetB.yaml

并从您的主模板中致电给他们:

Fn::Transform:        
    Name: AWS::Include
    Parameters:
      Location : "s3://yourname/PublicSubnetA.yaml"   


 Fn::Transform:        
    Name: AWS::Include
    Parameters:
      Location : "s3://yourname/PublicSubnetB.yaml"   

我正在尝试找到将其他参数或重写参数发送到AWS :: include的方法,如您所见 参数:       位置:

为什么ti不了解更多的参数,而不仅仅是位置,我会很高兴有这样的东西:

 Fn::Transform:        
    Name: AWS::Include
    Parameters:
      MySubnetIndex: 0
      Location : "s3://yourname/PublicSubnetB.yaml"   

答案 2 :(得分:1)

我尝试过这种方式来发送其他参数:

Fn::Transform:        
    Name: AWS::Include
    Parameters:
       Location : "s3://my.test/create-ec2.yaml"   
       EC2Size :
         Type:  String
         Default: "t2.micro"

出现有趣的错误:

转换包括下的参数EC2Size的值必须解析为字符串,数字,布尔值或其中任何一个的列表

看起来它了解什么是附加参数,可能需要对其进行一些配置。我还找不到解决此错误的方法。