terraform:数据库实例和EC2安全组位于不同的VPC中。

12

我正在尝试创建一个带有公共和私有子网、Aurora MySQL集群和实例的VPC,该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}"
  }
}

我的主要terraform脚本。我已将变量传递给RDS模块,例如vpc_id、数据库用户名和密码、私有子网id和安全组id。

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

当我尝试应用配置时,虽然子网和安全组创建成功,但出现以下错误:Error creating DB Instance: InvalidParameterCombination: DB instance and EC2 security group are in different VPC

尽管我传递了新的VPC私有子网ID和自定义安全组ID,但我的RDS实例仍在默认的VPC中创建。


2
当您创建SG时,为什么要使用${var.vpc_id}作为vpc_id,而不是${aws_vpc.main.id} - AlexK
@AlexK 你是对的,但我们可以两种方式都使用。 - Aman Babbar
3
不确定为什么这个问题会有负评,我认为这是一个有效的问题。 - The-Big-K
6个回答

11

可能有点陈旧,但我曾经遇到过同样的问题。也许对其他遇到同样问题的人有些许帮助。

关键在于“aws_rds_cluster”或“aws_rds_cluster_instance”中的“db_subnet_group_name”。

从文档中可以看到:

db_subnet_group_name - (可选)DB子网组名称。将在与DB子网组相关联的VPC中创建DB实例。如果未指定,则将在默认VPC中创建...

我发现您使用了“id”而不是“name”

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

名称:

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

也许那就是问题所在。


5

我遇到了类似的问题。最终,在创建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

0

DB子网组是群集(aws_rds_cluster)的一个参数,而不是实例的参数。在您的配置中,您似乎正在将子网组传递给实例配置,而不是群集配置。我相信这会强制RDS回退到使用默认子网组,这是来自您的默认 VPC 的子网组。

我不是Terrform专家,所以我让您自己确定需要更改配置以正确建模此内容。希望能对您有所帮助!


是的,你说得对。在aws_rds_cluster资源中有传递DB子网组名称的选项。我会尝试一下。谢谢。 - Aman Babbar
让我知道进展如何。 - The-Big-K

0

这个错误可能是由于在 aws_security_group 资源中省略了 vpc_id 或将其设置为错误的值而引起的。

在您的情况下,vpc_id 是存在的,但它可能有错误的值。它被设置为一个 var.vpc_id。我不确定 var.vpc_id 在哪里被设置,但也许它与您的 aws_vpc.main 资源的 ID 不匹配。确保两个值匹配的一种方法是将 vpc_id = aws_vpc.main.id 设置为 vpc_id = "${var.vpc_id}" 而不是。


0

您需要为aws_rds_cluster和aws_rds_cluster_instance指定相同的aws_db_subnet_group_name。 您的配置缺少aws_rds_cluster的db_subnet_group_name规范。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接