Amazon ec2 terraform能否使用变量哈希或映射在.tf文件中创建数据条目?

Amazon ec2 terraform能否使用变量哈希或映射在.tf文件中创建数据条目?,amazon-ec2,terraform,Amazon Ec2,Terraform,我一直在测试terraform(v.0.10),为企业提供AWS中的EC2实例、安全组、RDS实例等 我正在使用模块方法,以便为我的每个环境“获取”这些资源: apps: main.tf app.tf vars.tf sec_groups: main.tf sec_group.tf vars.tf : : 对于我的每个环境(非prod、prod),我都在寻找这些模块的来源,并将地形状态存储在远程s3存储桶中——每个环境一个存储桶 我向每个环境提供必要的变量,如子网CID

我一直在测试terraform(v.0.10),为企业提供AWS中的EC2实例、安全组、RDS实例等

我正在使用模块方法,以便为我的每个环境“获取”这些资源:

apps:
  main.tf
  app.tf
  vars.tf
sec_groups:
  main.tf
  sec_group.tf
  vars.tf
:
:
对于我的每个环境(非prod、prod),我都在寻找这些模块的来源,并将地形状态存储在远程s3存储桶中——每个环境一个存储桶

我向每个环境提供必要的变量,如子网CIDR、专有网络名称等,然后创建环境:专有网络有其相关的子网,其中包含相关的EC2实例。。。一切都好

我的挑战来自于添加安全组(我在各种类型的EC2实例和环境中都有许多安全组)及其各自的规则

虽然我可以在一个合适的sec_group.tf文件中创建规则库,并添加出/入规则(每个规则都带有from_端口、to_端口、协议、cidr_块…),但我想知道是否可以基于(json)数据散列生成信息

我的想法是,这种全局数据层次结构可用于保存规则,并可进行处理,以收集每个环境的相关规则,并仅应用与“terraform apply”所针对的当前环境相关的规则,可以有2条或200条规则。大概是这样的:

non-prod-env:
  ssh:
    from_port: 22
    to_port: 22
    protocol: "tcp"
    cidr_blocks:
      - 10.1.1.1
      - 10.2.2.2
    :
    :
  smtp:
    from_port: 25
    to_port: 25
    protocol: "tcp"
    cidr_blocks:
      - 100.1.1.1
      - 100.2.2.2
   :
   :
prod-env:
  ssh:
    from_port: 22
    to_port: 22
    protocol: "tcp"
    cidr_blocks:
      - 11.1.1.1
      - 11.2.2.2
    :
    :
在阅读了各种类型的VAR(字符串、列表、映射)之后,我不确定我所问的是否可能,但它将允许所有环境都可以从中获取集中(全局)数据源

我很想知道以前是否有人考虑过/研究过这种方法,或者是否有一种更简单的方法我可能遗漏了

如有任何想法或意见,将不胜感激


Cheers

Terraform尚不支持嵌套映射(),但您可以使用

这完全是一个选项,但我来确定逻辑操作超出了HCL的设计目的,更复杂的编排应该放在自定义提供程序中。HCL计划应明确其所做的工作,而不是从外部资源中获取。下面是我如何处理ACL和安全组规则的:

ACL:

其中变量
network\u ssh\u access
是该专有网络允许的cidr块列表

variable network_ssh_access {
  type    = "list"
  default = []
}

resource "aws_network_acl" "main" {
  vpc_id = "${aws_vpc.main.id}"
}

resource "aws_network_acl_rule" "network_ssh_access" {
  count          = "${length(var.network_ssh_access)}"
  network_acl_id = "${aws_network_acl.main.id}"
  rule_number    = "${200 + count.index}"
  egress         = false
  protocol       = "tcp"
  rule_action    = "allow"
  cidr_block     = "${element(var.network_ssh_access, count.index)}"
  from_port      = 22
  to_port        = 22
}
安全组: 其中变量
appname\u ssh\u access
是名为“appname”的应用程序允许的cidr块列表


你会为剩余的端口和协议(邮件、HTTP、HTTPS等)复制这个模型。

我想我应该在这个问题后面解释更多的理由——想考虑使用散列(某种方式,一些方法)的理由。类似于您在puppet中使用hiera的方式:拥有一个通用键值对的系统,可以在哈希值的较低位置覆盖该系统。合并将允许单一数据源,从而最大限度地减少变量重复的使用。
variable appname_ssh_access {
  type    = "list"
  default = []
}

resource "aws_security_group" "appname" {
  name        = "appname"
}

resource "aws_security_group_rule" "allow_all" {
  count           = "${length(var.appname_ssh_access)}"
  type            = "ingress"
  from_port       = 22
  to_port         = 22
  protocol        = "tcp"
  cidr_blocks     = "${element(var.network_ssh_access, count.index)}"
  security_group_id = "${aws_security_group.appname.id}"
}