Я пытаюсь настроить транзитный шлюз (TGW), охватывающий два региона через terraform. Я настраиваю два TGW в каждом регионе, создаю вложение TGW в любом регионе, таблицу маршрутов с маршрутами, указывающими на противоположный регион с определенной подсетью, но во время создания существует встроенная таблица маршрутов по умолчанию, которая указывает на локальный регион. подсеть, которая мешает маршрутизации. Вот фрагмент моего терраформирования:
resource "aws_ec2_transit_gateway" "main" {
description = "main transit gateway"
provider = aws
tags = {
Name = "main draas transit gateway"
}
}
resource "aws_ec2_transit_gateway_vpc_attachment" "main" {
subnet_ids = [aws_subnet.private.id]
transit_gateway_id = aws_ec2_transit_gateway.main.id
vpc_id = aws_vpc.main.id
provider = aws
tags = {
Name = "main draas tgw attachment"
}
}
resource "aws_ec2_transit_gateway_route_table" "main" {
transit_gateway_id = aws_ec2_transit_gateway.main.id
provider = aws
tags = {
Name = "main draas tgw route table"
}
}
resource "aws_ec2_transit_gateway_route" "main" {
destination_cidr_block = var.staging_private_subnet_cidr
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.main.id
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.main.id
provider = aws
}
resource "aws_ec2_transit_gateway_peering_attachment" "main" {
provider = aws
peer_transit_gateway_id = aws_ec2_transit_gateway.dr.id
transit_gateway_id = aws_ec2_transit_gateway.main.id
peer_account_id = var.account_id
peer_region = var.dr_region
tags = {
Name = "main draas tgw peering"
}
}
resource "aws_ec2_transit_gateway" "dr" {
provider = aws.dr
description = "dr transit gateway"
tags = {
Name = "dr transit draas gateway"
}
}
resource "aws_ec2_transit_gateway_vpc_attachment" "dr" {
provider = aws.dr
subnet_ids = [aws_subnet.staging_private.id]
transit_gateway_id = aws_ec2_transit_gateway.dr.id
vpc_id = aws_vpc.staging.id
tags = {
Name = "dr tgw draas attachment"
}
}
resource "aws_ec2_transit_gateway_route_table" "dr" {
provider = aws.dr
transit_gateway_id = aws_ec2_transit_gateway.dr.id
tags = {
Name = "dr tgw draas route table"
}
}
resource "aws_ec2_transit_gateway_route" "dr" {
provider = aws.dr
destination_cidr_block = var.main_private_subnet_cidr
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.dr.id
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.dr.id
}
Когда я применяю terraform, я получаю две таблицы маршрутов TGW в каждом регионе: по умолчанию, которая указывает на CIDR, связанный с TGW в том же регионе, и ту, которую я создаю здесь, в своем коде terraform, который должен маршрутизировать трафик в противоположный регион.
Когда я провожу анализ достижимости, экземпляр ec2 в us-east-1 не может проверить связь с экземпляром us-west-2, и проблема заключается в таблице маршрутов TGW. Кажется, что используется таблица маршрутов TGW по умолчанию, а та, которую я создаю в terraform, игнорируется. Я понимаю, что способ выполнения пиринга в моем коде .tf неправильный, но даже после того, как я согласен на пиринг в консоли, маршрутизация неверна.
Я знаю, что у terraform есть некоторые ограничения, но есть ли у кого-нибудь какие-нибудь умные способы обойти это, кроме входа в консоль AWS и изменения вручную?
Похоже, если вы повернете таблицы маршрутов шлюза так, чтобы они указывали на объекты данных, это сработает. Подтверждено анализатором доступности VPC. Скоро я опубликую обновленный код.
Обновлено: Обновлено с рабочим Terraform:
resource "aws_ec2_transit_gateway" "main" {
description = "main transit gateway"
provider = aws
tags = {
Name = "main draas transit gateway"
}
}
resource "aws_ec2_transit_gateway_vpc_attachment" "main" {
subnet_ids = [aws_subnet.private.id]
transit_gateway_id = aws_ec2_transit_gateway.main.id
vpc_id = aws_vpc.main.id
provider = aws
tags = {
Name = "main draas tgw attachment"
}
}
data "aws_ec2_transit_gateway_route_table" "main" {
provider = aws
filter {
name = "default-association-route-table"
values = ["true"]
}
filter {
name = "transit-gateway-id"
values = [aws_ec2_transit_gateway.main.id]
}
tags = {
Name = "main tgw draas route table"
}
}
resource "aws_ec2_transit_gateway_route" "main" {
destination_cidr_block = var.staging_private_subnet_cidr
transit_gateway_route_table_id = data.aws_ec2_transit_gateway_route_table.main.id
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.main.id
provider = aws
}
resource "aws_ec2_transit_gateway_peering_attachment" "main" {
provider = aws
peer_transit_gateway_id = aws_ec2_transit_gateway.dr.id
transit_gateway_id = aws_ec2_transit_gateway.main.id
peer_account_id = var.account_id
peer_region = var.dr_region
tags = {
Name = "main draas tgw peering"
}
}
## DR
resource "aws_ec2_transit_gateway" "dr" {
provider = aws.dr
description = "dr transit gateway"
tags = {
Name = "dr transit draas gateway"
}
}
resource "aws_ec2_transit_gateway_vpc_attachment" "dr" {
provider = aws.dr
subnet_ids = [aws_subnet.staging_private.id]
transit_gateway_id = aws_ec2_transit_gateway.dr.id
vpc_id = aws_vpc.staging.id
tags = {
Name = "dr tgw draas attachment"
}
}
data "aws_ec2_transit_gateway_route_table" "dr" {
provider = aws.dr
filter {
name = "default-association-route-table"
values = ["true"]
}
filter {
name = "transit-gateway-id"
values = [aws_ec2_transit_gateway.dr.id]
}
tags = {
Name = "dr tgw draas route table"
}
}
resource "aws_ec2_transit_gateway_route" "dr" {
provider = aws.dr
destination_cidr_block = var.main_private_subnet_cidr
transit_gateway_route_table_id = data.aws_ec2_transit_gateway_route_table.dr.id
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.dr.id
}
data "aws_ec2_transit_gateway_peering_attachment" "dr" {
provider = aws.dr
depends_on = [ aws_ec2_transit_gateway_peering_attachment.main ]
filter {
name = "state"
values = [ "pendingAcceptance" ]
}
# Only the second accepter/peer transit gateway is called from the peering attachment.
filter {
name = "transit-gateway-id"
values = [ aws_ec2_transit_gateway_peering_attachment.main.peer_transit_gateway_id ]
}
}
resource "aws_ec2_transit_gateway_peering_attachment_accepter" "dr" {
provider = aws.dr
transit_gateway_attachment_id = data.aws_ec2_transit_gateway_peering_attachment.dr.id
}