如何为关联AWS VPC的安全组配置S3、CloudWatch访问权限
AWS VPC安全组配置S3/CloudWatch访问权限(Terraform实现方案)
注意:安全组本身是四层网络访问控制规则,直接通过安全组开放AWS服务访问有两种实现路径:1)配置出站规则放行服务对应的公网IP段;2)搭配VPC端点(Gateway端点适配S3,Interface端点适配CloudWatch)后放行到端点的内网流量,第二种是更安全的私有访问方案,推荐优先使用。
实现前提
- 已提前创建目标关联的VPC资源,获取到对应VPC的ID
- Terraform AWS Provider版本≥3.0,已完成AWS认证配置
完整Terraform配置示例
基础依赖配置
# 配置AWS Provider provider "aws" { region = "cn-northwest-1" # 替换为你的实际部署区域 } # 引用你的自有VPC资源 data "aws_vpc" "target_vpc" { id = "vpc-xxxxxxx" # 替换为你的自有VPC ID }
步骤1:创建S3 Gateway VPC端点(可选但推荐)
S3支持Gateway类型端点,无额外费用,访问流量不走公网:
resource "aws_vpc_endpoint" "s3" { vpc_id = data.aws_vpc.target_vpc.id service_name = "com.amazonaws.${var.region}.s3" vpc_endpoint_type = "Gateway" # 替换为你的VPC关联的路由表ID列表,需要让子网路由指向该端点 route_table_ids = [ "rtb-xxxxxxx", "rtb-yyyyyyy" ] # 端点策略默认放行所有S3访问,可按需缩窄权限范围 policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "s3:*" Effect = "Allow" Resource = "*" Principal = "*" } ] }) }
步骤2:创建CloudWatch Interface VPC端点(可选但推荐)
CloudWatch使用Interface类型端点,实现私有网络访问:
resource "aws_vpc_endpoint" "cloudwatch" { vpc_id = data.aws_vpc.target_vpc.id service_name = "com.amazonaws.${var.region}.monitoring" vpc_endpoint_type = "Interface" security_group_ids = [aws_security_group.service_access.id] # 替换为你需要部署端点的子网ID列表 subnet_ids = [ "subnet-xxxxxxx", "subnet-yyyyyyy" ] private_dns_enabled = true # 开启后AWS服务域名自动解析为内网IP,无需修改应用配置 }
步骤3:创建关联VPC的安全组并配置规则
resource "aws_security_group" "service_access" { name = "service-access-sg" description = "Allow access to S3 and CloudWatch" vpc_id = data.aws_vpc.target_vpc.id # 入站规则按需配置,不需要外部访问的场景可仅允许同安全组内资源互访 ingress { from_port = 0 to_port = 0 protocol = "-1" self = true } # 出站规则:使用VPC端点时仅放行VPC内网的HTTPS访问即可 egress { from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [data.aws_vpc.target_vpc.cidr_block] } tags = { Name = "service-access-sg" } }
不使用VPC端点的简化配置
如果可以接受访问S3、CloudWatch的流量走公网,不需要创建VPC端点,直接配置安全组即可:
resource "aws_security_group" "service_access" { name = "service-access-sg" description = "Allow access to S3 and CloudWatch via public network" vpc_id = data.aws_vpc.target_vpc.id # 放行公网HTTPS出站访问 egress { from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } # 入站规则按需配置 }
注意事项
- 安全组是有状态规则,配置出站规则放行后,服务返回的入站流量会自动被允许,不需要额外配置对应入站规则
- 上述配置仅控制网络层面的访问权限,服务层面的资源操作权限仍然需要通过IAM角色/策略配置,例如关联到EC2的IAM角色需要添加S3、CloudWatch的对应操作权限
- 生产环境建议不要直接放行0.0.0.0/0的出站访问,优先使用VPC端点限制流量仅在内网流转,同时缩窄端点策略和IAM权限到最小必要范围
内容的提问来源于stack exchange,提问作者AstroNomad
相关产品推荐
相关产品推荐

