AWS EC2 实例、卷和模板文件出现 Terraform 循环错误

AWS EC2 实例、卷和模板文件出现 Terraform 循环错误

您能帮助解释并解决这个错误吗?

我有以下 TF 程序,用于具有 EBS 卷和使用该卷 ID 的模板文件的实例:

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?

提前致谢!

答案1

好的,经过一些实验,我发现解决方案是使用依赖于取决于元論。

resource "aws_instance" "edge1" {

 depends_on [
    aws_ebs_volume.homes
 ]

在这种情况下,aws_ebs_volume.homes 中的 availability_zone 也不能引用该实例。

此外,使用数据因为不需要制作模板,所以可以将模板直接放入 aws_instance 资源定义的主体中:

user_data = templatefile(...)

相关内容