【问题标题】:Writing reusable CloudFormation snippets with AWS::Include and Nested Stacks使用 AWS::Include 和 Nested Stacks 编写可重用的 CloudFormation 片段
【发布时间】:2018-06-28 07:47:01
【问题描述】:

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

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

我想到的一种方法是为每个资源使用一个 sn-p,例如 AWS::EC2::SubnetAWS::EC2::InternetGateway 可以包含零次或多次一个vpc.json 模板,它本身可以用作大型应用程序中的嵌套堆栈。

sn-p 不带任何参数,但可以引用父模板中存在的参数。

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

"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": [..]
  }
}

例如,如何避免在子网 sn-p 中为 AZ 硬编码 "0"

【问题讨论】:

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


    【解决方案1】:

    很遗憾,AWS 没有提供根据要求动态更新模板的方法。

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

    希望这会有所帮助。

    【讨论】:

    • 谢谢!我也想过这个问题,但我还不想做任何程序化的解决方案。
    【解决方案2】:

    您必须使用位于以下位置的两个 AWS::Include 文件:

    • s3://yourname/PublicSubnetA.yaml
    • s3://yourname/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"   
    

    【讨论】:

      【解决方案3】:

      我试过这种方式发送附加参数:

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

      得到了有趣的错误:

      转换 Include 下参数 EC2Size 的值必须解析为字符串、数字、布尔值或任何这些的列表

      看起来它明白这是什么附加参数,可能它需要配置有点不同。我还没有找到解决此错误的方法。

      【讨论】:

      • 你在这方面有什么进展吗?
      猜你喜欢
      • 2018-07-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 2016-12-23
      • 2017-03-01
      • 2020-03-03
      相关资源
      最近更新 更多