terraform数据库实例和ec2安全组位于不同的vpc中

时间:2018-11-20 05:33:43

标签: amazon-web-services terraform amazon-rds-aurora terraform-provider-aws

我正在尝试使用公共和私有子网以及Aurora mysql群集和实例在同一vpc中使用RDS的自定义安全组创建一个vpc。

我已经在模块中创建了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}"
}

当我尝试apply时,通过子网和安全组成功创建了配置vpc,但出现错误 Error creating DB Instance: InvalidParameterCombination: DB instance and EC2 security group are in different VPC

即使我传递新的vpc专用子网ID和自定义安全组ID,我的RDS实例仍在默认VPC中创建。

4 个答案:

答案 0 :(得分:1)

也许有点老,但是我有同样的问题。对于其他有此问题的人来说可能很有趣。 密钥是“ aws_rds_cluster”或“ aws_rds_cluster_instance”中的“ db_subnet_group_name”。

从文档中:db_subnet_group_name-(可选)数据库子网组的名称。数据库实例将在与数据库子网组关联的VPC中创建。如果未指定,将在默认VPC中创建...

我看到您使用id代替了名称

db_subnet_group_name =“ $ {aws_db_subnet_group.aurora_subnet_group.id}”

名称:

db_subnet_group_name =“ $ {aws_db_subnet_group.aurora_subnet_group.name}”

也许是问题所在。

答案 1 :(得分:0)

DB子网组是群集(aws_rds_cluster)的参数,而不是实例的参数。在您的配置中,您似乎在实例配置中而不是在群集配置中传递了子网组。我相信,这会迫使RDS退回以使用default VPC中的一组子网default子网。

我不是Terrform专家,所以我将由您自己决定要在配置中进行哪些更改才能正确建模。希望这可以帮助!

答案 2 :(得分:0)

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

答案 3 :(得分:0)

此错误可能是由 vpc_idaws_security_group 资源中省略或设置为错误值引起的。

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