如何在aws中将一个云形成模板文件之间的参数传递给另一个云形成模板文件? 我不是在谈论嵌套模板,因为我知道它们只是一个CFT中的单独资源块,如果我错了请纠正我。
答案 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)
有两种主要方法可以协调云形成模板:
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
检索堆栈的输出。答案 4 :(得分:0)
我认为你真正想要的是创建一个Lambda,它将检索另一个cloudformation的输出并将它们暴露在正在运行的云层中。
然后你可以像NetworkStack
那样检索输出。
"NetworkInfo": {
"Type": "Custom::NetworkInfo",
"Properties": {
"ServiceToken": { "Fn::GetAtt" : ["LookupStackOutputs", "Arn"] },
"StackName": {
"Ref": "NetworkStackName"
}
}
}
并通过以下方式使用它们:
"SubnetId" : { "Fn::GetAtt": [ "NetworkInfo", "PublicSubnet" ] }
我自己使用它,它非常适合每月为Lambda提供的免费执行时间。