2015-08-21 27 views

回答

2

它只能在堆棧之間傳遞參數,而不是在模板之間傳遞 - 模板只是JSON結構。

你可以這樣說:

在第一個模板,創建輸出值是這樣的:

"Outputs" : { 
    "ParentVPC" : { 
     "Value" : {"Ref":"VPC"}, 
     "Description" : "VPC ID" 
    }, 
    ... 
} 

然後,在第二個模板,創建這樣的參數:

"Parameters" : { 
    "ParentVPC" : { 
     "Type" : "AWS::EC2::VPC::Id", 
    }, 
    ... 
} 

從第二個模板創建堆棧時,請在從第一個模板創建的堆棧上調用describe-stack以獲取輸出值,並將它們作爲參數傳遞給create-stack

+0

如何從第一個模板中調用第二個模板?目前我正在使用這種方法,顯然是不正確的..''http:// stackoverflow.com/questions/32147966 /傳遞參數在嵌套雲形成模板,我 –

+0

沒有辦法做到這一點 - 當你創建第一個堆棧時,第二個堆棧不存在,所以沒有什麼可以查找的。 – bsvingen

+1

如果您想在兩個堆棧之間共享數據,則可以始終創建他們都訪問的第三個堆棧。 – bsvingen

0

我能夠將參數從一個CFT傳遞給另一個: 我在子CFT中定義了參數,並在父CFT中傳遞了它們的值。這裏有一個例子:

家長CFT(CFT1)

{ 
    "AWSTemplateFormatVersion": "2010-09-09", 
    "Description": "Chef HA AWS Template", 
    "Parameters" : { 
     "ChefServerAWSRegion" : { 
       "Description" : "Choose deployment target from list", 
       "Type" : "String", 
       "AllowedValues" : ["deveast1", "qaeast1", "prodeast1","prodwest1","prodwest2"], 
       "Default": "deveast1" 
     } 
    }, 
    "Mappings": { 
       "deveast1": 
       { 
         "chefstackurl":{ 
          "frontend" : "https://s3.amazonaws.com/tbdchef/frontendinstance.json", 
         }, 
         "a": 
         { 
          "sgBlueStripe": "sg-81c09fe5", 
          "sgSharedServices": "sg-82c09fe6", 
          } 
       } 
    } 
} 

子模板(其中值的定義,我遵守了我的邏輯把基礎設施​​建設:

{ 
    "AWSTemplateFormatVersion": "2010-09-09", 
    "Description": "Chef HA AWS Template", 
    "Parameters": { 
     "sgBlueStripe": { 
      "Description": "sgBlueStripe", 
      "Type": "String" 
     }, 
     "sgSharedServices": { 
      "Description": "sgSharedServices", 
      "Type": "String" 
     }  
    } 
    "Resources": { 
     "FrontendInstance": 
     { 
      "Type": "AWS::EC2::Instance", 
      "Properties": { 
       "DisableApiTermination": "true", 
       "SecurityGroupIds": [ 
        { 
         "Ref": "sgBlueStripe" 
        }, 
        { 
         "Ref": "sgSharedServices" 
        } 
       ], 
       } 
     }  
} 
0

有協調雲形成模板的兩種主要方式:

  • 使用Cloud Formation Nested Stacks。這允許一個clou d形成堆棧來創建和管理一個單獨的堆棧。如果您需要堆棧中的其他資源,則可以使用Fn::GetAtt檢索堆棧的輸出。
  • 使用非AWS工具(如Ansible)或純bash腳本進行編排。 Ansible可以很容易地檢索一個堆棧的輸出,並通過花葯,例如:
0

,我認爲那是你真正需要的是創造一個lambda,將檢索另一個cloudformation的輸出,並揭露他們在你的雲運行中。

這是很好的說明如下:http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/walkthrough-custom-resources-lambda-cross-stack-ref.html

您然後檢索從NetworkStack輸出像這樣。

"NetworkInfo": { 
    "Type": "Custom::NetworkInfo", 
    "Properties": { 
    "ServiceToken": { "Fn::GetAtt" : ["LookupStackOutputs", "Arn"] }, 
    "StackName": { 
     "Ref": "NetworkStackName" 
    } 
    } 
} 

,並用它們做:

"SubnetId" : { "Fn::GetAtt": [ "NetworkInfo", "PublicSubnet" ] } 

我使用它自己,它用我們每個月LAMBDA自由執行分鐘合身。

1

檢出the official documentation for cross-stack references以及如何使用它。

其基本思想是將共享資源放入自己的堆棧中,以便其他堆棧可以引用這些資源。這會減少所有云模板中的複製/粘貼。

例如,您可能有多個相關的Web應用程序,它們的服務器使用相同的安全組規則。您可以將每個Web應用程序的每個雲形成模板中的安全組多次定義爲相同的安全組,然後將該安全組放入其自己的模板/堆棧中,將安全組ID標識爲輸出,然後將所有Web應用程序'cf模板,您可以導入該安全組標識並將其引用到您的實例的安全組。這會導致代碼重複性降低,並使問題分離,因爲網絡工程師可以管理VPC /子網/安全組周圍的安全性,並且只需要擔心服務器/應用程序。

+0

那正是我現在正在做的,謝謝 –

+0

太棒了!我注意到你的問題是一年前沒有正式答案,所以我想我會插話進去。 –