繁体   English   中英

Terraform:ingress_with_source_security_group_id 与 computed_ingress_with_source_security_group_id

[英]Terraform: ingress_with_source_security_group_id vs. computed_ingress_with_source_security_group_id

Terraform 模块terraform-aws-modules/security-group/aws支持两个输入变量。

1. ingress_with_source_security_group_id

描述:使用“source_security_group_id”创建的入口规则列表

示例:( 源代码

  ingress_with_source_security_group_id = [
    {
      rule                     = "mysql-tcp"
      source_security_group_id = data.aws_security_group.default.id
    },
    {
      from_port                = 10
      to_port                  = 10
      protocol                 = 6
      description              = "Service name"
      source_security_group_id = data.aws_security_group.default.id
    },
  ]


2.computed_ingress_with_source_security_group_id

描述:使用“source_security_group_id”创建的计算入口规则列表

示例( 源代码

  computed_ingress_with_source_security_group_id = [
    {
      rule                     = "postgresql-tcp"
      source_security_group_id = module.main_sg.security_group_id
    },
    {
      from_port                = 23
      to_port                  = 23
      protocol                 = 6
      description              = "Service name"
      source_security_group_id = module.main_sg.security_group_id
    },
  ]

问题

他们之间有什么区别?

什么是计算入口规则?

这在“无法计算 'count' 的值”的注释中进行了解释,并且与 TF 0.11 的限制有关。 从链接:

计算值是作为模块输出提供的值。 非计算值是所有其他值 - 静态值、作为变量引用的值和来自数据源的值。

当您需要在安全组规则参数中指定计算值时,您需要使用以 computed_ 开头的参数来指定它,并在以 number_of_computed_ 开头的参数中提供许多元素

我得到它。
@ryan,我确定你现在知道这一点,但对我来说我也很困惑。 所以希望这对其他人有帮助。

Computed,似乎意味着“我将需要在我的组中使用输出数据,并且在编写代码时不会拥有所有可用数据”。 本质上,这意味着您要参考模块输出的值。 模块输出在运行之前不可用。

所以在这个例子中,注意module.main_sg.security_group_id 这是需要计算的部分,因为它来自另一个模块输出。 例如,在 terraform 运行之前它不会具有该值,然后它可以从该模块中获取输出。

  computed_ingress_with_source_security_group_id = [
    {
      rule                     = "postgresql-tcp"
      source_security_group_id = module.main_sg.security_group_id
    },
    {
      from_port                = 23
      to_port                  = 23
      protocol                 = 6
      description              = "Service name"
      source_security_group_id = module.main_sg.security_group_id
    },
  ]

所以,如果你不在这里使用computed_ ,代码就会中断,因为它无法获取module.main_sg.security_group_id的值。

当您在代码运行之前拥有所有可用值时,如您的第一个示例所示,例如source_security_group_id = data.aws_security_group.default.id那么您不需要使用computed_ 这意味着它不必通过额外的功能来解析这些值,因为它们已经在某处静态指定。 在这种情况下,它在数据资源等中静态指定。

所以计算意味着,当 terraform 运行此代码时,它需要等到它获得输出数据,然后才能计算此安全组的值实际上是什么,因为这些值是动态的,并且依赖于 terraform 代码才能运行看到它们,因此它需要在运行时“计算”它们。

我还有一个例子。

在这里,这段代码需要来自另一个模块的值,你不能说,因为它在 main.tf 中获取了它。

    computed_ingress_with_cidr_blocks = [{
      from_port   = 53
      to_port     = 53
      protocol    = "udp"
      description = "Domain Name System (DNS) access"
      cidr_blocks = var.priv_cidr_block
    },{ 
    ...

cidr 块取自 vpc 模块。

那么出口规则如下

  egress_with_cidr_blocks = [{
      from_port   = 9389
      to_port     = 9389
      protocol    = "tcp"
      description = "OPEN egress, all ports, all protocols"
      cidr_blocks = "0.0.0.0/0"
  }]```

Notice, theres only static values in there, so no need to "compute" any values, it already is, what it is...   

HTH. 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM