繁体   English   中英

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

[英]Writing reusable CloudFormation snippets with AWS::Include and Nested Stacks

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

我看到了AWS ::: Use的用例出现在这里这里的几个地方,这对我来说很有意义。

我想到的一种方法是为每种资源提供一个代码段 ,例如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"

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

我已经使用Java库处理栏使用Moustache模板解决了类似的问题。 使用此库,您可以根据需求即时生成模板。

希望这可以帮助。

您将必须使用以下两个AWS :: Include文件:

  • S3://yourname/PublicSubnetA.yaml
  • S3://yourname/PublicSubnetB.yaml

并从您的MAIN模板中调用它们:

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


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

我正在尝试寻找将其他参数或替代参数发送到AWS :: include的方法,因为您看到它具有Parameters:Location:

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

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

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

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

并得到了有趣的错误:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM