Terraform «Цель маршрута не поддерживается» при создании таблицы маршрутов AWS, чтобы сделать su bnet общедоступным - PullRequest
4 голосов
/ 06 марта 2020

Используя terraform v0.12.21 и провайдера AWS v2.51.0, я пытаюсь создать некоторую инфраструктуру с нуля (без предыдущего состояния terraform).

Цель состоит в том, чтобы сделать общедоступным Экземпляры EC2 в одном VP C, и я думаю, что это ресурсы, которые мне нужны для достижения sh, которые:

  • VP C
  • Inte rnet шлюз в VP C
  • Su bnet в VP C
  • Таблица маршрутов в VP C для подключения su bnet к inte rnet gateway
  • Ассоциация таблицы маршрутов для подключения su bnet к таблице маршрутов
  • Группа безопасности в VP C, которая будет установлена ​​для экземпляров
  • Несколько экземпляров EC2

Использование этой конфигурации terraform:

locals {
  office_cidr = ["x.x.x.x/32", "x.x.x.x/32"]
}

provider "aws" {
  region  = var.region
  version = "~> 2.51"
}

resource "aws_vpc" "main" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"
}

resource "aws_internet_gateway" "gw" {
  vpc_id = aws_vpc.main.id
}

resource "aws_subnet" "main" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
}

resource "aws_route_table" "r" {
  vpc_id = aws_vpc.main.id

  route {
    cidr_block = aws_subnet.main.cidr_block
    gateway_id = aws_internet_gateway.gw.id
  }
}

resource "aws_route_table_association" "a" {
  subnet_id      = aws_subnet.main.id
  route_table_id = aws_route_table.r.id
}


resource "aws_security_group" "allow_http" {
  name        = "security group"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = local.office_cidr
  }

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = local.office_cidr
  }

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = local.office_cidr
  }
}

resource "aws_instance" "a" {
  ami                         = "ami-xxxxxxxxxxxxxxxxx"
  instance_type               = "t2.micro"
  vpc_security_group_ids      = ["${aws_security_group.allow_http.id}"]
  subnet_id                   = aws_subnet.main.id
  associate_public_ip_address = true
}
resource "aws_instance" "b" {
  ami                         = "ami-xxxxxxxxxxxxxxxxx"
  instance_type               = "t2.micro"
  vpc_security_group_ids      = ["${aws_security_group.allow_http.id}"]
  subnet_id                   = aws_subnet.main.id
  associate_public_ip_address = true
}

Когда я планирую это, все выглядит нормально (только показывая aws_route_table часть выходных данных плана здесь):

# aws_route_table.r will be created


 + resource "aws_route_table" "r" {
      + id               = (known after apply)
      + owner_id         = (known after apply)
      + propagating_vgws = (known after apply)
      + route            = [
          + {
              + cidr_block                = "10.0.1.0/24"
              + egress_only_gateway_id    = ""
              + gateway_id                = (known after apply)
              + instance_id               = ""
              + ipv6_cidr_block           = ""
              + nat_gateway_id            = ""
              + network_interface_id      = ""
              + transit_gateway_id        = ""
              + vpc_peering_connection_id = ""
            },
        ]
      + vpc_id           = (known after apply)
    }

Вход aws_subnet.main.cidr_block для cidr_block в route интерполируется в "10.0.1.0/24".

Но когда я подаю заявку, я получаю это er ror:

Error: Error creating route: InvalidParameterValue: Route target is not supported. This route only supports interface and instance targets.
status code: 400, request id: a303e768-69e2-4af0-88d4-e97ebcaeae5d

  on main.tf line 38, in resource "aws_route_table" "r":
  38: resource "aws_route_table" "r" {

Под «целью интерфейса» подразумевается сетевой интерфейс? Если да, то автоматически ли создается сетевой интерфейс при создании VP C, или я должен также создать ресурс aws_network_interface и подключить к нему шлюз inte rnet?

В целом, я хотел бы узнать, как лучше всего создавать экземпляры на su bnet, для которых необходимо иметь публичные c IP-адреса и быть общедоступными, не нужны ли какие-либо из моих ресурсов, и если Я пропускаю любые ресурсы, которые обычно включаются.

Но для целей этого вопроса: как мне изменить блок ресурсов aws_route_table и любые другие блоки ресурсов, чтобы устранить эту ошибку и сделать так, чтобы мои экземпляры были общедоступными

1 Ответ

1 голос
/ 24 марта 2020

Если в маршруте вы используете inte rnet gateway gateway_id = aws_internet_gateway.gw.id, для такого маршрута cidr_block должен быть 0.0.0.0/0, но не aws_su bnet .main.cidr_block

...