来自文件的cidr_blocks的Terraform aws_security_group资源中的无效CIDR地址

时间:2019-06-03 15:34:21

标签: amazon-web-services terraform terraform-provider-aws aws-security-group cidr

我正在尝试从包含以下格式的CIDR列表的文件中创建安全组入口规则:

"127.0.0.1/32",
"127.0.0.1/32",
"127.0.0.1/32"

从文件中检索CIDR如下:

cidrs = "${split(",", file("${path.module}/cidrs"))}"

并作为(列表)变量传递到aws_security_group资源:

resource "aws_security_group" "test" {
    ...
    ingress {
        ...
        cidr_blocks = "${var.cidrs}"
    }
}

运行terraform plan会导致以下错误:

[ERROR] root.test: eval: *terraform.EvalValidateResource, err: 
Warnings: []. Errors: [
"ingress.2.cidr_blocks.0" must contain a valid CIDR, got error parsing: 
invalid CIDR address: "127.0.0.1/32"
"ingress.2.cidr_blocks.1" must contain a valid CIDR, got error parsing: 
invalid CIDR address: "127.0.0.1/32"
"ingress.2.cidr_blocks.2" must contain a valid CIDR, got error parsing: 
invalid CIDR address: "127.0.0.1/32"
]

因此,似乎目录或文件被转换为一个列表或3个看起来正确的cidr块,但是terraform无法解析其中的任何一个。

但是,如果我分配cidr_blocks = ["127.0.0.1/32", "127.0.0.1/32", "127.0.0.1/32"],一切似乎都正常。

将列表分配给变量cidrs = ["127.0.0.1/32", "127.0.0.1/32", "127.0.0.1/32"]也可以正常工作。该问题似乎是由${split(",", file())

引起的
[INFO] Terraform version: 0.11.0  ec9d4f1d0f90e8ec5148f94b6d634eb542a4f0ce+CHANGES

2 个答案:

答案 0 :(得分:0)

我编辑了最后一个答案:

如果需要用逗号分隔的文件,则无需拆分值,只需将其用[]制成列表即可。

cidr_blocks = ["${var.cidrs}"]

或更简单

cidr_blocks = ["${file("cidrs.scv")"}]

答案 1 :(得分:0)

我试图允许来自ALB的流量,我需要将另一个安全组传递给“允许来自ALB的流量”。 因此,我的错误与您的问题最相似,因此添加为答案可能会对其他人有所帮助,因为我找不到很好的答案。

如果您想在白名单部分中添加另一个安全组,那么它可以提供帮助。

    ingress {
    from_port   = 0
    to_port     = 65535
    protocol    = "tcp"
    security_groups = ["${aws_security_group.alb_secuirty_group.id}"]
    description = "HTTP"
  }