2

Я использую ECS-CLI (0.4.5) для запуска CFN-шаблона, и теперь я пытаюсь поместить кластер Aurora в шаблон CFN и обновить стек с помощью набора изменений через CFN SDK.Использование AWS CloudFormation для создания DBSubnetGroup

Я не могу понять, почему это расстраивает мои подсетей. Подсети создаются с помощью начального вызова «ecs-cli up». Они находятся в том же vpc, что и остальная часть стека, они уже существуют до того, как я попытаюсь развернуть набор изменений, и они находятся в разных зонах доступности (us-west-2b и us-west-2c).

Только информация CFN дает мне, что «некоторые подсети ввода недопустимы».

НКС Failure: CFN Failure

Subnets: Subnets

Я могу создать DBSubnetGroup через консоль управления с точно такими же подсеть без проблем.

Любые идеи о том, что может произойти неправильно? Это ошибка в CloudFormation? Дайте мне знать, если требуется дополнительная информация, чтобы решить эту проблему ... Я честно на такой потери

Вот что мой первоначальный шаблон сводится к (Он построен в Écs-кли):

"PubSubnetAz1": { 
     "Type": "AWS::EC2::Subnet", 
     "Properties": { 
      "VpcId": { 
       "Ref": "Vpc" 
      }, 
      "CidrBlock": "10.0.0.0/24", 
      "AvailabilityZone": "us-west-2b" 
     } 
}, 
"PubSubnetAz2": { 
     "Type": "AWS::EC2::Subnet", 
     "Properties": { 
      "VpcId": { 
       "Ref": "Vpc" 
      }, 
      "CidrBlock": "10.0.1.0/24", 
      "AvailabilityZone": "us-west-2c" 
     } 
}, 
"InternetGateway": { 
    "Type": "AWS::EC2::InternetGateway" 
}, 
"AttachGateway": { 
    "Type": "AWS::EC2::VPCGatewayAttachment", 
    "Properties": { 
     "VpcId": { 
      "Ref": "Vpc" 
     }, 
     "InternetGatewayId": { 
      "Ref": "InternetGateway" 
     } 
    } 
}, 
"RouteViaIgw": { 
    "Type": "AWS::EC2::RouteTable", 
    "Properties": { 
     "VpcId": { 
      "Ref": "Vpc" 
     } 
    } 
}, 
"PublicRouteViaIgw": { 
    "DependsOn": "AttachGateway", 
    "Type": "AWS::EC2::Route", 
    "Properties": { 
     "RouteTableId": { 
      "Ref": "RouteViaIgw" 
     }, 
     "DestinationCidrBlock": "0.0.0.0/0", 
     "GatewayId": { 
      "Ref": "InternetGateway" 
     } 
    } 
}, 
"PubSubnet1RouteTableAssociation": { 
    "Type": "AWS::EC2::SubnetRouteTableAssociation", 
    "Properties": { 
     "SubnetId": { 
      "Ref": "PubSubnetAz1" 
     }, 
     "RouteTableId": { 
      "Ref": "RouteViaIgw" 
     } 
    } 
}, 
"PubSubnet2RouteTableAssociation": { 
    "Type": "AWS::EC2::SubnetRouteTableAssociation", 
    "Properties": { 
     "SubnetId": { 
      "Ref": "PubSubnetAz2" 
     }, 
     "RouteTableId": { 
      "Ref": "RouteViaIgw" 
     } 
    } 
}, 

А потом, когда я иду, чтобы обновить его, я добавляю это:

"DBSubnetGroup": { 
    "Type": "AWS::RDS::DBSubnetGroup", 
    "Properties": { 
     "DBSubnetGroupDescription": "Aurora Subnet Group using subnets from 2 AZs", 
     "SubnetIds": { 
      "Fn::Join": [ 
        ",", [{ 
          "Ref": "pubSubnetAz1" 
         }, 
         { 
          "Ref": "pubSubnetAz2" 
         } 
        ] 
       ] 
      }] 
     } 
    } 
} 

ревизия должна быть достаточно простой ...

"Changes": [ 
    { 
     "Type": "Resource", 
     "ResourceChange": { 
     "Action": "Add", 
     "LogicalResourceId": "DBSubnetGroup", 
     "ResourceType": "AWS::RDS::DBSubnetGroup", 
     "Scope": [], 
     "Details": [] 
     } 
    } 
] 

Я использую AWSTemplateFormatVersion 2010-09-09 и JavaScript aws-sdk "^ 2.7.21"

+0

Это помогло бы увидеть, как вы передаете подсети в CloudFormation YAML/JSON - пожалуйста, напишите, если вы можете. – rumdrums

+0

Добавлен соответствующий json! –

+0

Спасибо, ребята, прошло какое-то время, так как я почувствовал этот немой лол –

ответ

2

Проблема в том, что вы объединяете свои идентификаторы подсети в строку. Вместо этого вы должны передать их в массив. Попробуйте следующее:

"PrivateSubnetGroup": { 
    "Type": "AWS::RDS::DBSubnetGroup", 
    "Properties": { 
     "SubnetIds": [ 
     { 
      "Ref": "PubSubnetAz1" 
     }, 
     { 
      "Ref": "PubSubnetAz2" 
     } 
     ], 
     "DBSubnetGroupDescription": "Aurora Subnet Group using subnets from 2 AZs" 
    } 
    } 

Кроме того, я настоятельно рекомендую использовать yaml вместо json. Cloudformation теперь поддерживает эту функцию, а также некоторые функции быстрого доступа, упрощающие использование ссылок, и я думаю, что в конечном итоге вам будет намного проще читать и писать.

Вот пример того, как можно было бы написать эквивалент JSON в YAML:

PrivateSubnetGroup: 
    Type: AWS::RDS::DBSubnetGroup 
    Properties: 
    DBSubnetGroupDescription: Subnet group for Aurora Database 
    SubnetIds: 
    - !Ref PubSubnetAz1 
    - !Ref PubSubnetAz2 
2

Согласно документации AWS::RDS::DBSubnetGroup, параметр SubnetIDs принимает список строк, а не CommaDelimitedList что и вы предоставили в вашем примере , Вы должны пройти подсети в массиве JSON непосредственно, без использования Fn::Join:

"SubnetIds": [ 
    {"Ref": "pubSubnetAz1"}, 
    {"Ref": "pubSubnetAz2"} 
]