简体   繁体   中英

AWS CloudFormation: Nested Stacks - Unresolved dependencies

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!

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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