Reputation: 353
Alright, so I'm calling Nested stacks from a master template. I thought I had figured out how to properly export values and import between nested stacks. I realize alot of my naming conventions are formatting are not up to par, I just started learning CloudFormation Scripting this week.
Every time I try to create this stack, they all create until I get to "Public Route," at which point I get a:
Template format error: Unresolved resource dependencies [InternetGatewayStackname] in the Resources block of the template
As far as I can tell, I did the public route exactly the same as the Vpc stack, which worked. For some reason, I cannot get the Public route to work.
Primary Stack:
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "Master template, creates three private subnets, one public, two routes, an internetgateway, nat gateway, and bastion host.",
"Parameters" : {
"AvailabilityZone" : {
"Default" : "us-east-1d",
"Description" : "Enter AvailabilityZone.",
"Type" : "String"
},
"VpcCidrBlock" : {
"Default" : "10.0.0.0/16",
"Description" : "VPC CIDR Block.",
"Type" : "String"
},
"PublicSubnetCidrBlock" : {
"Default" : "10.0.0.0/24",
"Description" : "Public subnet CIDR block.",
"Type" : "String"
},
"PrivateSubnetCidrBlock1" : {
"Default" : "10.0.1.0/24",
"Description" : "Private subnet CIDR block.",
"Type" : "String"
},
"PrivateSubnetCidrBlock2" : {
"Default" : "10.0.2.0/24",
"Description" : "Private subnet CIDR block.",
"Type" : "String"
},
"PrivateSubnetCidrBlock3" : {
"Default" : "10.0.3.0/24",
"Description" : "Private subnet CIDR block.",
"Type" : "String"
}
},
"Resources" : {
"VpcStack" : {
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"Parameters" : {
"VpcCidrBlock" : {
"Ref" : "VpcCidrBlock"
}
},
"TemplateURL" : "https://s3.amazonaws.com/URLs/templates/vpcStack.json",
"TimeoutInMinutes" : "5"
}
},
"PrivateSubnetStack1" : {
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"Parameters" : {
"PrivateSubnetCidrBlock1" : {
"Ref" : "PrivateSubnetCidrBlock1"
},
"VpcStackName" : {
"Fn::GetAtt" : [
"VpcStack",
"Outputs.VpcStack"
]
}
},
"TemplateURL" : "https://s3.amazonaws.com/URLs/templates/privateSubnetStack1.json",
"TimeoutInMinutes" : "5"
}
},
"PrivateSubnetStack2" : {
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"Parameters" : {
"PrivateSubnetCidrBlock2" : {
"Ref" : "PrivateSubnetCidrBlock2"
},
"VpcStackName" : {
"Fn::GetAtt" : [
"VpcStack",
"Outputs.VpcStack"
]
}
},
"TemplateURL" : "https://s3.amazonaws.com/URLs/templates/privateSubnetStack2.json",
"TimeoutInMinutes" : "5"
}
},
"PrivateSubnetStack3" : {
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"Parameters" : {
"PrivateSubnetCidrBlock3" : {
"Ref" : "PrivateSubnetCidrBlock3"
},
"VpcStackName" : {
"Fn::GetAtt" : [
"VpcStack",
"Outputs.VpcStack"
]
}
},
"TemplateURL" : "https://s3.amazonaws.com/URLs/templates/privateSubnetStack3.json",
"TimeoutInMinutes" : "5"
}
},
"PublicSubnetStack" : {
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"Parameters" : {
"PublicSubnetCidrBlock" : {
"Ref" : "PublicSubnetCidrBlock"
},
"VpcStackName" : {
"Fn::GetAtt" : [
"VpcStack",
"Outputs.VpcStack"
]
}
},
"TemplateURL" : "https://s3.amazonaws.com/URLs/templates/publicSubnetStack.json",
"TimeoutInMinutes" : "5"
}
},
"InternetGatewayStack" : {
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"Parameters" : {
"VpcStackName" : {
"Fn::GetAtt" : [
"VpcStack",
"Outputs.VpcStack"
]
}
},
"TemplateURL" : "https://s3.amazonaws.com/URLs/templates/internetGatewayStack.json",
"TimeoutInMinutes" : "5"
}
},
"PublicRouteStack" : {
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"Parameters" : {
"VpcStackName" : {
"Fn::GetAtt" : [
"VpcStack",
"Outputs.VpcStack"
]
},
"PublicSubnetStackName" : {
"Fn::GetAtt" : [
"PublicSubnetStack",
"Outputs.PublicSubnetStack"
]
},
"InternetGatewayStackName" : {
"Fn::GetAtt" : [
"InternetGatewayStack",
"Outputs.InternetGatewayStack"
]
}
},
"TemplateURL" : "https://s3.amazonaws.com/URLs/templates/publicRouteStack.json",
"TimeoutInMinutes" : "5"
}
}
}
}
Public Subnet:
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "Public Subnet Stack",
"Parameters" : {
"PublicSubnetCidrBlock" : {
"Description" : "Public subnet CIDR block.",
"Type" : "String"
},
"VpcStackName" : {
"Description" : "VPC Stack Name.",
"Type" : "String"
}
},
"Resources" : {
"PublicSubnet" : {
"Type" : "AWS::EC2::Subnet",
"Properties" : {
"VpcId" : {
"Fn::Sub" : "${VpcStackName}"
},
"CidrBlock" : {
"Ref" : "PublicSubnetCidrBlock"
},
"Tags" : [
{
"Key" : "Application",
"Value" : {
"Ref" : "AWS::StackName"
}
},
{
"Key" : "Network",
"Value" : "Public"
}
]
}
}
},
"Outputs" : {
"PublicSubnetStack" : {
"Description" : "Public Subnet ID.",
"Value" : {
"Ref" : "PublicSubnet"
},
"Export" : {
"Name" : {
"Fn::Sub" : "${AWS::StackName}-PublicSubnet"
}
}
}
}
}
Internet Gateway:
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "Internet Gateway",
"Parameters" : {
"VpcStackName" : {
"Description" : "VPC Stack Name.",
"Type" : "String"
}
},
"Resources" : {
"InternetGateway" : {
"Type" : "AWS::EC2::InternetGateway",
"Properties" : {
"Tags" : [
{
"Key" : "Application",
"Value" : {
"Ref" : "AWS::StackId"
}
},
{
"Key" : "Network",
"Value" : "Public"
}
]
}
},
"GatewayToInternet" : {
"Type" : "AWS::EC2::VPCGatewayAttachment",
"Properties" : {
"VpcId" : {
"Fn::Sub" : "${VpcStackName}"
},
"InternetGatewayId" : {
"Ref" : "InternetGateway"
}
}
}
},
"Outputs" : {
"InternetGatewayStack" : {
"Description" : "Internet Gateway ID.",
"Value" : {
"Ref" : "InternetGateway"
},
"Export" : {
"Name" : {
"Fn::Sub" : "${AWS::StackName}-InternetGateway"
}
}
}
}
}
Public Route:
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "Public Route Table",
"Parameters" : {
"VpcStackName" : {
"Description" : "VPC Stack Name.",
"Type" : "String"
},
"PublicSubnetStackName" : {
"Description" : "Public Subnet Stack Name.",
"Type" : "String"
},
"InternetGatewayStackName" : {
"Description" : "Internet Gateway Stack Name.",
"Type" : "String"
}
},
"Resources" : {
"PublicRouteTable" : {
"Type" : "AWS::EC2::RouteTable",
"Properties" : {
"VpcId" : {
"Fn::Sub" : "${VpcStackName}"
},
"Tags" : [
{
"Key" : "Application",
"Value" : {
"Ref" : "AWS::StackId"
}
},
{
"Key" : "Network",
"Value" : "Public"
}
]
}
},
"PublicRoute" : {
"Type" : "AWS::EC2::Route",
"Properties" : {
"RouteTableId" : {
"Ref" : "PublicRouteTable"
},
"DestinationCidrBlock" : "0.0.0.0/0",
"GatewayId" : {
"Fn::Sub" : "${InternetGatewayStackname}"
}
}
},
"PublicSubnetRouteTableAssociation" : {
"Type" : "AWS::EC2::SubnetRouteTableAssociation",
"Properties" : {
"SubnetId" : {
"Fn::Sub" : "${PublicSubnetStackName}"
},
"RouteTableId" : {
"Ref" : "PublicRouteTable"
}
}
}
},
"Outputs" : {
"PublicRoute" : {
"Description" : "Public Route.",
"Value" : {
"Ref" : "PublicRoute"
},
"Export" : {
"Name" : {
"Fn::Sub" : "${AWS::StackName}-PublicRoute"
}
}
}
}
}
Thanks!
Upvotes: 0
Views: 1330
Reputation: 36073
Your resource is called InternetGatewayStackName
.
But in your PublicRoute
resource, you are using the following:
"Fn::Sub" : "${InternetGatewayStackname}"
Note that case in your sub does not match the case in your resource name.
Upvotes: 1