如何使用EBS块设备导入现有EC2



我想将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_volumeaws_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_volumeaws_volume_attachment资源来导入非根EBS块,而不是使用ebs_block_device

目前,Terraform无法自动检测到对现有资源ebs_block_device配置的更改。要管理EBS块对实例的更改和附件,请改用aws_EBS_volume和aws_volume_attachment资源。如果您在aws_instance上使用ebs_block_device,Terraform将承担对该实例的全套非根ebs块设备的管理,将额外的块设备视为漂移。

最新更新