CloudFormation嵌套堆栈参数

时间:2016-09-04 00:39:43

标签: json amazon-web-services parameters amazon-cloudformation

我正在尝试在嵌套的CloudFormation堆栈中重用旧的VPC和ELB模板。

VPC模板:

 {
   "AWSTemplateFormatVersion" : "2010-09-09",
   "Description" : "AppVPC",
   "Resources" : {
      "AppVPC" : {
         "Type" : "AWS::EC2::VPC",
         "Properties" : {
            "CidrBlock" : "10.100.0.0/16",
            "EnableDnsSupport" : "true",
            "EnableDnsHostnames" : "true",
            "InstanceTenancy" : "default",
            "Tags" : [ {"Key" : "Name", "Value" : "appvpc"} ]
         }
      },

      "Pub1" :{
        "Type" : "AWS::EC2::Subnet",
        "Properties" : {
          "VpcId" : { "Ref": "AppVPC" },
          "CidrBlock" : "10.100.64.0/26",
          "AvailabilityZone" : "us-east-1a",
          "Tags" : [ {"Key" : "Name", "Value" : "public-1"} ]
        }
      } ,

  "Outputs" : {
  "public1" : {
    "Description": "Public Subnets",
    "Value" : { "Ref" : "Pub1" }
  }
 }
}

ELB模板:

{
   "AWSTemplateFormatVersion" : "2010-09-09",
   "Description" : "ELB",
   "Resources" : {

     "ELB" : {

       "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
   "Properties": {
      "CrossZone" : "True",
      "HealthCheck" : {
        "Target" : "HTTP:80/",
          "HealthyThreshold" : "3",
          "UnhealthyThreshold" : "5",
          "Interval" : "30",
          "Timeout" : "5"
      },
      "LoadBalancerName" : "ELB-APP",

      "Listeners" : [ {
          "LoadBalancerPort" : "80",
          "InstancePort" : "80",
          "Protocol" : "HTTP"
        } ],

    "Subnets" : [ "Pub1" ],


      "Tags" : [ {"Key" : "Name", "Value" : "ELB-APP"} ]
    }
   }
  }
 }

最后我将两个模板嵌套在一个嵌套的Stack中:

{
   "AWSTemplateFormatVersion": "2010-09-09",
   "Resources": {

       "VPC": {
           "Type": "AWS::CloudFormation::Stack",
           "Properties": {
               "TemplateURL": "https://s3.amazonaws.com/cloudformation-stack-custom/vpc.json",
               "TimeoutInMinutes": "60"
           }
       },

       "ELB": {
           "Type": "AWS::CloudFormation::Stack",
           "Properties": {
               "TemplateURL": "https://s3.amazonaws.com/cloudformation-stack-custom/elb.json",
               "Parameters": {
                  "Pub1" : { "Fn::GetAtt" : [ "VPC", "Outputs.public1" ] },
               },
               "TimeoutInMinutes": "60"
           }
       }
   }
}

我的问题是ELB模板需要SubnetId并且我传递参数Pub1但它似乎不起作用。

我做错了什么?

1 个答案:

答案 0 :(得分:5)

ELB模板缺少Parameters部分。

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "ELB",
  "Parameters": {
    "Pub1": {
      "Type": "AWS::EC2::Subnet::Id"
    }
  },
  "Resources" : {
    "ELB" : {
      "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
      "Properties": {
        "CrossZone" : "True",
        "HealthCheck" : {
          "Target" : "HTTP:80/",
          "HealthyThreshold" : "3",
          "UnhealthyThreshold" : "5",
          "Interval" : "30",
          "Timeout" : "5"
        },
        "LoadBalancerName" : "ELB-APP",
        "Listeners" : [{
          "LoadBalancerPort" : "80",
          "InstancePort" : "80",
          "Protocol" : "HTTP"
        }],
        "Subnets" : [{"Ref": "Pub1"}],
        "Tags" : [{"Key": "Name", "Value": "ELB-APP"}]
      }
    }
  }
}