通过内网访问S3
难度等级: 初级
预计时间: 20-30分钟
适用环境: AWS EC2 + S3
使EC2实例能够通过AWS内网访问S3桶(ab2nl2an1lwp6r3d-rclone),避免流量经过公网,降低成本并提高安全性。
- 已创建EC2实例并正常运行
- 已创建S3桶(ab2nl2an1lwp6r3d-rclone)
- EC2实例具有可访问互联网的能力(用于初始配置)
- 拥有AWS管理控制台访问权限
本文涉及以下AWS服务:
- VPC Endpoint:AWS内网的”专用通道”,让EC2和S3之间的数据传输不经过公网
- IAM Role:授予EC2访问S3的身份凭证
- S3 Bucket Policy:控制谁可以访问S3桶的规则
通俗理解: VPC Endpoint就像公司内部的专线电话,不需要通过外部网络就能直接联系;IAM Role相当于员工工牌,证明你有权限进入某些区域;Bucket Policy就是S3桶的门禁规则。
graph LR
A[EC2实例] -->|内网流量| B[VPC Endpoint]
B -->|AWS骨干网| C[S3桶]
style B fill:#f9f,stroke:#333
1. 创建VPC Endpoint
Section titled “1. 创建VPC Endpoint”[配置VPC Endpoint界面截图]
在VPC控制台创建S3 Gateway Endpoint:
- VPC控制台 -> 终端节点 -> 创建终端节点
- 终端节点名称:
S3 Gateway Endpoint - 类型:
AWS服务 - 服务类别:选择
com.amazonaws.<region>.s3(Gateway类型) - VPC:选择EC2实例所在的VPC
- 路由表:选择EC2子网关联的路由表
- 策略:选择”完全访问”(Full Access)


- 跨区域端点(Cross-Region Endpoint):该选项是指是否启用S3的全球端点访问能力,而不是让VPC Endpoint支持跨区域访问S3桶。
- 勾选后:可以通过这个Endpoint访问所在区域的S3桶(但流量仍会经过公网到其他区域)。
- 不勾选:只能访问当前区域的S3桶**(推荐)**。
- VPC Endpoint只能提供到本区域S3服务的内网连接。
- 为什么选择Gateway Endpoint: S3支持两种Endpoint类型,Gateway类型免费且性能更优,适合大数据传输场景。Interface类型按小时计费且有带宽限制,仅在特殊网络拓扑下使用。
2. 配置IAM角色
Section titled “2. 配置IAM角色”- 附加权限策略(最小权限原则):
- 策略名称:
EC2Access2S3-Policy
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::ab2nl2an1lwp6r3d-rclone", "arn:aws:s3:::ab2nl2an1lwp6r3d-rclone/*" ] }]}为EC2实例创建并附加IAM角色:
创建角色时选择:
- 信任实体类型:AWS服务
- 使用案例:EC2
- 附加
EC2Access2S3-Policy策略 - 角色名称:
EC2Access2S3-Role

将此角色附加到EC2实例(实例 → 操作 → 安全 → 修改IAM角色)。


3. 配置S3桶策略(可选)
Section titled “3. 配置S3桶策略(可选)”
在S3桶权限设置中添加桶策略,允许通过VPC Endpoint访问:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowVPCEndpointAccess", "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::ab2nl2an1lwp6r3d-rclone", "arn:aws:s3:::ab2nl2an1lwp6r3d-rclone/*" ], "Condition": { "StringEquals": { "aws:SourceVpce": "vpce-xxxxxxxxx" } } }, { "Sid": "AllowAccountOwnerFullAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::YOUR-ACCOUNT-ID:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::ab2nl2an1lwp6r3d-rclone", "arn:aws:s3:::ab2nl2an1lwp6r3d-rclone/*" ] } ]}- 将
vpce-xxxxxxxxx替换为步骤1创建的VPC Endpoint ID。 - 第一条规则:允许通过VPC Endpoint访问
- 第二条规则:永远保留账户Root的完全访问权限
- 没有任何 Deny 规则
- 将
YOUR-ACCOUNT-ID替换为实际账户ID
为什么这么做: 防止数据被公网访问,即使密钥泄露也无法从VPC外部下载数据,提升安全防护等级。
4. 验证配置
Section titled “4. 验证配置”[验证测试截图]
SSH登录EC2实例,执行测试命令:
aws s3 ls s3://ab2nl2an1lwp6r3d-rclone/如显示桶内文件列表,说明配置成功。
测试大文件传输性能:
aws s3 cp s3://ab2nl2an1lwp6r3d-rclone/<large-file> /tmp/性能优化提示: 对于50GB数据传输,可使用S3 Transfer Acceleration或启用多部分上传提升速度,但这两项功能会产生额外费用,内网传输场景通常无需启用。
优势:
- 流量不计费(通过VPC Endpoint的S3流量免费)
- 传输速度快(AWS内网带宽通常优于公网)
- 安全性高(数据不离开AWS网络)
- 延迟低(减少公网路由跳数)
劣势:
- 仅限同区域访问(VPC Endpoint不支持跨区域)
- 配置相对复杂(需要理解VPC、IAM等概念)
- 排查问题难度较高(网络路由、权限交叉验证)
- VPC Endpoint和S3桶必须在同一AWS区域
- Gateway Endpoint不支持跨VPC访问(需使用VPC Peering或Transit Gateway配合)
- EC2实例必须位于配置了Endpoint路由的子网中
- 某些旧版本AWS CLI可能不支持自动识别Endpoint,需更新到最新版本
Q: 配置后仍提示权限不足?
A: 检查顺序:IAM角色是否已附加到EC2 → IAM策略资源ARN是否正确 → S3桶策略是否过度限制。
Q: 如何确认流量走内网而非公网?
A: 在VPC流日志中检查目标地址,或在EC2上执行aws s3 ls --debug查看解析的Endpoint地址,应为私有IP段。
Q: 大量小文件传输慢怎么办?
A: S3针对小文件的API调用有延迟,建议将小文件打包成tar或zip后上传,或使用S3 Batch Operations批量处理。
Q: 是否需要配置安全组?
A: Gateway Endpoint不需要配置安全组,它通过路由表工作。如果使用Interface Endpoint则需要配置安全组允许443端口。