您能帮助解释并解决这个错误吗?
我有以下 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 图显示实例取决于体积:
那么,为什么会发生这种情况,以及如何在实例的模板文件中使用卷 ID?
提前致谢!
答案1
好的,经过一些实验,我发现解决方案是使用依赖于取决于元論。
resource "aws_instance" "edge1" {
depends_on [
aws_ebs_volume.homes
]
在这种情况下,aws_ebs_volume.homes 中的 availability_zone 也不能引用该实例。
此外,使用数据因为不需要制作模板,所以可以将模板直接放入 aws_instance 资源定义的主体中:
user_data = templatefile(...)