Использование AWS CloudFormation для создания DBSubnetGroup

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

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

Единственная информация, которую дает мне CFN, - это то, что «некоторые входные подсети недействительны».

Ошибка CFN: Ошибка CFN

Подсети: Подсети

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

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

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

 "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»


person Kaleo Brandt    schedule 18.01.2017    source источник
comment
Было бы полезно увидеть, как вы передаете подсети в yaml / json Cloudformation - пожалуйста, опубликуйте, если можете.   -  person rumdrums    schedule 19.01.2017
comment
Добавлен соответствующий json!   -  person Kaleo Brandt    schedule 19.01.2017
comment
Спасибо, ребята, я давно не чувствовал этого тупого лол   -  person Kaleo Brandt    schedule 19.01.2017
comment
Ржу не могу. Добро пожаловать в Cloudformation! Развертывание, сбой, развертывание, сбой, развертывание ...   -  person rumdrums    schedule 19.01.2017


Ответы (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
person rumdrums    schedule 18.01.2017

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

"SubnetIds": [
  {"Ref": "pubSubnetAz1"},
  {"Ref": "pubSubnetAz2"}
]
person wjordan    schedule 19.01.2017