如何通过对资源进行手动更改来更新地形状态



我已经通过AWS提供了一些资源,其中也包括EC2实例,但在那之后,我们将一些额外的安全组附加到这些实例上,这些实例现在已被terraform检测到,它说它将根据配置文件回滚它。

假设我有下面的代码,它将SG连接到我的EC2

vpc_security_group_ids=["sg-xxxx"]

但现在我的问题是如何更新terraform.tfstate文件,使其不应该分离手动连接的安全组:

我可以如下解决:

  1. 我会用terraform刷新来刷新terraform状态文件,这将更新状态文件
  2. 然后我必须用手动附加的安全组id手动更新我的地形配置文件

但这对于一种小型设置来说是可能的,如果我们有一个复杂的场景,那么我们在地形中是否有任何其他机制可以检测漂移并更新它

THanks!!

在AWS上检测到漂移时,Terraform不可能更新您的源代码。

你提到的过程是正确的:

  1. 将AWS中所做的手动更改报告到Terraform代码中
  2. 做一个terraform plan。它将刷新状态并显示是否仍有差异

您可以使用id为的terraform import将远程更改导入地形状态文件。稍后使用terraform plan检查更改是否反映在代码中。

这可以通过手动更新地形状态文件来实现,但手动更新该文件不是最佳做法。

此外,如果您手动或在Terraform代码之外更新AWS资源(由Terraform创建),那么它就无法实现Infrastructure as Code的全部目的。

如果您希望使用Terraform在AWS上管理复杂的基础设施,那么遵循最佳实践是非常好的,其中之一是所有更改都应该通过代码完成。

希望这能有所帮助。

terraform import <resource>.<resource_name> [unique_id_from_aws]

您可能需要临时注释掉任何依赖于手动创建的资源的输出的提供程序/资源。

运行完以上操作后,取消对依赖项的注释并运行terraform refresh

接受的答案在技术上是不正确的。

根据我的测试:
Terraform刷新将使用当前实时配置更新状态文件
Terraform计划只会使用实时配置进行内部更新并与代码进行比较,但不会实际更新状态文件
Terraform apply将状态文件更新为当前实时配置,即使它说没有要应用的更改(用例=手动更改,然后更新TF代码以反映更改,现在想要更新状态文件)

最新更新