Terraform-provider-aws: AWS安全组规则协议/端口错误。

创建于 2017-07-10  ·  3评论  ·  资料来源: hashicorp/terraform-provider-aws

你好,

地形版本

Terraform v0.9.11

受影响的资源

  • aws_security_group_rule

Terraform配置文件

variable "ports_logstash" {
  description = "Ports used by logstash and graphite"
  default     = ["40000", "40001", "40002", "40003", "40004", "40005", "40006", "40007", "40008", "40009", "40010", "2003", "2005", "8125", "80", "443"]
}

resource "aws_security_group_rule" "Logstash" {
  count       = "${length(var.ports_logstash)}"
  depends_on  = ["aws_security_group.SG-Logstash"]
  type        = "ingress"
  from_port   = "${var.ports_logstash[count.index]}"
  to_port     = "${var.ports_logstash[count.index]}"
  protocol    = -1
  cidr_blocks = ["10.0.1.0/8"]

  security_group_id = "${aws_security_group.SG-Logstash.id}"
}

resource "aws_security_group" "SG-Logstash" {
  name        = "SG-Logstash"
  description = "Access to all ports required for Logstash communication"
  vpc_id      = "${aws_vpc.default.id}"

  tags {
    Name = "SG-Logstash"
  }
}

预期行为

Terraform应该抛出一个错误,即不支持将协议定义为-1并将设置from_port和to_port设置为错误,或者为tcp和udp创建规则。

实际行为

引发错误,已添加了所请求的规则,因为它为指定的CIDR添加了“允许所有”规则。

重现步骤

  1. 为具有相同CIDR和不同端口的特定端口定义新的SG规则资源。
  2. 运行terraform应用。
  3. 得到以下错误:
    ```* aws_security_group_rule.Logstash [3]:发生1个错误:
  • aws_security_group_rule.Logstash.3:[警告]在(sg-xxxxxxxx)上发现重复的安全组规则。 这可能是
    现在修复的Terraform问题的副作用,导致两个安全组与
    相同的属性,但使用不同的source_security_group_ids覆盖每个属性
    其他状态。 有关更多信息,请参见https://github.com/hashicorp/terraform/pull/2376
    有关恢复的信息和说明。 错误消息:指定的规则“ peer:10.0.1.0/8,ALL,ALLOW”已经存在
bug servicec2 stale

最有用的评论

事实证明,这是AWS API的默认行为,如果为aws_security_group_rule提供protocol = -1,您将获得ALL ALLOW规则。 这应该在terraform文档中提及。

正确的解决方法是为tcp和udp fe创建两个aws_security_group_rule

resource "aws_security_group_rule" "tcpLogstash" {
  count       = "${length(var.ports_logstash)}"
  depends_on  = ["aws_security_group.SG-Logstash"]
  type        = "ingress"
  from_port   = "${var.ports_logstash[count.index]}"
  to_port     = "${var.ports_logstash[count.index]}"
  protocol    = "tcp"
  cidr_blocks = ["10.0.1.0/8"]

  security_group_id = "${aws_security_group.SG-Logstash.id}"
}

resource "aws_security_group_rule" "udpLogstash" {
  count       = "${length(var.ports_logstash)}"
  depends_on  = ["aws_security_group.SG-Logstash"]
  type        = "ingress"
  from_port   = "${var.ports_logstash[count.index]}"
  to_port     = "${var.ports_logstash[count.index]}"
  protocol    = "udp"
  cidr_blocks = ["10.0.1.0/8"]

  security_group_id = "${aws_security_group.SG-Logstash.id}"
}

所有3条评论

事实证明,这是AWS API的默认行为,如果为aws_security_group_rule提供protocol = -1,您将获得ALL ALLOW规则。 这应该在terraform文档中提及。

正确的解决方法是为tcp和udp fe创建两个aws_security_group_rule

resource "aws_security_group_rule" "tcpLogstash" {
  count       = "${length(var.ports_logstash)}"
  depends_on  = ["aws_security_group.SG-Logstash"]
  type        = "ingress"
  from_port   = "${var.ports_logstash[count.index]}"
  to_port     = "${var.ports_logstash[count.index]}"
  protocol    = "tcp"
  cidr_blocks = ["10.0.1.0/8"]

  security_group_id = "${aws_security_group.SG-Logstash.id}"
}

resource "aws_security_group_rule" "udpLogstash" {
  count       = "${length(var.ports_logstash)}"
  depends_on  = ["aws_security_group.SG-Logstash"]
  type        = "ingress"
  from_port   = "${var.ports_logstash[count.index]}"
  to_port     = "${var.ports_logstash[count.index]}"
  protocol    = "udp"
  cidr_blocks = ["10.0.1.0/8"]

  security_group_id = "${aws_security_group.SG-Logstash.id}"
}

由于不活动,将此问题标记为过时。 这有助于我们的维护者发现并关注当前的问题。 如果此问题在接下来的30天内没有收到任何评论,它将自动关闭。 维护者也可以删除陈旧的标签。

如果此问题已自动关闭,并且您认为应重新打开此问题,我们建议创建一个新的问题,链接回此问题以获取更多信息。 谢谢!

我将锁定此问题,因为它已关闭_30天_⏳。 这有助于我们的维护者发现并关注当前的问题。

如果您认为应该重新打开此问题,我们建议创建一个新的问题,将该问题链接回到此问题,以提供更多背景信息。 谢谢!

此页面是否有帮助?
0 / 5 - 0 等级