如何从带有附件块的Terraform aws_network_interface移到aws_network_interface_attachment资源

时间:2019-07-26 13:33:12

标签: amazon-web-services terraform

我们使用Terraform创建和管理我们的AWS基础设施。 我们有一些带有第二个网络接口的退出ec2实例,这些实例是使用aws_network_interface资源中的附件块创建的。 我们想要转到使用aws_network_interface_attachment资源,并从aws_network_interface资源中删除附件块。 但是,当我们尝试执行此操作时,Terraform只想附加网络接口事件,尽管它已经附加了,这会导致作业失败。 我们无法手动删除该接口并让Terraform附加它,因为这会导致服务中断。 有人有建议吗?

旧代码

resource "aws_network_interface" "name" {
...
attachment {
    instance     = "SomeInstanceId"
    device_index = 1
  }
}

新代码

resource "aws_network_interface_attachment" "attachmentName" {
  provider = "aws.client"
  instance_id = "SomeInstanceId"
  network_interface_id = "SomeInterfaceId"
  device_index = 1
}

1 个答案:

答案 0 :(得分:0)

免责声明:这样弄乱您的状态文件是一个坏主意,但有时是唯一的方法。在开始之前,请确保备份了tf状态,如果要更加安全,请临时使用只读凭证运行terraform,以免混淆任何重要内容。这是一项高级更改,有可能永久破坏您的状态,因此,如果不确定,请不要继续。

附件是一种怪异的非资源terraform构造,因此实际上不可能以常规方式对其进行处理。

但是tfstate文件只是json,您可以对其进行调整以表示所需的任何状态。我会做以下事情:

  1. 创建一个仅带ec2实例和第二个eni作为嵌入式块的全新terraform实例,保存状态文件
  2. 创建另一个新的Terraform实例,这次使用ec2实例和所需的二级eni设置
  3. 比较状态文件并找出差异
  4. 三次检查您的生产tfstate文件是否已备份
  5. 手动更改tfstate文件(如果使用远程状态,则为s3中的文件),使其看起来像在步骤2中一样。
  6. 运行地形计划以确保没有问题