Skip to content

通过内网访问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

[配置VPC Endpoint界面截图]

在VPC控制台创建S3 Gateway Endpoint:

  • VPC控制台 -> 终端节点 -> 创建终端节点
  • 终端节点名称:S3 Gateway Endpoint
  • 类型:AWS服务
  • 服务类别:选择 com.amazonaws.<region>.s3(Gateway类型)
  • VPC:选择EC2实例所在的VPC
  • 路由表:选择EC2子网关联的路由表
  • 策略:选择”完全访问”(Full Access)

VPC Endpoint创建过程1

VPC Endpoint创建过程2

  • 跨区域端点(Cross-Region Endpoint):该选项是指是否启用S3的全球端点访问能力,而不是让VPC Endpoint支持跨区域访问S3桶。
    • 勾选后:可以通过这个Endpoint访问所在区域的S3桶(但流量仍会经过公网到其他区域)。
    • 不勾选:只能访问当前区域的S3桶**(推荐)**。
    • VPC Endpoint只能提供到本区域S3服务的内网连接。
  • 为什么选择Gateway Endpoint: S3支持两种Endpoint类型,Gateway类型免费且性能更优,适合大数据传输场景。Interface类型按小时计费且有带宽限制,仅在特殊网络拓扑下使用。
  • 附加权限策略(最小权限原则):
  • 策略名称: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角色)。

EC2附加角色

EC2应用角色

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外部下载数据,提升安全防护等级。

[验证测试截图]

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 PeeringTransit 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端口。