能否在不改动已部署资源的情况下更新Terraform提供程序内部状态?
成功执行terraform import后,部分场景下运行terraform plan会显示资源将「就地更新」,仅提示添加若干可选参数(例如AWS SNS主题订阅的confirmation_timeout_in_minutes)。这些参数属于提供商内部维护的状态属性,并未实际部署到云端资源中——证据是使用AWS只读角色执行terraform apply即可消除状态差异,且不会改动实际资源。
希望在脚本化的导入流程中自动化完成这个无风险的状态同步操作,但需确保不会对已部署资源产生任何改动,询问是否存在可安全设置提供商内部状态属性的Terraform命令。
使用
terraform apply -refresh-only命令
这是官方推荐的安全方式,该命令仅负责同步Terraform本地状态与实际云端资源的状态,不会执行任何资源创建、修改或删除操作,完全适配你用只读角色就能完成状态同步的场景。脚本中可搭配-auto-approve参数实现自动化:terraform apply -refresh-only -auto-approve执行后,Terraform会将那些内部状态属性同步到本地状态文件中,后续
terraform plan就不会再出现无意义的「就地更新」提示。在配置文件中显式设置可选参数的默认值
如果明确那些提示添加的可选参数的默认值(比如AWS SNS订阅的confirmation_timeout_in_minutes默认值为1),可以直接在Terraform资源配置中显式声明这些参数,让导入后的状态与配置自动对齐,无需额外执行同步操作。示例:resource "aws_sns_topic_subscription" "example" { topic_arn = aws_sns_topic.example.arn protocol = "email" endpoint = "example@example.com" # 显式设置默认值,消除状态差异 confirmation_timeout_in_minutes = 1 }手动编辑状态文件(不推荐)
可以通过terraform state show <资源地址>查看当前状态,再用terraform state edit <资源地址>手动修改状态中的属性值,使其与配置对齐。但这种方式容易出错,且不适合脚本化自动化场景,仅建议临时应急使用。
内容的提问来源于stack exchange,提问作者Brent Bradburn

