Terraform中AWS WorkSpace用KMS别名加密卷每次apply触发重建如何解决
问题原因
AWS Workspaces API的设计特性是:创建资源时可接受KMS别名作为加密密钥参数,但查询资源详情时只会返回对应KMS密钥的完整ARN,不会保留传入的别名字符串。同时Terraform AWS Provider的aws_workspaces_workspace资源的volume_encryption_key字段未做别名与ARN的归一化比对逻辑,且该字段被标记为强制替换(ForceNew)属性,因此每次执行plan/apply时,Terraform都会比对到配置值(别名)与远端状态值(ARN)不一致,触发重建逻辑。
这不属于配置错误,属于Terraform AWS Provider对该字段的兼容性处理缺失问题。
解决方案
方案一:配置中直接使用KMS密钥ARN(优先推荐)
直接引用KMS密钥资源的ARN属性作为参数值,保证配置值与AWS返回的状态值完全一致,不存在漂移问题:
resource "aws_workspaces_workspace" "workspace" { directory_id = aws_workspaces_directory.ws-ad.id bundle_id = var.bundle_id user_name = var.username root_volume_encryption_enabled = true user_volume_encryption_enabled = true # 替换别名为KMS密钥的ARN引用 volume_encryption_key = aws_kms_key.kms-ws-volume.arn workspace_properties { compute_type_name = "POWER" user_volume_size_gib = 80 root_volume_size_gib = 50 running_mode = "AUTO_STOP" running_mode_auto_stop_timeout_in_minutes = 60 } }
原有aws_kms_alias资源可保留,不影响其他场景下通过别名访问该密钥。
方案二:添加生命周期规则忽略该字段变更
如果必须在配置中保留别名写法,可在资源块中添加ignore_changes规则,忽略该字段的漂移比对:
resource "aws_workspaces_workspace" "workspace" { directory_id = aws_workspaces_directory.ws-ad.id bundle_id = var.bundle_id user_name = var.username root_volume_encryption_enabled = true user_volume_encryption_enabled = true volume_encryption_key = "alias/workspace-volume" # 新增生命周期规则 lifecycle { ignore_changes = [volume_encryption_key] } workspace_properties { compute_type_name = "POWER" user_volume_size_gib = 80 root_volume_size_gib = 50 running_mode = "AUTO_STOP" running_mode_auto_stop_timeout_in_minutes = 60 } }
注意:使用该方案后,如果后续需要实际修改加密密钥,需要先临时移除ignore_changes规则再更新配置,否则Terraform不会识别到密钥变更。
内容的提问来源于stack exchange,提问作者mlr11
相关产品推荐
相关产品推荐

