老了老了,今年初寫的 Terraform 才過半年就忘了差不多了,開個系列文來記錄怎麼寫 Terraform 好了 …
** 這個系列文不適合已經會用 Terraform 的高手大大,主要是彙整官方文件運用函式 (Interpolation Syntax) 的一些作法,這邊只是將函數跟實際範例做結合,給還沒用過的人比較好理解的文章。
這篇要講的是當建立 aws_instance 時都會需要指定 subnet_id,一般狀況會這樣寫:
resource "aws_instance" "bastion" { count = "1" ami = "ami-1234567" instance_type = "t2.nano" subnet_id = "subnet-123456" }
如果要 launch 更多台 (不用 spot fleet, autoscaling) 就必須寫兩次不同 subnet_id,而且寫死 id 值並不是正確的用法,因為實際上你並不知道 subnet_id 是多少。
比較好的方式是利用 element 透過 mod 演算法來指定 subnet_id,拿 subnet 的 list 值跟 count.index 進行演算法取其中一個值
resource "aws_instance" "bastion" { count = "2" ami = "ami-1234567" instance_type = "t2.nano" subnet_id = "${element(data.aws_subnet_ids.private.ids, count.index)}" }
這樣就可以寫一次 resource 來建兩台 bastion,減少重複代碼
順帶一提,除了從 data 取以外,module output / variables 也是很常用的取值方式
subnet_id = “${element(module.vpc.private_subnets, count.index)}”
subnet_id = “${element(var.private_subnets, count.index)}”
嗯 … 初學者的教學。
Reference: