Site icon Mr. 沙先生

Terraform 筆記系列 – 用 element 和 count.index 指定 subnet_id

老了老了,今年初寫的 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:

Exit mobile version