Есть ли способ отправить переменные из корневого стека дочерним элементам, а затем разрешить каждому дочернему стеку создавать каждый ресурс с использованием перекрестных ссылок?
Я пытаюсь использовать корневой стек для передачи некоторых переменных в дочерние стеки , например stackName
, тогда каждый дочерний стек будет использовать stackName
для создания своего собственного ресурса (например, API Gateway, 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 здесь , похоже, что корневой стек все еще имеет все Resources
и используйте "Fn::ImportValue
.
Начиная с этого руководства о вложенных стеках , похоже, что если я просто захочу сослаться на другой стек, мне придется сохранить стек вЗатем используйте S3 bucket:
{
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"NotificationARNs" : [ String, ... ],
"Parameters" : {Key : Value, ...},
"Tags" : [ Tag, ... ],
"TemplateURL" : String,
"TimeoutInMinutes" : Integer
}
}
Я посмотрел некоторые ответы в Интернете, но они не решают проблему, или, может быть, я смотрю на проблему под неправильным углом.
Обновление от 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"
}
}
},...
Правильно ли я понимаю?