使用Terraform修改EC2配置 为何会触发关联RDS实例销毁重建?
问题成因
- 依赖链传导的变更触发
当前资源的依赖链路为aws_instance.outpost→module.ec2_security_group→module.db_security_group→module.rds,任意上游资源的变更会逐层传导到下游:
- EC2实例的标签中使用了
${timestamp()}函数,该函数为Terraform运行时函数,每次执行terraform plan或terraform apply都会生成新的时间戳,导致EC2实例的Created标签每次执行操作都会变更。如果你未公开的module.ec2_security_group配置中引用了EC2实例的任意可变属性(例如实例ID、Name标签等),EC2属性变更会直接传导到EC2安全组,触发安全组规则或属性更新。 - 当你手动修改EC2实例的配置(例如
iam_instance_profile)时,如果修改的属性被EC2安全组配置引用,也会触发同样的传导效果。
- 安全组配置导致ID变更
你使用的terraform-aws-modules/security-group/aws v4版本模块默认对安全组开启了create_before_destroy生命周期规则:当安全组的规则或核心属性发生变更时,模块会先创建新的安全组,再销毁旧的安全组,直接导致安全组ID发生变化。
- 当
module.ec2_security_group.security_group_id变更时,module.db_security_group的入站、出站规则中引用的源安全组ID会同步变更,触发DB安全组重建,进而导致module.db_security_group.security_group_id发生变化。 - 额外注意:你在DB安全组中错误使用了
egress_with_source_security_group_id参数配置出站规则,出站规则的匹配条件应为目标安全组而非源安全组,该错误配置也会导致安全组规则异常,触发不必要的重建。
- 旧版本RDS模块的缺陷
你使用的terraform-aws-modules/rds/aws v3.4.0属于较早的模块版本,该版本存在已知逻辑缺陷:当RDS实例关联的vpc_security_group_ids参数发生变化时,模块会错误地将RDS实例标记为需要销毁重建,而不是调用AWS API执行原地更新安全组关联的操作(AWS原生支持RDS原地修改关联安全组,无需重建实例)。
内容的提问来源于stack exchange,提问作者d8aninja
相关产品推荐
相关产品推荐

