导入AWS密钥对后执行terraform apply触发替换的原因与含义
apply提示需替换资源 配置与操作步骤
Terraform配置代码:
resource "aws_key_pair" "default_key_pair" { key_name = "default_key_pair" public_key = file("../../public_keys/default_key.pub") }
执行的命令:
terraform import aws_key_pair.default_key_pair default_key_pair
随后执行:
terraform apply
Terraform提示信息
# aws_key_pair.default_key_pair must be replaced -/+ resource "aws_key_pair" "default_key_pair" { ~ arn = "arn:aws:ec2:place:id:key-pair/default_key_pair" -> (known after apply) ~ fingerprint = "safasldjfjfljasfjasodjflasjfsdljfasdjf" -> (known after apply) ~ id = "default_key_pair" -> (known after apply) + key_name_prefix = (known after apply) ~ key_pair_id = "key-somethin-something" -> (known after apply) ~ key_type = "ed25519" -> (known after apply) + public_key = "ssh-ed25519 SNIP SNIP" # forces replacement - tags = {} -> null # (2 unchanged attributes hidden) }
用户疑问
该提示意味着什么?执行apply后旧密钥对仍可正常使用,但Terraform状态数据中的key_pair_id(类似key-0f7664ff3fbd3ed0b的ID)已变更。此前曾执行terraform state rm "aws_key_pair.default_key_pair" && terraform destroy关停服务器,原本以为导入后无需修改即可使用,想了解具体原因。
原因解析
导入操作未捕获
public_key属性
Terraform的import命令仅会同步AWS侧资源的核心标识信息(如密钥对名称、ARN、key_pair_id等),不会自动读取本地配置中的public_key值并写入状态文件。导入完成后,状态文件中并无public_key属性的记录。public_key是强制替换属性
对于AWS密钥对资源,public_key属于强制替换属性——该属性无法在现有资源上直接更新,一旦配置中存在但状态中缺失,Terraform会判定需要销毁旧资源并创建新资源来匹配配置,这就是提示中must be replaced的原因。旧密钥对仍可用的逻辑
此前执行terraform state rm后,该密钥对已脱离Terraform的状态管理范围,后续的terraform destroy并不会实际删除AWS上的旧密钥对。导入后执行apply时,Terraform会创建新的密钥对匹配配置,但旧密钥对因不在Terraform管理范围内,仍会保留在AWS上,因此可正常使用。key_pair_id变更的本质
新创建的密钥对会生成全新的key_pair_id,Terraform状态文件会同步更新为新资源的标识,而旧密钥对的key_pair_id仍存在于AWS,但已不受Terraform管控。
内容的提问来源于stack exchange,提问作者Timo

