2017-04-13 81 views
1

更多AWS问题!好的,所以这个想法是一个主模板调用所有的嵌套堆栈。在这里的帮助下,我想出了如何将主参数传递给嵌套堆栈。现在我正试图弄清楚如何将嵌套堆栈中的值传递给嵌套堆栈。我相信这应该通过出口和进口完成,但我认为我没有这样做是正确的。我不确定是否我的进口或出口是错误的。AWS CloudFormation:在嵌套堆栈之间传递值

我得到的错误是:

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,并正在试图快速把它捡起来。

回答

3

的问题

您的问题是要导出的值作为

"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

PS。为了清晰起见,你应该改变一些你的名字。尽量避免在整个地方重复使用相同的名字。它有助于让事情清楚。

相关问题