Terraform为Redshift配置安全组报无法使用集群安全组错误
错误原因
报错核心原因是安全组资源类型用错了:
aws_redshift_security_group是早年EC2-Classic非VPC网络环境下的遗留Redshift专属安全组资源,当前所有开通了默认VPC的AWS账号都不再支持EC2-Classic架构,VPC内部署的Redshift集群只能绑定标准VPC安全组,无法使用旧版集群安全组,因此触发报错。- 你贴的代码里还有两处语法问题:一是
skip_final_snapshot = true terraform destroy行多写了无效的terraform destroy内容,该参数仅接受布尔值,多余内容必须删除;二是publicly_accessible参数传了字符串"true",该参数应为布尔类型,不需要加引号。
修正方案
- 删除原有
aws_redshift_security_group资源,改用VPC标准安全组资源aws_security_group,配置你需要的入站规则 - 移除Redshift集群配置中的
cluster_security_groups参数,替换为vpc_security_group_ids参数,关联新建的VPC安全组ID即可。
修正后的完整配置参考如下:
# 捞取账号下的默认VPC,如果你使用自定义VPC可以直接替换为对应VPC ID data "aws_vpc" "default" { default = true } resource "aws_security_group" "redshift_sg" { name = "redshift-sg" description = "Redshift test security group" vpc_id = data.aws_vpc.default.id # 配置全流量入站允许0.0.0.0/0,仅个人测试使用 ingress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } # 默认全通出站规则 egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_redshift_cluster" "redshift" { cluster_identifier = "redshift-cluster-pipeline" skip_final_snapshot = true master_username = "awsuser" master_password = var.db_password node_type = "dc2.large" cluster_type = "single-node" publicly_accessible = true iam_roles = [aws_iam_role.redshift_role.arn] vpc_security_group_ids = [aws_security_group.redshift_sg.id] }
注意:
publicly_accessible = true加0.0.0.0/0全通规则会把Redshift集群完全暴露在公网,仅适合个人本地测试场景,生产环境必须严格限制入站源IP段,同时避免使用弱密码。
内容的提问来源于stack exchange,提问作者user14380579
相关产品推荐
相关产品推荐

