让CloudFront通过VPC终端节点访问S3是否可行?客户需求存疑
解决方案:CloudFront 访问私有 S3 并结合 VPC 终端节点需求
核心思路澄清
首先,你想的ALB中转方案完全没必要——CloudFront本身就支持直接访问私有S3桶,不需要额外中间层。另外得明确:VPC网关终端节点是给你VPC内的资源(比如EC2、Lambda)提供私网访问S3的路径,而CloudFront属于AWS全球边缘网络服务,不在你的VPC范围内,所以它没法直接用你的VPC终端节点访问S3。
拆解客户的核心需求其实是三个:
- S3桶本身绝对私有,禁止公网直接访问
- VPC内的资源(含VPN接入的设备)能通过VPC终端节点私网访问S3
- 公网用户通过CloudFront正常访问S3静态资源
下面是满足所有需求的标准方案:
方案1:CloudFront OAI + 私有S3桶 + S3网关终端节点
这是最简洁高效的架构,完全匹配需求:
- 把S3桶设为私有:关闭桶的所有公有访问设置,删除任何公开权限的桶策略,只保留必要的内部权限。
- 创建CloudFront Origin Access Identity (OAI):这是CloudFront专属的身份实体,用来让CloudFront获得访问私有S3桶的权限。
- 给OAI授权S3访问权限:在S3桶策略中添加允许OAI读取桶内对象的规则,示例如下:
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity YOUR_OAI_ID" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*" } ] } - 配置S3网关终端节点:在你的VPC中创建S3网关终端节点,这样VPC内的资源(比如VPN连接的办公电脑、EC2实例)就能通过私网访问S3桶,不走公网。如果需要限制VPC内哪些资源能访问,还可以在桶策略里添加对应VPC的IP段或IAM角色权限。
这个方案的优势:
- 完全覆盖客户所有需求,S3桶私有性有保障,CloudFront分发正常,VPC内资源私网访问S3也能实现
- 架构简洁无冗余,性能和成本都是最优的
为什么你的ALB方案不可取?
你提到的CloudFront -> ALB -> VPC终端节点 -> S3方案确实冗余,而且存在实际问题:
- 如果用公网ALB,CloudFront访问公网ALB再绕回VPC终端节点,纯粹多此一举,只会增加延迟和成本
- 如果用私网ALB,CloudFront无法直接访问(除非额外配置Origin Shield或Lambda@Edge跳转,复杂度飙升),而且没有任何额外安全收益——OAI方案已经能完全保证S3的私有性,ALB不会带来额外管控能力
极端场景补充:要求CloudFront回源也走VPC?
如果客户有强制合规需求,要求CloudFront的回源流量也必须经过你的VPC(而非AWS内部网络),可以用CloudFront OAC + S3接口终端节点 + 私有链接的方案,但这个方案复杂度高、成本也更高,仅适合合规要求极强的场景:
- 创建S3接口终端节点(注意是Interface类型,不是Gateway),并配置为私有访问
- 创建CloudFront Origin Access Control (OAC),配置回源地址为S3接口终端节点的私有域名
- 调整VPC安全组,允许CloudFront的边缘IP段访问S3接口终端节点
但这个方案远不如OAI+网关终端节点的方案实用,非必要不推荐。
内容的提问来源于stack exchange,提问作者qkhanhpro
相关产品推荐
相关产品推荐

