Terraform创建AWS基础设施时生成两个安全组的问题咨询
解决Terraform创建AWS资源时生成两个安全组的问题
问题背景
使用Terraform脚本构建AWS基础设施时,执行terraform apply后发现创建了两个安全组:一个是脚本中定义的MySecurityGroup,另一个是VPC的默认安全组。
原因分析
AWS在创建VPC时自动生成默认安全组,这是AWS的内置行为,与Terraform无关。默认安全组的规则为:允许VPC内所有资源互相通信,拒绝外部入站流量,允许所有出站流量。脚本中自定义的安全组是额外创建的资源,因此最终会存在两个安全组。
解决方案
方案1:忽略默认安全组,继续使用自定义安全组
默认安全组是VPC的默认组件,无法阻止其创建,但可以选择不将任何AWS资源(如EC2实例)关联到这个默认组,只使用你自定义的MySecurityGroup即可。
方案2:修改默认安全组规则,替代自定义安全组
如果不想额外创建安全组,可以通过Terraform管理VPC的默认安全组,直接修改其规则来满足需求。修改后的脚本示例如下:
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } } } provider "aws" { region = "ap-south-1" shared_config_files = ["/home/terraform/.aws/config"] shared_credentials_files = ["/home/terraform/.aws/credentials"] } resource "aws_vpc" "Terraform_VPC" { cidr_block = "10.0.0.0/16" tags = { Name = "Terraform_VPC" } } resource "aws_subnet" "Subnet_Terraform_VPC" { vpc_id = aws_vpc.Terraform_VPC.id cidr_block = "10.0.0.0/24" # 子网CIDR必须是VPC CIDR的子集,修正原脚本错误 tags = { Name = "Subnet_Terraform_VPC" } } # 管理VPC默认安全组,配置所需的入站/出站规则 resource "aws_default_security_group" "default" { vpc_id = aws_vpc.Terraform_VPC.id # 允许SSH(22)、HTTP(80)、HTTPS(443)入站流量 ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] # 建议根据实际需求限制IP范围,比如公司办公IP } ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ingress { from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } # 允许所有出站流量 egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } tags = { Name = "Default_Security_Group" } }
额外说明
原脚本中的子网CIDR(10.0.0.0/16)与VPC的CIDR完全相同,这不符合AWS子网的创建规则(子网必须是VPC CIDR的子集),因此在示例脚本中修正为10.0.0.0/24。
内容的提问来源于stack exchange,提问作者Support Test email account
相关产品推荐
相关产品推荐

