【问题标题】:terraform conditional resourceterraform 条件资源
【发布时间】:2018-01-21 03:02:35
【问题描述】:

我有以下情况,我想知道我做错了什么,因为我确信我不应该仅仅因为一个条件而将我的代码加倍。

所以我想做:

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}"]
   .....
  }

【问题讨论】:

    标签: terraform


    【解决方案1】:

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

    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 an empty value 来确保元素的响应不会抛出。

    使用 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}"
    }
    

    【讨论】:

      【解决方案2】:

      你必须使用:

      resource "aws_security_group" "http_instance_sg"
      

      代替:

      resource "aws_aws_security_group" "http_instance_sg"
      

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

      希望对您有所帮助!

      【讨论】:

      • 对不起,这只是我在问题中输入的一个错字
      【解决方案3】:

      您是否尝试添加 depends_on 指令?像这样的东西(我不确定语法):

      资源“aws_elb”“fe_elb”{ 依赖关系 = [ 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}"] ...... }

      【讨论】:

        猜你喜欢
        • 2021-01-12
        • 1970-01-01
        • 2020-01-31
        • 2021-12-18
        • 2021-08-13
        • 2021-08-07
        • 1970-01-01
        • 2021-09-20
        • 2019-08-04
        相关资源
        最近更新 更多