Назад | Перейти на главную страницу

AWS Cloudformation - невозможно добавить несколько ассоциаций подсетей в общедоступную таблицу маршрутизации

У нас есть VPC со шлюзом в Интернет. У нас есть 3 подсети (по одной в каждой зоне доступности), и мы хотим использовать одну таблицу маршрутизации для всех трех. Этот RT содержит правило для маршрутизации 0.0.0.0/0 в igw, однако, когда мы пытаемся связать более одной подсети с этим RT, создание стека не удается при создании правила маршрутизации, что дает следующее сообщение об ошибке:

route table rtb-xxxxxxx and network gateway igw-xxxxx belong to different networks.

Это странно, потому что igw не прикреплен к подсети, он прикреплен к самому VPC.

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

Я пробовал добавить 2 условия ожидания, одно из которых связано с созданием RT, а другое - с созданием правила маршрутизации, но они не решают проблему - я все равно получаю ту же ошибку в том же чертовом правиле :(

Может ли кто-нибудь пролить свет на то, что мне нужно сделать, чтобы решить эту проблему?

Как объяснил @Marcus в своем ответе на свой вопрос; это отсутствие Зависит от атрибут при создании AWS :: EC2 :: Маршрут запись, где вы указываете Шлюз.

Для записей маршрута, указывающих шлюз, необходимо указать зависимость от ресурса присоединения шлюза.

Получив ту же ошибку и почесав в голове, как это не удалось, когда IGW подключен к VPC, это было простое изменение в AWS::EC2::Route декларация.

Ошибка CFN:

"VPC" : {
    "Type" : "AWS::EC2::VPC",
    "Properties" : {"CidrBlock" : "10.1.0.0/16"}
},
"InternetGateway" : {
    "Type" : "AWS::EC2::InternetGateway"
},
"InternetGatewayAttachment" : {
    "Type" : "AWS::EC2::VPCGatewayAttachment",
    "Properties" : {
        "VpcId" : {"Ref" : "VPC"},
        "InternetGatewayId" : {"Ref" : "InternetGateway"}
    }
},
"ManagementRouteTable" : {
    "Type" : "AWS::EC2::RouteTable",
    "Properties" : {
        "VpcId" : {"Ref" : "VPC"}
    }
},
"NATDefaultRoute" : {
    "Type" : "AWS::EC2::Route",
    "Properties" : {
        "RouteTableId" : {"Ref" : "ManagementRouteTable"},
        "DestinationCidrBlock" : "0.0.0.0/0",
        "GatewayId" : {"Ref" : "InternetGateway"}
    }
}

Рабочий CFN:

"VPC" : {
    "Type" : "AWS::EC2::VPC",
    "Properties" : {"CidrBlock" : "10.1.0.0/16"}
},
"InternetGateway" : {
    "Type" : "AWS::EC2::InternetGateway"
},
"InternetGatewayAttachment" : {
    "Type" : "AWS::EC2::VPCGatewayAttachment",
    "Properties" : {
        "VpcId" : {"Ref" : "VPC"},
        "InternetGatewayId" : {"Ref" : "InternetGateway"}
    }
},
"ManagementRouteTable" : {
    "Type" : "AWS::EC2::RouteTable",
    "Properties" : {
        "VpcId" : {"Ref" : "VPC"}
    }
},
"NATDefaultRoute" : {
    "DependsOn" : "InternetGatewayAttachment",
    "Type" : "AWS::EC2::Route",
    "Properties" : {
        "RouteTableId" : {"Ref" : "ManagementRouteTable"},
        "DestinationCidrBlock" : "0.0.0.0/0",
        "GatewayId" : {"Ref" : "InternetGateway"}
    }
}

Вы уверены, что подключили InternetGatway к VPC (или к тому же VPC, что и таблица маршрутизации). В образовании облака это выглядит примерно так ...

    "AttachInternetGateway" : {
       "Type" : "AWS::EC2::VPCGatewayAttachment",
       "Properties" : {
          "VpcId" : { "Ref" : "YourVpc" },
          "InternetGatewayId" : { "Ref" : "InternetGateway" }
       }
    },

Нашел исправление. Я был на правильном пути с условиями ожидания, но оказалось, что мне нужно было добавить Зависит от атрибут правила так, чтобы он зависел от создаваемого первым igw.

Вот как мы связываем несколько подсетей с одной таблицей маршрутов:

...
"PublicSubnetA": {
    "Type": "AWS::EC2::Subnet",
    "Properties": { "AvailabilityZone": "..",
                    "CidrBlock": "...",
                    "VpcId": { "Ref": "VPC" },
                    "Tags": [ .. ] }},
"PublicSubnetB": {
    "Type": "AWS::EC2::Subnet",
    "Properties": { "AvailabilityZone": "..",
                    "CidrBlock": "...",
                    "VpcId": { "Ref": "VPC" },
                    "Tags": [ .. ] }},
"RouteTableIGW": {
    "Type": "AWS::EC2::RouteTable",
    "Properties": { "VpcId": { "Ref": "VPC" },
                    "Tags": [ .. ]}},
"...": {
    "Type": "AWS::EC2::SubnetRouteTableAssociation",
    "Properties": { "RouteTableId": { "Ref": "RouteTableIGW" },
                    "SubnetId":     { "Ref": "PublicSubnetA" }}
},
"...": {
    "Type": "AWS::EC2::SubnetRouteTableAssociation",
    "Properties": { "RouteTableId": { "Ref": "RouteTableIGW" },
                     "SubnetId":    { "Ref": "PublicSubnetB" }}
},
... 

И он отлично работает. Таким образом, я связываю одну таблицу маршрутов, управляемую IGW, с 2 общедоступными подсетями, а другую таблицу маршрутов, управляемую NAT, с 4 частными подсетями.

Вы должны использовать attachgateway для подключения нескольких подсетей с таблицей маршрутов и интернет-шлюзами. Таким образом, он соединяет интернет-шлюз с vpc.