我想将Terraform用于我现有的AWS基础设施。因此,我导入了一个带有EBS块设备的现有EC2实例。然后我写了Terraform代码。但Terraform希望取代所有EBS块设备。有没有办法不更换EBS块设备?
导入
我导入了我的AWS EC2实例,如导入:中所述
导入
可以使用id导入实例,例如
$ terraform import aws_instance.web i-12345678
代码
导入状态文件后,我编写了Terraform代码。
这是EBS块设备的部件:
ebs_block_device {
device_name = "/dev/sdf"
volume_type = "gp2"
volume_size = 20
tags = {
Name = "my-test-docker"
}
}
计划
编写代码后,我运行plan命令,请参阅command:plan。
这是EBS块设备的部件:
- ebs_block_device { # forces replacement
- delete_on_termination = false -> null
- device_name = "/dev/sdf" -> null
- encrypted = false -> null
- iops = 100 -> null
- snapshot_id = "snap-0e22b434e3106fd51" -> null
- tags = {
- "Name" = "my-test-docker"
} -> null
- throughput = 0 -> null
- volume_id = "vol-065138961fea23bf4" -> null
- volume_size = 20 -> null
- volume_type = "gp2" -> null
}
+ ebs_block_device { # forces replacement
+ delete_on_termination = true
+ device_name = "/dev/sdf"
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ snapshot_id = (known after apply)
+ tags = {
+ "Name" = "my-test-docker"
}
+ throughput = (known after apply)
+ volume_id = (known after apply)
+ volume_size = 20
+ volume_type = "gp2"
}
研究
我试图在代码中设置volume_id
,但Terraform不允许设置此属性。
实际上,EBS块设备在创建后不应该被替换,请参阅EBS_block_device:
- ebs_block_device-(可选(一个或多个配置块,带有要连接到实例的附加ebs块设备。块设备配置仅适用于创建资源。有关属性和漂移检测的详细信息,请参阅下面的块设备。当将其作为属性引用访问时,它是一组对象
背景
将ebs_block_device
而不是aws_ebs_volume
与aws_volume_attachment
一起使用的原因之一是等待volume时出现aws_volume_attachment错误。
另一个原因是
- Ebs卷未连接,并且在启动时可供用户数据脚本装载
- AWS使用CLOUDINIT连接/格式化设备
- fs_setup/disk_setup:在继续之前等待设备存在的选项
ebs_block_device
对于新的(未导入的(资源仍然运行良好。
我的cloudinit用户数据脚本的格式化和安装部分:
fs_setup:
- label: docker
filesystem: ext4
device: /dev/xvdf
overwrite: false
mounts:
- [ "/dev/xvdf", "/mnt/docker-data", "auto", "defaults,nofail", "0", "2" ]
问题
有没有任何方法可以给Terraform一个提示,让代码中的EBS块设备与状态文件中的EBS区块设备相匹配?
根据Terraform docs:,您应该使用aws_ebs_volume
和aws_volume_attachment
资源来导入非根EBS块,而不是使用ebs_block_device
目前,Terraform无法自动检测到对现有资源ebs_block_device配置的更改。要管理EBS块对实例的更改和附件,请改用aws_EBS_volume和aws_volume_attachment资源。如果您在aws_instance上使用ebs_block_device,Terraform将承担对该实例的全套非根ebs块设备的管理,将额外的块设备视为漂移。