如何将一个云层之间的参数传递给另一个云层模板

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 中。

这里解释得很好: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 免费执行分钟数。

查看 the official documentation for cross-stack references 及其使用方法。

基本思想是将共享资源放入它们自己的堆栈中,以便其他堆栈可以引用这些资源。这会导致您所有的云形成模板中的 copy/paste 减少。

例如,您可能有多个相关的 Web 应用程序,它们的服务器使用相同的安全组规则。与其在每个 Web 应用程序的每个云形成模板中多次定义完全相同的安全组,不如将该安全组放入其自己的 template/stack 中,将安全组 ID 声明为输出,然后在您的所有Web 应用程序的 cf 模板,您可以导入该安全组 ID 并为您的实例的安全组引用它。这样可以减少重复代码和关注点分离,因为网络工程师可以管理 VPC/subnets/security 组周围的安全性,而您只需要担心您的 servers/applications.