Terraform

AWS EC2 實例、捲和模板文件的 Terraform 循環錯誤

  • February 3, 2022

您能否幫助解釋和解決此錯誤?

對於具有使用該卷 ID 的 EBS 捲和模板文件的實例,我有以下 TF 程序:

resource "aws_instance" "edge1" {

 instance_type = "t3a.micro" 

 ami = data.aws_ami.ubuntu.id
 key_name = "ozonm"

 £ root block device 
 root_block_device {
   volume_size = 10
 }

 user_data = data.template_file.user_data_edge1.rendered

}
£ End of resource "aws_instance" "edge1" 

£
£ EBS for homes
£
resource "aws_ebs_volume" "homes" {
 availability_zone = aws_instance.edge1.availability_zone
 size = 1
}

resource "aws_volume_attachment" "homes-volume-attachment" {
 device_name = "/dev/xvdf"
 instance_id = aws_instance.edge1.id
 volume_id   = aws_ebs_volume.homes.id
}

data "template_file" "user_data_edge1" {  
 template = file("metadata-edge1.yml", { vol_id = aws_ebs_volume.homes.id })
}

所以這給了我一個循環錯誤:

Error: Cycle: data.template_file.user_data_edge1, aws_instance.edge1, aws_ebs_volume.homes

雖然我認為不應該。我知道什麼是循環依賴,當第一個對象指的是第二個對象,而第二個對象指的是第一個對象時。但我認為在這種情況下完全沒問題,順序如下:

  • 卷已創建
  • 使用卷 ID 呈現模板文件
  • 使用 user_data 的模板文件創建實例
  • 卷附加到實例

但是 TF 圖顯示實例依賴於卷:

TF圖

那麼,為什麼會發生這種情況,以及如何在實例的模板文件中使用卷 ID?

提前致謝!

好的,所以經過一些實驗,我發現解決方案是使用depends_on元參數。

resource "aws_instance" "edge1" {

depends_on [
   aws_ebs_volume.homes
]

在這種情況下,aws_ebs_volume.homes 中的 availability_zone 也不得引用回實例。

此外,不需要使用數據來製作模板,可以將模板直接放入 aws_instance 資源定義的主體中:

user_data = templatefile(...)

引用自:https://serverfault.com/questions/1091227