如何在一个云形成之间传递参数到另一个云形成模板

时间:2015-08-21 21:18:58

标签: amazon-web-services amazon-cloudformation

如何在aws中将一个云形成模板文件之间的参数传递给另一个云形成模板文件? 我不是在谈论嵌套模板,因为我知道它们只是一个CFT中的单独资源块,如果我错了请纠正我。

5 个答案:

答案 0 :(得分:3)

只有在堆栈之间传递参数才有意义,而不是在模板之间传递参数 - 模板只是JSON结构。

你可以这样做:

在第一个模板中,创建如下输出值:

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

然后,在第二个模板中,创建如下参数:

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

从第二个模板创建堆栈时,在从第一个模板创建的堆栈上调用describe-stack以获取输出值,并将它们作为参数传递给create-stack

答案 1 :(得分:3)

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

基本思想是,您将共享资源放入自己的堆栈中,以便其他堆栈可以引用这些资源。这样可以减少所有云形成模板中的复制/粘贴。

例如,您可能有多个相关的Web应用程序对其服务器使用相同的安全组规则。您可以将该安全组放入其自己的模板/堆栈中,将安全组ID声明为输出,然后在所有Web应用程序中,而不是在每个Web应用程序的每个云编队模板中多次定义相同的确切安全组。 'cf templates,您可以导入该安全组ID并为您的实例的安全组引用它。由于网络工程师可以管理VPC /子网/安全组周围的安全性,因此只需要担心服务器/应用程序。

这样可以减少重复代码和关注点的分离。

答案 2 :(得分:0)

我能够将参数从一个CFT传递到另一个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"
                    }
                ],
              }
        }    
}

答案 3 :(得分:0)

有两种主要方法可以协调云形成模板:

  • 使用Cloud Formation Nested Stacks。这允许一个云形成堆栈创建和管理单独的堆栈。如果您需要堆栈中的其他资源,可以使用Private Sub FilterPaperList() Dim strRS As String strRS = "SELECT qrylstpapers.Title, qrylstpapers.PaperTypeName " _ & " FROM qrylstpapers " _ & " WHERE 1 = 1 " If Not IsNull(Me.cboPaperNumberAssign) Then strRS = strRS & " AND PaperNumber = " & Me.cboPaperNumberAssign End if If Not IsNull(Me.cboSessionAssign) Then strRS = strRS & " AND SessionNumber = '" & Me.cboSessionAssign End If If Not IsNull(Me.cboSubCommitteeAssign) Then strRS = strRS & " AND SubCommitteeName = " & Me.cboSubCommitteeAssign & "'" End If If Not IsNull(Me.cboPaperTypeAssign) Then strRS = strRS & " AND PaperTypeName = '" & Me.cboPaperTypeAssign & "'" End If strRS = strRS & " ORDER BY qrylstpapers.Title;" Me.lstPapers.RowSource = strRS Me.lstPapers.Requery End Sub 检索堆栈的输出。
  • 使用非{AWS}工具(如Ansible或普通bash脚本)进行编排。 Ansible可以轻松检索一个堆栈的输出并传递给另一个堆栈,例如:

答案 4 :(得分: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提供的免费执行时间。