Terraform为已有安全组应用aws_security_group_rule失败求助
解决Terraform安全组规则无法更新的问题
不要硬编码安全组ID,用资源引用关联状态
你之前代码里直接写死security_group_id = "xxxx"会导致Terraform没法把规则和安全组的状态关联起来,自然更新不了。改成引用资源的ID:resource "aws_security_group_rule" "apix_to_apiy_rule" { type = "ingress" from_port = 8080 to_port = 8080 protocol = "tcp" security_group_id = aws_security_group.apiy.id source_security_group_id = aws_security_group.apix.id } resource "aws_security_group" "apix" { name = "apix-sg" description = "Security group for API X" # 只写基础规则,互引规则单独用aws_security_group_rule定义 } resource "aws_security_group" "apiy" { name = "apiy-sg" description = "Security group for API Y" # 只写基础规则,互引规则单独用aws_security_group_rule定义 }刷新或导入Terraform状态
如果本地状态和云端资源不同步,先执行:terraform refresh要是还是没效果,把已存在的安全组规则导入到Terraform状态里,命令格式是
安全组ID_规则类型_协议_起始端口_结束端口_源安全组ID:terraform import aws_security_group_rule.apix_to_apiy_rule sg-xxxx_ingress_tcp_8080_8080_sg-yyyy替换成你实际的安全组ID和参数就行。
用lifecycle块触发规则更新
在规则资源里加个lifecycle配置,让Terraform在安全组有变化时重新评估规则:resource "aws_security_group_rule" "apix_to_apiy_rule" { type = "ingress" from_port = 8080 to_port = 8080 protocol = "tcp" security_group_id = aws_security_group.apiy.id source_security_group_id = aws_security_group.apix.id lifecycle { replace_triggered_by = [aws_security_group.apix.id, aws_security_group.apiy.id] } }这样不用重建安全组,就能让规则更新生效。
清理云端冲突规则
要是云端有手动加的规则,或者其他Terraform管理的规则和当前规则冲突,也会导致更新失败。先删掉云端无关的规则,再跑terraform plan看看是不是有预期的更新。
内容的提问来源于stack exchange,提问作者jackeblagare
相关产品推荐
相关产品推荐

