Terraform中是否可在资源块内部引用当前资源自身名称
解答
Terraform 不支持在资源块内部通过类似resource.name的语法引用当前正在定义的资源。
核心逻辑很简单:Terraform 对资源块的处理顺序是先完成块内所有配置的解析、计算,向云服务商发起创建请求拿到所有返回属性之后,才会把这个资源注册到可引用的地址列表里。你在资源块内部写配置的时候,资源本身还没完成定义,自然没法通过资源路径自引用。
如果需要在块内复用配置值,可以用下面两种方案:
- 直接复用硬编码值。如果只是用到你手动填写的参数(比如示例里的
alarm_name),直接填相同的字符串即可,不需要额外引用。 - 抽离公共局部值。如果同一个值需要在块内多个位置使用,避免重复写硬编码,可以先在
locals块定义公共变量,再在资源内引用,示例如下:
locals { ec2_cpu_alarm_name = "terraform-test-foobar5" } resource "aws_cloudwatch_metric_alarm" "foobar" { alarm_name = local.ec2_cpu_alarm_name comparison_operator = "GreaterThanOrEqualToThreshold" evaluation_periods = "2" metric_name = "CPUUtilization" namespace = "AWS/EC2" period = "120" statistic = "Average" threshold = "80" alarm_description = "告警 ${local.ec2_cpu_alarm_name} 用于监控EC2实例CPU使用率" insufficient_data_actions = [] }
额外说明:资源创建完成后云侧返回的只读属性(比如这个告警自动生成的ARN),本身就不可能在资源定义阶段引用——这类值是资源创建成功后才会由云服务商返回,定义阶段根本不存在,只能在其他依赖该资源的配置块里通过aws_cloudwatch_metric_alarm.foobar.arn的形式引用。
内容的提问来源于stack exchange,提问作者DeKekem
相关产品推荐
相关产品推荐

