count
创建count个对象,每个对象对应一个基础设施
有索引,通过count.index获取
参数的表达式不可以引用其他资源的输出属性
可以引用data返回的输出属性,只要该data不依赖其他任何resource进行查询
for each
不可与count同时声明
参数可以是map或者set,可以为集合中的每一个创建一个独立的基础设施对象
使用each来访问每个迭代器对象
由于Terraform没有用以声明set的字面量,所以我们有时需要使用toset函数把list(string)转换为set(string)
count和for each的选择
如果资源实例之间相差不多,使用count,如果资源实例相差比较多使用for each
传统count结合length方法会导致,移除一个实例,会导致后续实例无法使用
lifecycle
create_before_destroy (bool)
使用前提前了解每个资源
由于某种限制导致资源无法升级,默认情况下先删除旧资源,再使用新参数创建新的资源
使用这个参数会先创建新的资源,旧资源依然存在,新资源创建好销毁旧资源
prevent_destroy (bool)
是一个保险措施
防止删除一个实例资源
ignore_changes (list(string))
在一些比较罕见的情况下,基础设施对象会被流程之外的东西改变,设置该属性可以让资源某些属性不会发生改变
忽略map某些键,前提是需要键已经存在
replace_triggered_by
意思是包含资源引用列表
强制terraform引用资源或资源属性发生改变时替换该块的父资源
使用场景
如果表达式指向多实例,比如有包含count和for each的任何实例发生变更或替换,都将引发该属性资源替换
如果表达式指向单实例,该实例资源发生变化,则也发生变化
如果表达式指向单实例单属性,那么该资源属性发生变化时也会发生变化
注:引用托管资源
配置影响了terraform如何构建并遍历依赖图