Terraform EC2实例导入 - 用户数据不同

时间:2018-01-10 14:20:08

标签: amazon-web-services terraform

我正在尝试将现有的EC2实例导入Terraform。我已经获取了EC2实例用户数据,并将其添加到我的TF配置文件中,例如

    user_data               = <<EOF
<powershell>
& $env:SystemRoot\System32\control.exe "intl.cpl,,/f:`"UKRegion.xml`""
& tzutil /s "GMT Standard Time" 
Set-Culture en-GB
</powershell>
EOF

资源导入正常,但是当我运行terraform plan时,我想让TF想要销毁并重新创建实例,作为一个改变&#39;在user_data&#39;强制新资源&#39;。

user_data: "946f756af0df239b19f86a72653e58dcc04c4b27" => "811599030dc713b18c3e35437a82b35095190a81" (forces new resource)

我尝试将用户数据从EC2控制台复制并粘贴到TF文件中,但这不起作用。这是可能吗?

2 个答案:

答案 0 :(得分:1)

根据这个github issue,看起来这是terraform如何将user_data解释为“计算”值的问题。似乎有一个解决方法。

  
      
  • 首先使用您的计划命令运行计划/应用周期,包括命令行中的额外参数:
      -target = template_file.userdata领事。这将告诉Terraform完成更新模板文件所需的最小工作,该文件应该是   保持您的启动配置不受影响。
  •   
  • 现在再次运行计划,由于现在已经重新创建了template_file,它应该将已解析的模板插入为   期望进入user_data,然后应该没有差异   因为“新”模板渲染应该与之相同   “老”一个。
  •   

答案 1 :(得分:1)

您不能从状态复制 user_data 值,因为它是一个编码字符串,如果您将其复制到资源配置中,它将在与当前状态进行比较之前再次进行编码,它不会匹配。

但您可以从 EC2 控制台中的实例设置复制当前用户数据值,并将其粘贴到 .tf 文件中资源的 user_data 属性中。

如果有多行数据,您需要将文件中的每个换行符替换为 \n,因为您不能使用多行字符串。

例如:

resource "aws_instance" "instance1" {
  ami = "ami-0123456789abcdef0"
  instance_type = "t4.medium"
  user_data = "setting1=value\nsetting2=value\nsetting3=value"
}

注意:EC2 中的用户数据有 16KB 大小限制,但如果您从 EC2 复制到您的 Terraform 配置,这将不是问题。 (但这会增加阅读和管理难度,因此您可能需要考虑将配置存储在自定义映像中。)

或者,正如您已经建议的那样,如果您的设置支持这一点并且您有能力暂时关闭实例,请从实例设置中完全删除用户数据。