Libert Libert - 2 months ago 91
JSON Question

CloudFormation nested stack parameters

I'm trying to reuse old VPC and ELB templates in a Nested CloudFormation stack.

VPC template:

{
"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 Template:

{
"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"} ]
}
}
}
}


And finally I nested the two templates in a nested 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"
}
}
}
}


My problem is that the ELB template requires the SubnetId and I'm passing the parameter Pub1 but it doesn't seem to work.

What I'm doing wrong?

Answer

The ELB template is missing a Parameters section.

{
  "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"}]
      }
    }
  }
}
Comments