Terraform部署RDS关联EKS安全组报InvalidParameterValue错误求助
问题诊断与修复方案
核心问题
你遇到的错误是因为将安全组规则(sgrule-xxx格式)的ID传给了RDS实例的vpc_security_group_ids参数,但该参数要求传入的是安全组(sg-xxx格式)的ID,而非安全组规则ID。
从Terraform计划输出能看到,vpc_security_group_ids被设置为一组sgrule-开头的ID,这不符合AWS RDS的参数要求,导致创建失败。
修复步骤
1. 修正EKS模块的输出值
修改modules/eks/output.tf,输出EKS安全组的ID,而非安全组规则ID:
# modules/eks/output.tf output "eks-sg" { value = aws_security_group.main.id }
2. 优化RDS安全组配置(可选但推荐)
为了严格实现“仅对EKS集群开放”的需求,建议给RDS单独创建安全组,精准控制访问流量:
步骤2.1 在RDS模块中添加安全组资源
修改modules/rds/security.tf,新增RDS专属安全组:
# modules/rds/security.tf # 创建RDS子网组(原有代码保留) resource "aws_db_subnet_group" "rdssubnet" { name = "database-subnet" subnet_ids = var.private_subnet_ids } # 新增RDS安全组 resource "aws_security_group" "rds_sg" { name = "rds-sg-${var.env}" vpc_id = var.vpc_id # 仅允许来自EKS安全组的MySQL端口(3306)访问 ingress { from_port = 3306 to_port = 3306 protocol = "tcp" security_groups = [var.eks-sg] } # 允许必要的出站流量(按需调整) egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } tags = { Name = "RDS-Security-Group-${var.env}" } }
步骤2.2 关联RDS实例到新安全组
修改modules/rds/rds.tf,将vpc_security_group_ids指向新创建的RDS安全组:
# modules/rds/rds.tf resource "aws_db_instance" "rds_instance" { allocated_storage = 50 identifier = "rds-vaya" storage_type = "gp2" engine = "mysql" engine_version = "8.0.23" instance_class = "db.t2.micro" db_name = "vaya" username = "admin" password = aws_secretsmanager_secret_version.password.secret_string publicly_accessible = false multi_az = true db_subnet_group_name = aws_db_subnet_group.rdssubnet.id # 修改为RDS专属安全组 vpc_security_group_ids = [aws_security_group.rds_sg.id] tags = { Name = "OpsyRDSServerInstance" } }
3. 重新执行Terraform命令
terraform init terraform plan terraform apply
说明
- AWS资源的安全组关联逻辑:
vpc_security_group_ids仅接受安全组ID,安全组规则是安全组的内部配置,不能直接作为资源关联的参数。 - 单独配置RDS安全组能更清晰地管理访问权限,避免与EKS安全组的规则互相影响,符合最小权限原则。
内容的提问来源于stack exchange,提问作者Vamsi
相关产品推荐
相关产品推荐

