Amazon web services 如何避免RDS实例和安全组模块中出现循环错误

Amazon web services 如何避免RDS实例和安全组模块中出现循环错误,amazon-web-services,terraform,Amazon Web Services,Terraform,我正在编写一个terraform模块,该模块提供一个RDS DB实例及其关联的安全组,用于控制入站连接。我遇到的问题是,安全组资源需要DB端口作为参数,而DB实例资源需要安全组ID作为参数。因此,周期误差 resource "aws_security_group" "this" { name = "${local.name}-inbound" description = "Allow inbound traffic from customer instances and manageme

我正在编写一个terraform模块,该模块提供一个RDS DB实例及其关联的安全组,用于控制入站连接。我遇到的问题是,安全组资源需要DB端口作为参数,而DB实例资源需要安全组ID作为参数。因此,周期误差

resource "aws_security_group" "this" {
  name = "${local.name}-inbound"
  description = "Allow inbound traffic from customer instances and management"
  vpc_id = "${var.vpc_id}"
  ingress {
    from_port = "${aws_db_instance.this.port}"
    to_port   = "${aws_db_instance.this.port}"
    protocol  = 6
    security_groups = ["${var.ingress_sg_ids}"]
  }
}

resource "aws_db_instance" "this" {
  allocated_storage       = "${var.storage_size}"
  storage_type            = "${var.storage_type}"
  engine                  = "${var.db_engine}"
  engine_version          = "${var.db_engine_version}"
  instance_class          = "${var.instance_type}"
  identifier_prefix       = "${local.name}-"
  name                    = "${var.env}_${var.workspace}"
  username                = "${var.root_username}"
  password                = "${random_id.root_password.b64}"
  db_subnet_group_name    = "${aws_db_subnet_group.this.name}"
  parameter_group_name    = "${var.param_group_name}"
  backup_retention_period = "${var.backup_retention_period}"
  copy_tags_to_snapshot   = true
  kms_key_id              = "${aws_kms_key.this.arn}"
  storage_encrypted       = true
  skip_final_snapshot     = "${var.skip_final_snapshot}"
  vpc_security_group_ids  = ["${aws_security_group.this.id}"]
}
错误消息如下所示:

* Cycle: module.rds.aws_db_instance.this, module.rds.aws_security_group.this

对于创建aws_db_实例,您没有传递任何特定端口。因此,默认端口(3306)将用于创建此实例。因此,您可以直接使用默认端口(3306),而不是在安全组中引用rds实例


对于创建aws_db_实例,您没有传递任何特定端口。因此,默认端口(3306)将用于创建此实例。因此,您可以直接使用默认端口(3306),而不是在安全组中引用rds实例


您具有循环依赖关系,因为您的实例依赖于您的安全组,而安全组的内联规则依赖于您的实例。作为一种解决方法,您可以使用
aws\u security\u group\u规则
资源:

resource "aws_security_group_rule" "db_ingress_sgr" {
  type                     = "ingress"
  security_group_id        = "${aws_security_group.this.id}"
  from_port                = "${aws_db_instance.this.port}"
  to_port                  = "${aws_db_instance.this.port}"
  protocol                 = 6
  source_security_group_id = "${var.ingress_sg_ids}"
}
Terraform将创建(空)安全组,然后创建您的RDS实例,然后创建安全组规则

注意这样一次只能定义一个
源安全组id
,因此请检查
入口id
变量的类型

注意(摘自):

此时,您不能将具有内嵌规则的安全组与任何安全组规则资源一起使用。这样做将导致规则设置冲突,并将覆盖规则


您具有循环依赖关系,因为您的实例依赖于您的安全组,而安全组的内联规则依赖于您的实例。作为一种解决方法,您可以使用
aws\u security\u group\u规则
资源:

resource "aws_security_group_rule" "db_ingress_sgr" {
  type                     = "ingress"
  security_group_id        = "${aws_security_group.this.id}"
  from_port                = "${aws_db_instance.this.port}"
  to_port                  = "${aws_db_instance.this.port}"
  protocol                 = 6
  source_security_group_id = "${var.ingress_sg_ids}"
}
Terraform将创建(空)安全组,然后创建您的RDS实例,然后创建安全组规则

注意这样一次只能定义一个
源安全组id
,因此请检查
入口id
变量的类型

注意(摘自):

此时,您不能将具有内嵌规则的安全组与任何安全组规则资源一起使用。这样做将导致规则设置冲突,并将覆盖规则


如果是已知的DB实例类型,则可以使用默认端口号而不引用它们;如果是已知的DB实例类型,则可以使用默认端口号而不引用它们,因为DB_实例资源根据您选择的DB引擎类型提供端口号,我不想硬编码,因为db_实例资源根据您选择的db引擎类型提供端口号,所以我不想硬编码。