Cloudformation Ссылки на корневой каталог - PullRequest
0 голосов
/ 15 мая 2019

Есть ли способ отправить переменные из корневого стека дочерним элементам, а затем разрешить каждому дочернему стеку создавать каждый ресурс с использованием перекрестных ссылок?

Я пытаюсь использовать корневой стек для передачи некоторых переменных в дочерние стеки , например 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"
            }
        }
    },...

Правильно ли я понимаю?

1 Ответ

1 голос
/ 15 мая 2019

Вы можете передать параметры из родительского стека следующим образом:

{
  "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"
      }

Ваш дочерний шаблон облачной информации будет выглядеть как обычный шаблон, ничего особенного в этом нет - вам просто нужно, чтобы параметры, которые вы «извлекали» из родительского элемента, были указаны в качестве параметров, как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...