передать список для формирования дочернего шаблона облака - PullRequest
0 голосов
/ 13 мая 2018

я создаю вложенные шаблоны cf, и у меня есть родительский шаблон, у которого есть этот параметр списка

 "DatabaseSubnets": {
      "Description": "The subnets to place database instances in.",
      "Type": "List<AWS::EC2::Subnet::Id>"
    }

и подобные ему ресурсы

"Resources": {
    "VPCStack": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "Parameters": {
                    "ClassB": {                      

                           "Ref": "ClassB"                     

                    }                
                },
          "TemplateURL": "https://s3.us-east-2.amazonaws.com/xxx/vpc-2.json",
          "TimeoutInMinutes": "5"
      }
    },
      "RDSStack": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "Parameters": {
                   "DatabaseInstanceType":{"Ref":"DatabaseInstanceType"},
                   "DatabasePassword":{"Ref":"DatabasePassword"},
                   "DatabaseUsername":{"Ref":"DatabaseUsername"},
                   "DatabaseBackupRetentionPeriod":{"Ref":"DatabaseBackupRetentionPeriod"},
                   "DatabaseSubnets":{ "Fn::GetAtt": [ "VPCStack", "Outputs.SubnesPublic" ] } ,
                   "DatabaseSecurityGroups":{"Ref":"DatabaseSecurityGroups"}            
                },
          "TemplateURL": "https://s3.us-east-2.amazonaws.com/xxx/rds.json",
          "TimeoutInMinutes": "5"
      },
      "DependsOn": "VPCStack"
    }

  }

, и я возвращаю список из дочернего vpcшаблон и пытается перейти в шаблон rds, но я получаю сообщение об ошибке, говоря, что Значение свойства Параметры должны быть объектом со свойствами String (или простого типа).

Я исследую его, и некоторые говорят, что вы не можете передавать списки дочернему элементу.шаблоны и тд.как я могу преодолеть это?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

да, я нашел решение, передав две строки из родительского шаблона и соединив эти две строки в виде списка.в этом случае передайте две подсети и создайте список subnetIds

родительский шаблон

"Subnets1":{
                  "Fn::GetAtt":[
                     "VPCStack",
                     "Outputs.SubnetAPublic"
                  ]
               },
               "Subnets2":{
                  "Fn::GetAtt":[
                     "VPCStack",
                     "Outputs.SubnetBPublic"
                  ]
               }

дочерний шаблон

"VPCZoneIdentifier": [
           {
            "Ref": "Subnets1"
          },
          {
            "Ref": "Subnets2"
          }
        ] 
0 голосов
/ 14 мая 2018

Я думаю, вы говорите о SubnesPublic выводе из VPCStack.

Вместо того, чтобы передавать его, как в RDSStack, вы можете Fn::Joinсписок первый.Пример:

"Fn::Join" : [ ":", [ "a", "b", "c" ] ] вернет строку a:b:c

, а затем вы можете Fn::Split ее внутри стека.Пример:

"Fn::Split" : [ ":" , "a:b:c" ] вернет массив строк ["a", "b", "c"].

Так что в вашем случае вы можете сделать это:

"DatabaseSubnets":{ "Fn::Join" [":", "Fn::GetAtt": [ "VPCStack", "Outputs.SubnesPublic" ]] }

и внутри RDSStackВы можете прочитать подсети db следующим образом:

"Fn::Split" : [ ":" , {"Ref": "DatabaseSubnets" } ]

Я более привык печатать на YAML, поэтому перепроверьте json, который я написал.

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