2017-04-13 79 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。爲了清晰起見,你應該改變一些你的名字。儘量避免在整個地方重複使用相同的名字。它有助於讓事情清楚。

相關問題