Terraform 条件资源

10

我有以下代码,想知道我的问题在哪里,因为我确定不应该因为某个条件而重复我的代码。

所以我想做的是:

variable "https" { value = true }

resource "aws_security_group" "http_instance_sg" {
  count       = "${var.https ? 0 : 1}"

  ......

}
resource "aws_security_group" "https_instance_sg" {
  count       = "${var.https ? 1 : 0}"

  ......

}

resource "aws_elb" "fe_elb" {
  security_groups = ["${var.https ? aws_aws_security_group.https_instance_sg.id : aws_aws_security_group.http_instance_sg.id}"]
   .....
}

但是当我这样做时,terraform抱怨找不到http_instance_sg,我知道这还没有构建,但是我肯定不必在所有代码上都进行重复并且要:

 resource "aws_elb" "http_fe_elb" {
    count = "${var.https ? 0 : 1}"
    security_groups = ["${aws_aws_security_group.http_instance_sg.id}"]
   .....
  }

 resource "aws_elb" "https_fe_elb" {
    count = "${var.https ? 1 : 0}"
    security_groups = ["${aws_aws_security_group.https_instance_sg.id}"]
   .....
  }
3个回答

8

你目前使用计数来定义代码的方式意味着资源的响应是一个列表。这意味着你需要以不同的方式访问值。

resource "aws_elb" "fe_elb" {
  security_groups = ["${var.https ? element(aws_security_group.https_instance_sg.*.id,0) : element(aws_security_group.http_instance_sg.*.id,0)}"]
   .....
}

值得注意的是,如果您尝试使用此方法访问一个空列表,将会出现错误。
这意味着您需要将一个空值连接到每个元素上,以确保元素的响应不会抛出异常。 使用concat的示例 "${var.https ? element(concat(aws_security_group.https_instance_sg.*.id, list("")), 0) : element(concat(aws_security_group.http_instance_sg.*.id, list("")), 0) 不同的方法 在未看到代码的情况下,我可能会问一下是否有更简单的方法来使用security_group_rule实现您要尝试的操作。
variable "https" { value = true }

resource "aws_security_group" "instance_sg" {
  # notice we no longer have a count here
}

resource "aws_elb" "fe_elb" {
  security_groups = ["${aws_security_group.instance_sg.id}"]
   .....
}

resource "aws_security_group_rule" "http" {
  count       = "${var.https ? 0 : 1}"
  .... http definitions
  security_group_id = "${aws_security_group.instance_sg.id}"
}

resource "aws_security_group_rule" "https" {
  count       = "${var.https ? 0 : 1}"
  .... https definitions
  security_group_id = "${aws_security_group.instance_sg.id}"
}

1
你必须使用:

resource "aws_security_group" "http_instance_sg"

替换为:

代替:

resource "aws_aws_security_group" "http_instance_sg"

在Terraform中没有名为"aws_aws_security_group"的资源,错误很可能是由于此资源名称拼写错误造成的。

希望这能帮到您!


抱歉,那只是我在问题中输入的一个打字错误。 - Phil

0
你尝试添加 `depends_on` 指令吗?类似这样(语法不确定):
``` resource "aws_elb" "fe_elb" { depends_on = [ aws_aws_security_group.https_instance_sg, aws_aws_security_group.http_instance_sg ] security_groups = ["${var.https ? aws_aws_security_group.https_instance_sg.id : aws_aws_security_group.http_instance_sg.id}"] ..... } ```

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