Cloudformation根堆栈参考

时间:2019-05-15 14:43:22

标签: amazon-web-services amazon-cloudformation

是否有一种方法可以将变量从根堆栈向下发送给子堆栈,然后让每个子堆栈使用交叉堆栈引用来创建每个资源?

我正在尝试使用根堆栈将一些变量传递给子堆栈,例如stackName,然后是每个子堆栈< / strong>将使用stackName创建自己的资源(例如API网关,DynamoDB等)。

==>目标是从根堆栈创建整个应用,每个资源(由子堆栈创建)具有相同的前缀,例如this-app-,然后对于DynamoDB这样的资源,表名将为this-app-dynamodb-table。因此,如果是代码,它将是这样的:

function main(stackName) {
  createRoles(stackName);
  createAPIGateway(stackName);
  createDynamoDB(stackName);
}
function createRoles(appName) {
  let roleARN = `${appName}ARN`;
  // create some roles
}
// more functions
main('this-app'); // call the root-stack or the main function, pass in the name of the app as a parameter.

在AWS Docs here中,看来根堆栈仍然拥有所有Resources并使用"Fn::ImportValue

this guide about nested stacks中,如果我只想引用另一个堆栈,则必须将堆栈保存在S3存储桶中,然后使用:

{
  "Type" : "AWS::CloudFormation::Stack",
  "Properties" : {
      "NotificationARNs" : [ String, ... ],
      "Parameters" : {Key : Value, ...},
      "Tags" : [ Tag, ... ],
      "TemplateURL" : String,
      "TimeoutInMinutes" : Integer
    }
}

我已经在线查看了一些答案,但是它们并不能解决问题,或者可能是我从错误的角度看问题。

  

5月15日更新

我已将模板添加到S3存储桶中。

我不明白一件事:

如果子堆栈看起来像正常的堆栈,它将如何获取变量?我认为它应该像这样:

 "Resources": {
        "RootStack": {
            "Type": "AWS::CloudFormation::Stack",
            "Properties" : {
                "TemplateURL": "https://s3.amazonaws.com/BUCKET/RootStack.json",
                "DynamoDBTableName": { 
                    "Fn::GetAtt" : [ "RootStack", "TableName" ]
                }
            }
        },
        "DDBTable": {
            "Type": "AWS::DynamoDB::Table",
            "Properties": {
                "TableName": {
                    "Fn::GetAtt" : [ "RootStack", "DynamoDBTableName" ]
                },
                "AttributeDefinitions": [...

和RootStack.json应该看起来像这样:

"Resources": {
        "Database": {
            "Type": "AWS::CloudFormation::Stack",
            "Properties": {
                "Parameters": {
                    "TableName": {
                        "Fn::Sub": "${AWS::StackName}-dynamodb-table"
                    }
                },
                "TemplateURL": "https://s3.amazonaws.com/BUCKET/DatabaseStack.json.json"
            }
        }
    },...

我理解正确吗?

1 个答案:

答案 0 :(得分:1)

您可以像这样从父堆栈中传递参数:

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "NestedStack Example",
  "Parameters" : {
    "MyParameter1" : {
      "Type" : "String"
    },
    "MyParameter2" : {
      "Type" : "String"
    },
    "MyParameter3" : {
      "Type" : "String"
    }
  },
  "Resources" : {
    "ChildStack1": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "Parameters": {
          "My1stParemeter": { "Ref": "MyParameter1" },
          "My2ndParemeter": { "Ref": "MyParameter2"}
        },
        "TemplateURL": "https://s3-eu-west-1.amazonaws.com/template-bucket/mytemplate1.json"
      }
    },
    "ChildStack2": {
        "Type": "AWS::CloudFormation::Stack",
        "Properties": {
          "Parameters": {
            "My3rdParemeter": { "Ref": "MyParameter3" }
          },
          "TemplateURL": "https://s3-eu-west-1.amazonaws.com/template-bucket/mytemplate2.json"
        }
      }
  }
}

您还可以将属性从在父堆栈中创建的资源传递到子堆栈。例如,如果您在父堆栈中创建了一个名为myinstance的实例,则可以在嵌套堆栈资源中使用它:

"ChildStack1": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "Parameters": {
          "MyEC2PrivateIP": { "Fn::GetAtt" : [ "myinstance", "PrivateIp" ] }
        },
        "TemplateURL": "https://s3-eu-west-1.amazonaws.com/template-bucket/mytemplate1.json"
      }

您的子级Cloudformation模板看起来像普通模板,没有什么特别的事情-您只需要从父级“拉入”参数作为常规参数列出即可。