【问题标题】:AWS CloudFormation: Passing Values between Nested StacksAWS CloudFormation:在嵌套堆栈之间传递值
【发布时间】:2017-04-13 22:52:23
【问题描述】:

更多 AWS 问题!好的,所以想法是一个主模板调用所有嵌套堆栈。在here的帮助下,我想出了如何将参数从主堆栈传递到嵌套堆栈。现在我想弄清楚如何将值从嵌套堆栈传递到嵌套堆栈。我相信这应该通过出口和进口来完成,但我认为我的做法并不完全正确。我不确定是我的导入还是导出错误。

我得到的错误是:

No export named TestStack1-VpcStackID found. Rollback requested by user.

大师:

{
    "AWSTemplateFormatVersion" : "2010-09-09",
    "Description" : "Master template",
    "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"
        }
    },
    "Resources" : {
        "VpcStack" : {
            "Type" : "AWS::CloudFormation::Stack",
            "Properties" : {
                "Parameters" : {
                    "VpcCidrBlock" : {
                        "Ref" : "VpcCidrBlock"
                    }
                },
                "TemplateURL" : "https://s3.amazonaws.com/url/templates/vpcStack.json",
                "TimeoutInMinutes" : "5"
            }
        },
        "PublicRouteStack" : {
            "Type" : "AWS::CloudFormation::Stack",
            "Properties" : {
                "Parameters" : {
                    "PublicSubnetCidrBlock" : {
                        "Ref" : "PublicSubnetCidrBlock"
                    },
                    "VpcStack" : {
                        "Fn::ImportValue" : {
                            "Fn::Sub" : "${AWS::StackName}-VpcStackID"
                        }
                    }
                },
                "TemplateURL" : "https://s3.amazonaws.com/url/templates/publicRouteStack.json",
                "TimeoutInMinutes" : "5"
            }
        }
    }
}

VpcStack(嵌套 - 我认为我的输出不对):

{
    "AWSTemplateFormatVersion" : "2010-09-09",
    "Description" : "VPC template",
    "Parameters" : {
        "VpcCidrBlock" : {
            "Description" : "Vpc CIDR Block.",
            "Type" : "String"
        }
    },
    "Resources" : {
        "VpcStack" : {
            "Type" : "AWS::EC2::VPC",
            "Properties" : {
                "EnableDnsSupport" : "true",
                "EnableDnsHostnames" : "true",
                "CidrBlock" : {
                    "Ref" : "VpcCidrBlock"
                },
                "Tags" : [
                    {
                        "Key" : "Application",
                        "Value" : {
                            "Ref" : "AWS::StackName"
                        }
                    }
                ]
            }
        }
    },
    "Outputs" : {
        "VpcStack" : {
            "Description" : "VPC Stack ID.",
            "Value" : {
                "Ref" : "VpcStack"
            },
            "Export" : {
                "Name" : {
                    "Fn::Sub" : "${AWS::StackName}-VpcStackID"
                }
            }
        }
    }
}

PublicStubnetStack(我认为这是失败的地方):

{
    "AWSTemplateFormatVersion" : "2010-09-09",
    "Description" : "Public Subnet Stack",
    "Parameters" : {
        "PublicSubnetCidrBlock" : {
            "Default" : "10.0.0.0/24",
            "Description" : "Public subnet CIDR block.",
            "Type" : "String"
        },
        "VpcStack" : {
            "Description" : "VPC Stack.",
            "Type" : "String"
        }
    },
    "Resources" : {
        "PublicSubnet" : {
            "Type" : "AWS::EC2::Subnet",
            "Properties" : {
                "VpcId" : {
                    "Ref" : "VpcStack"
                },
                "CidrBlock" : {
                    "Ref" : "PublicSubnetCidrBlock"
                },
                "Tags" : [
                    {
                        "Key" : "Application",
                        "Value" : {
                            "Ref" : "AWS::StackName"
                        }
                    },
                    {
                        " Key" : "Network",
                        "Value" : "Public"
                    }
                ]
            }
        }
    },
    "Outputs" : {
        "PublicSubnet" : {
            "Description" : "Public Subnet ID.",
            "Value" : {
                "Ref" : "PublicSubnet"
            },
            "Export" : {
                "Name" : {
                    "Fn::Sub" : "${AWS::StackName}-PublicSubnetID"
                }
            }
        }
    }
}

很抱歉发了这么多,我对 AWS 很陌生,正在努力快速上手。

【问题讨论】:

    标签: amazon-web-services nested amazon-cloudformation


    【解决方案1】:

    问题

    您的问题是您将值导出为

    "Export" : {
      "Name" : {
        "Fn::Sub" : "${AWS::StackName}-VpcStackID"
      }
    }
    

    您正在使用${AWS::StackName} 变量,它将当前堆栈 名称替换为您的导出变量名称。请注意,这是嵌套堆栈的堆栈名称

    然而,在您的包装模板中,您正尝试将值导入为:

    "Fn::ImportValue" : {
      "Fn::Sub" : "${AWS::StackName}-VpcStackID"
    }
    

    同样,您将变量${AWS::StackName} 替换为当前堆栈,在这种情况下是您的包装堆栈

    请注意,当您使用嵌套堆栈时,实际上是在创建一个新堆栈,因此堆栈名称会根据您所在的模板而变化。

    决议

    不要对变量使用导入/导出。

    在嵌套模板中,从输出中删除 Export 元素。你不需要它们。只需使用堆栈参数将值从包装堆栈传递到嵌套堆栈,并使用堆栈输出将值从嵌套堆栈传递回包装堆栈。

    在您的包装堆栈中,使用来自VpcStack 的输出,如下所示:

    "PublicRouteStack" : {
            "Type" : "AWS::CloudFormation::Stack",
            "Properties" : {
                "Parameters" : {
                    "PublicSubnetCidrBlock" : {
                        "Ref" : "PublicSubnetCidrBlock"
                    },
                    "VpcStack" : {
                        "Fn::GetAtt" : [ "VpcStack", "Outputs.VpcStack" ]
                    }
                },
                "TemplateURL" : "https://s3.amazonaws.com/url/templates/publicRouteStack.json",
                "TimeoutInMinutes" : "5"
            }
        }
    

    请注意,在这种情况下,我通过Fn::GetAtt 函数使用来自VpcStack 嵌套堆栈的名为VpcStack输出

    附言。为了清楚起见,您应该更改一些名称。尽量避免在所有地方重复使用相同的名称。它有助于使事情变得清晰。

    【讨论】:

    • 我正在尝试这个,但是当我尝试和 !Ref 子堆栈中的参数时得到错误“未解决的依赖项”。我错过了什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2015-02-21
    • 2020-10-31
    • 2020-03-03
    • 2016-07-10
    • 2017-11-25
    相关资源
    最近更新 更多