是否有一种方法可以将变量从根堆栈向下发送给子堆栈,然后让每个子堆栈使用交叉堆栈引用来创建每个资源?
我正在尝试使用根堆栈将一些变量传递给子堆栈,例如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"
}
}
},...
我理解正确吗?
答案 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模板看起来像普通模板,没有什么特别的事情-您只需要从父级“拉入”参数作为常规参数列出即可。