terraform条件资源

Phi*_*hil 8 terraform

我有以下内容,我想知道我做错了什么,因为我确信我不应该因为条件而加倍我的代码.

所以我想做:

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}"]
   .....
}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,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}"]
   .....
  }
Run Code Online (Sandbox Code Playgroud)

Ste*_*hen 6

当前使用count定义代码的方式意味着资源的响应是一个列表。这意味着您将需要以不同的方式访问值

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)}"]
   .....
}
Run Code Online (Sandbox Code Playgroud)

值得注意的是,如果尝试使用此方法访问空列表,则会收到错误消息。

这意味着您将需要为每个连接一个空值,以确保元素的响应不会抛出。

使用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}"
}
Run Code Online (Sandbox Code Playgroud)


Sha*_*han 1

你必须使用:

resource "aws_security_group" "http_instance_sg"
Run Code Online (Sandbox Code Playgroud)

代替:

resource "aws_aws_security_group" "http_instance_sg"
Run Code Online (Sandbox Code Playgroud)

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

希望它会有所帮助!