配置Network ACL源IP,实现EC2通过boto3安全上传S3
EC2向S3上传时Network ACL的严格规则配置方案
关键结论
要让EC2能正常上传文件到S3,同时严格锁定Network ACL(NACL),你需要给TCP 1024-65535的入站返回流量配置的源IP,是你所用区域(比如us-west-2)的Amazon S3官方CIDR地址范围,而不是EC2实例的公网/私网IP。
为什么EC2 IP行不通?
EC2向S3发请求时,出站流量的目标是S3的服务器IP;而S3返回响应时,流量的源IP是S3的IP,不是EC2自己的IP。你把NACL入站规则的源设成EC2 IP,等于直接把S3的返回流量挡在了外面,上传自然失败。
怎么获取并维护S3的CIDR范围?
获取当前有效的S3 CIDR
AWS会定期更新各服务的IP范围,你可以通过两种方式拿到目标区域的S3地址段:- 下载AWS官方发布的IP范围JSON文件,筛选出
service: S3且region: us-west-2的条目 - 用AWS CLI命令直接查询对应区域的S3前缀列表:
这个命令会返回S3的前缀列表ID和对应的CIDR范围,前缀列表是AWS维护的,会自动更新。aws ec2 describe-prefix-lists --region us-west-2 --filters "Name=prefix-list-name,Values=com.amazonaws.us-west-2.s3"
- 下载AWS官方发布的IP范围JSON文件,筛选出
避免手动更新的麻烦
S3的CIDR可能随时变化,手动改NACL规则容易出错,推荐两种自动维护方式:- 写个Lambda函数,定期拉取最新的S3 CIDR,自动更新NACL的入站规则
- 在NACL规则里直接引用S3的前缀列表ID,不用手动输入CIDR,AWS会自动同步前缀列表的内容
更省心的替代方案:用S3 VPC网关端点
如果你的EC2在VPC里面,强烈建议配置S3的VPC网关端点。这样EC2和S3的流量走VPC内网,不用走公网,NACL规则还能更严:
- 入站规则:允许来自VPC CIDR的TCP 1024-65535流量(返回流量的源是VPC内网地址)
- 出站规则:允许目标为S3前缀列表的TCP 443流量(S3用HTTPS传输)
这种方式既安全,又不用操心S3公网CIDR的变化问题。
内容的提问来源于stack exchange,提问作者ez4nick
相关产品推荐
相关产品推荐

