用于循环的 Terraform

Posted

技术标签:

【中文标题】用于循环的 Terraform【英文标题】:Terraform for loop 【发布时间】:2020-12-24 15:09:18 【问题描述】:

我一直在学习 terraform,并且一直在玩仪表板。

我有以下生成仪表板的文件。

resource "aws_cloudwatch_dashboard" "main" 
  dashboard_name = "sample_dashboard"
  dashboard_body = <<EOF

  "widgets": [
    $templatefile("$path.module/cpu.tmpl",  ids = aws_instance.web[*].id ),
    $templatefile("$path.module/network.tmpl",  ids = aws_instance.web[*].id )
  ]

EOF

这是cpu模板文件。


  "type": "metric",
  "x": 0,
  "y": 0,
  "width": 12,
  "height": 6,
  "properties": 
    "metrics": $jsonencode([for id in ids : ["AWS/EC2","CPUUtilization","InstanceId", "$id"]]),
    "period": 300,
    "stat": "Average",
    "region": "us-east-1",
    "title": "EC2 Instance CPU"
  

这里有网络模板文件。


  "type": "metric",
  "x": 12,
  "y": 0,
  "width": 12,
  "height": 6,
  "properties": 
    "metrics": $jsonencode([for id in ids :
                  ["AWS/EC2", "NetworkIn", "InstanceId", "$id"]
                ]),
    "period": 300,
    "stat": "Average",
    "region": "us-east-1",
    "title": "EC2 Instance Network"
  

一切都按预期工作,我得到以下仪表板。

我遇到的问题是尝试在 for 循环中添加另一个指标时出现错误。


  "type": "metric",
  "x": 12,
  "y": 0,
  "width": 12,
  "height": 6,
  "properties": 
    "metrics": $jsonencode([for id in ids :
                  ["AWS/EC2", "NetworkIn", "InstanceId", "$id"],
                  ["AWS/EC2", "NetworkOut", "InstanceId", "$id"]
                ]),
    "period": 300,
    "stat": "Average",
    "region": "us-east-1",
    "title": "EC2 Instance Network"
  

我收到以下错误。

调用函数“模板文件”失败:./network.tmpl:9,70-71: 'for' 表达式无效; 'for' 结尾后的额外字符 表达式..

一如既往地提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

解决该问题的一种方法是concat 您的指标:


  "type": "metric",
  "x": 12,
  "y": 0,
  "width": 12,
  "height": 6,
  "properties": 
    "metrics": $jsonencode(concat([for id in ids :
                   ["AWS/EC2", "NetworkIn", "InstanceId", "$id"]
                ], [for id in ids :                  
                   ["AWS/EC2", "NetworkOut", "InstanceId", "$id"]
                ])),
    "period": 300,
    "stat": "Average",
    "region": "us-east-1",
    "title": "EC2 Instance Network"
  

【讨论】:

以上是关于用于循环的 Terraform的主要内容,如果未能解决你的问题,请参考以下文章

为啥外部for循环变量不能用于内部for循环

用于 for 循环内动画的 Objective-C 完成块(暂停循环处理)

Python - 用于停止无限循环的键盘命令? [重复]

继续;用于跳过许多循环

用于循环的 Terraform

用于循环使用fmincon函数用于不同的初始点