我正在尝试将现有的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文件中,但这不起作用。这是可能吗?
答案 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 配置,这将不是问题。 (但这会增加阅读和管理难度,因此您可能需要考虑将配置存储在自定义映像中。)
或者,正如您已经建议的那样,如果您的设置支持这一点并且您有能力暂时关闭实例,请从实例设置中完全删除用户数据。