terraform экземпляр db и группа безопасности ec2 находятся в разных vpcs

Я пытаюсь создать vpc с общедоступной и частной подсетью вместе с кластером Aurora mysql и экземпляром в том же vpc с настраиваемой группой безопасности для RDS.

Я создал vpc (общедоступную / частную подсеть, настраиваемую группу безопасности) в модуле. также aurora-mysql в другом модуле.

Моя конфигурация vpc в файле модуля

resource "aws_vpc" "main" {
    cidr_block       = "${var.vpc_cidr}"
    instance_tenancy = "${var.tenancy}"
    enable_dns_support = "true"
    enable_dns_hostnames = "true"
   tags {
      Name = "${var.tag_name}"
   }
}

resource "aws_subnet" "main-public-1" {
   vpc_id     = "${var.vpc_id}"
   cidr_block = "${var.subnet_cidr_1}"
   availability_zone = "${var.region}a"
   map_public_ip_on_launch = true
   tags {
       Name = "${var.tag_name}-subnet1"
    }
}

resource "aws_subnet" "main-private-1" {
    count      = "${var.create_private_subnet}"
    vpc_id     = "${var.vpc_id}"
    cidr_block = "${var.private_subnet_cidr_1}"
    map_public_ip_on_launch = false
    availability_zone = "${var.region}a"

   tags {
        Name = "${var.tag_name}-private-subnet1"
    }
}
resource "aws_subnet" "main-private-2" {
    count      = "${var.create_private_subnet}"
    vpc_id     = "${var.vpc_id}"
    cidr_block = "${var.private_subnet_cidr_2}"
    map_public_ip_on_launch = false
    availability_zone = "${var.region}b"

    tags {
        Name = "${var.tag_name}-private-subnet2"
    }
}

resource "aws_security_group" "aurora-sg" {
  name   = "aurora-security-group"
  vpc_id = "${var.vpc_id}"
  ingress {
    protocol    = "tcp"
    from_port   = 0
    to_port     = 65535
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    protocol    = -1
    from_port   = 0 
    to_port     = 0 
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Моя конфигурация RDS в файле модуля

resource "aws_rds_cluster" "cluster" {
  cluster_identifier     = "${var.cluster_name}"
  engine                 = "aurora-mysql"
  database_name          = "sample_rds"
  master_username        = "${var.username}"
  master_password        = "${var.password}"
  vpc_security_group_ids = ["${aws_security_group.aurora-sg.id}"]
  skip_final_snapshot    = true
}

resource "aws_rds_cluster_instance" "cluster_instances" {
  identifier         = "${var.cluster_name}-instance"
  cluster_identifier = "${aws_rds_cluster.cluster.id}"
  instance_class     = "${var.instance_class}"
  publicly_accessible = "${var.publicly_accessible}"
  db_subnet_group_name    = 
        "${aws_db_subnet_group.aurora_subnet_group.id}"
}

resource "aws_db_subnet_group" "aurora_subnet_group" {
  name       = "tf-rds-${var.cluster_name}"
  subnet_ids = ["${var.subnets}"]

  tags {
    Name = "tf-rds-${var.cluster_name}"
  }
}

Мой основной скрипт терраформирования. Я передал переменные в модуль RDS, такие как vpc_id, имя пользователя и пароль db, идентификаторы частной подсети и идентификатор группы безопасности

module "aurora_mysql" {
  source      = "../modules/rds-aurora"

  vpc_id              = "${module.my_vpc.vpc_id}"
  publicly_accessible = true
  instance_class      = "db.t2.medium"
  username            = "${var.db_username}"
  password            = "${var.db_password}"
  subnets             = 
 ["${module.my_vpc.subnet_id_1[1]}","${module.my_vpc.subnet_id_1[2]}"]
  security_group_ids = "${module.my_vpc.vpc_rds_sg_id}"
}

Когда я пытаюсь apply, vpc конфигурации успешно создан с подсетью и группой безопасности, но получаю сообщение об ошибке Error creating DB Instance: InvalidParameterCombination: DB instance and EC2 security group are in different VPC

Мой экземпляр RDS создается в VPC по умолчанию, хотя я передаю новые идентификаторы частной подсети vpc и пользовательский идентификатор группы безопасности.


person Aman Babbar    schedule 20.11.2018    source источник
comment
Почему при создании SG вы используете "${var.vpc_id}" в качестве vpc_id вместо "${aws_vpc.main.id}"?   -  person AlexK    schedule 20.11.2018
comment
@AlexK, вы правы, но мы можем использовать оба пути.   -  person Aman Babbar    schedule 21.11.2018
comment
Не уверен, почему у этого вопроса есть отрицательные голоса, я думаю, что это правильный вопрос.   -  person The-Big-K    schedule 06.12.2018


Ответы (4)


Может быть, немного староват, но у меня была такая же проблема. Может быть интересно другим, у кого есть такая проблема. Ключ - это db_subnet_group_name в aws_rds_cluster или aws_rds_cluster_instance.

Из документов:

db_subnet_group_name - (Необязательно) Имя группы подсети БД. Экземпляр БД будет создан в VPC, связанном с группой подсети БД. Если не указано, будет создано в VPC по умолчанию ...

Я видел, что вы использовали идентификатор вместо имени

db_subnet_group_name    = "${aws_db_subnet_group.aurora_subnet_group.id}"

С именем:

db_subnet_group_name    = "${aws_db_subnet_group.aurora_subnet_group.name}"

Может, в этом и была проблема.

person Cramble    schedule 28.08.2019

Группа подсети БД - это параметр для кластера (aws_rds_cluster), а не для экземпляра. В вашей конфигурации вы, кажется, передаете группу подсети в конфигурации вашего экземпляра, а не в конфигурации вашего кластера. Я считаю, что это заставляет RDS откатиться к использованию default группы подсетей, которая представляет собой группу подсетей из вашего default VPC.

Я не эксперт по Terrform, поэтому оставлю вам решать, что нужно изменить в вашей конфигурации, чтобы смоделировать это правильно. Надеюсь это поможет!

person The-Big-K    schedule 05.12.2018
comment
Да ты прав. есть возможность передать имя группы подсети БД в ресурсе aws_rds_cluster. я попробую это. Спасибо. - person Aman Babbar; 12.12.2018
comment
Дай мне знать, как дела. - person The-Big-K; 12.12.2018

Я столкнулся с подобной проблемой. Наконец, после долгой борьбы при создании экземпляра БД PostgreSQL я обнаружил, что нам нужно создать имя группы подсети вызова ресурса с как минимум двумя подсетями и вызвать его в экземпляре или ресурсе кластера.

Вот мой пример кода.

resource "aws_db_subnet_group" "postgresql_subnet_group" {
    name       = "postgresubgroup"
    subnet_ids = ["${aws_subnet.postgresql_subnet1.id}",  
        "${aws_subnet.postgresql_subnet2.id}"]

    tags = {
        Name = "PostgreSQL subnet group"
    }
}

db_subnet_group_name = aws_db_subnet_group.postgresql_subnet_group.name
person Suresh Babu    schedule 03.06.2020

Эта ошибка может быть вызвана тем, что vpc_id не указан в ресурсе aws_security_group или имеет неправильное значение.

В вашем случае vpc_id есть, но может иметь неправильное значение. Он установлен на var.vpc_id. Я не уверен, где устанавливается var.vpc_id, но, возможно, он не соответствует идентификатору вашего aws_vpc.main ресурса. Один из способов гарантировать совпадение двух значений - установить vpc_id = aws_vpc.main.id вместо vpc_id = "${var.vpc_id}".

person rlkw1024    schedule 31.01.2021