如何将一个云层之间的参数传递给另一个云层模板
How to pass parameters between one cloud formation to another cloud formation template
如何在 aws 中将参数从一个云形成模板文件传递到另一个云形成模板文件?
我不是在谈论嵌套模板,据我了解它们只是一个 CFT 中的单独资源块,如果我错了请纠正我。
只有在堆栈之间传递参数才有意义,而不是在模板之间传递参数 - 模板只是 JSON 结构。
你可以这样做:
在第一个模板中,创建如下输出值:
"Outputs" : {
"ParentVPC" : {
"Value" : {"Ref":"VPC"},
"Description" : "VPC ID"
},
...
}
然后,在第二个模板中,创建如下参数:
"Parameters" : {
"ParentVPC" : {
"Type" : "AWS::EC2::VPC::Id",
},
...
}
从第二个模板创建堆栈时,在从第一个模板创建的堆栈上调用describe-stack
以获取输出值,并将它们作为参数传递给create-stack
。
我能够将参数从一个 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"
}
],
}
}
}
编排云形成模板的主要方法有两种:
- 使用Cloud Formation Nested Stacks。这允许一个云形成堆栈创建和管理一个单独的堆栈。如果堆栈上的其他资源需要它们,您可以使用
Fn::GetAtt
检索堆栈的输出。
- 使用 Ansible 或普通 bash 脚本等非 AWS 工具进行编排。 Ansible 使得检索一个堆栈的输出并传递给另一个堆栈变得容易,例如:
我认为您真正想要的是创建一个 Lambda,它将检索另一个 cloudformation 的输出并将它们公开在您的 运行 cloud formation 中。
然后您可以像这样从 NetworkStack
中检索输出。
"NetworkInfo": {
"Type": "Custom::NetworkInfo",
"Properties": {
"ServiceToken": { "Fn::GetAtt" : ["LookupStackOutputs", "Arn"] },
"StackName": {
"Ref": "NetworkStackName"
}
}
}
并通过以下方式使用它们:
"SubnetId" : { "Fn::GetAtt": [ "NetworkInfo", "PublicSubnet" ] }
我自己正在使用它,它非常适合您每月获得的 Lambda 免费执行分钟数。
查看 the official documentation for cross-stack references 及其使用方法。
基本思想是将共享资源放入它们自己的堆栈中,以便其他堆栈可以引用这些资源。这会导致您所有的云形成模板中的 copy/paste 减少。
例如,您可能有多个相关的 Web 应用程序,它们的服务器使用相同的安全组规则。与其在每个 Web 应用程序的每个云形成模板中多次定义完全相同的安全组,不如将该安全组放入其自己的 template/stack 中,将安全组 ID 声明为输出,然后在您的所有Web 应用程序的 cf 模板,您可以导入该安全组 ID 并为您的实例的安全组引用它。这样可以减少重复代码和关注点分离,因为网络工程师可以管理 VPC/subnets/security 组周围的安全性,而您只需要担心您的 servers/applications.
如何在 aws 中将参数从一个云形成模板文件传递到另一个云形成模板文件? 我不是在谈论嵌套模板,据我了解它们只是一个 CFT 中的单独资源块,如果我错了请纠正我。
只有在堆栈之间传递参数才有意义,而不是在模板之间传递参数 - 模板只是 JSON 结构。
你可以这样做:
在第一个模板中,创建如下输出值:
"Outputs" : {
"ParentVPC" : {
"Value" : {"Ref":"VPC"},
"Description" : "VPC ID"
},
...
}
然后,在第二个模板中,创建如下参数:
"Parameters" : {
"ParentVPC" : {
"Type" : "AWS::EC2::VPC::Id",
},
...
}
从第二个模板创建堆栈时,在从第一个模板创建的堆栈上调用describe-stack
以获取输出值,并将它们作为参数传递给create-stack
。
我能够将参数从一个 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"
}
],
}
}
}
编排云形成模板的主要方法有两种:
- 使用Cloud Formation Nested Stacks。这允许一个云形成堆栈创建和管理一个单独的堆栈。如果堆栈上的其他资源需要它们,您可以使用
Fn::GetAtt
检索堆栈的输出。 - 使用 Ansible 或普通 bash 脚本等非 AWS 工具进行编排。 Ansible 使得检索一个堆栈的输出并传递给另一个堆栈变得容易,例如:
我认为您真正想要的是创建一个 Lambda,它将检索另一个 cloudformation 的输出并将它们公开在您的 运行 cloud formation 中。
然后您可以像这样从 NetworkStack
中检索输出。
"NetworkInfo": {
"Type": "Custom::NetworkInfo",
"Properties": {
"ServiceToken": { "Fn::GetAtt" : ["LookupStackOutputs", "Arn"] },
"StackName": {
"Ref": "NetworkStackName"
}
}
}
并通过以下方式使用它们:
"SubnetId" : { "Fn::GetAtt": [ "NetworkInfo", "PublicSubnet" ] }
我自己正在使用它,它非常适合您每月获得的 Lambda 免费执行分钟数。
查看 the official documentation for cross-stack references 及其使用方法。
基本思想是将共享资源放入它们自己的堆栈中,以便其他堆栈可以引用这些资源。这会导致您所有的云形成模板中的 copy/paste 减少。
例如,您可能有多个相关的 Web 应用程序,它们的服务器使用相同的安全组规则。与其在每个 Web 应用程序的每个云形成模板中多次定义完全相同的安全组,不如将该安全组放入其自己的 template/stack 中,将安全组 ID 声明为输出,然后在您的所有Web 应用程序的 cf 模板,您可以导入该安全组 ID 并为您的实例的安全组引用它。这样可以减少重复代码和关注点分离,因为网络工程师可以管理 VPC/subnets/security 组周围的安全性,而您只需要担心您的 servers/applications.