亚马逊AWS官方博客
如何通过 S3 PrivateLink 实现跨区域私有访问 S3
1. 摘要
AWS在2021年2月正式发布了适用于 Amazon S3 的 AWS PrivateLink,AWS PrivateLink 使用虚拟网络中的私有 IP 提供 Amazon Simple Storage Service (S3) 与本地资源之间的专用连接。借助此功能,您现在可以使用 Virtual Private Cloud 中的接口 VPC 终端节点,在安全的虚拟网络中直接访问作为私有终端节点的 S3。通过允许您使用私有 IP 地址访问 S3,这扩展了现有网关终端节点的功能。从本地应用程序向 S3 发出的 API 请求和 HTTPS 请求会自动通过接口终端节点进行定向,这些终端节点通过 PrivateLink 以安全和私密的方式连接到 S3。
本文档介绍的方案是通过利用跨区域间的VPC对等连接和S3的接口终端节点,来实现跨区域私有访问S3。客户可以根据自己的需要,可以通过 AWS Direct Connect 或 AWS VPN 提供的安全连接从本地应用程序私有访问 S3。
2. 服务介绍
早在 2015 年,S3 是第一个支持添加 VPC 终端节点的服务;通过VPC网关终端节点提供与 S3 的安全连接,而不需要网关或 NAT 实例。其原理是在指定的路由表里,创建到S3服务的路由,与路由表相关联的每个子网都可以访问终端节点,随后通过终端节点将来自这些子网实例的流量路由到S3服务。在下图中,子网2中的实例可通过网关终端节点访问Amazon S3。
这种新的灵活性深受客户欢迎,但是也有它的局限性 – 不支持跨区域和本地数据中心私有访问S3,最新推出的S3接口终端节点则可以满足这种需求,其通过在选择的子网中,使用分配私有IP的ENI创建S3接口终端节点,从而实现与S3的安全连接。VPC内应用程序,或者是通过 AWS Direct Connect 或 AWS VPN等安全连接到接口终端节点的本地应用程序,都可以通过接口终端节点私有访问 S3。当从本地应用程序连接到 S3 时,通过消除配置防火墙规则或互联网网关的需要,接口终端节点可简化您的网络架构。
S3两种终端节点的对比:
网关终端节点 | 接口终端节点 |
网络流量保持在Amazon网络上 | |
不支持从本地应用程序私有访问S3 | 支持从本地应用程序私有访问S3 |
不支持跨区域私有访问S3 | 支持跨区域私有访问S3 |
不收费 | 收费 |
3. 演示环境整体架构
演示环境的VPC设置:
VPC Component | VPC 1 | VPC 2 |
Region | cn-north-1 | cn-northwest-1 |
CIDR | 172.31.0.0/16 | 10.0.0.0/16 |
Public Subnet | 172.31.0.0/20 | 10.0.0.0/24 |
Private Subnet | 172.31.16.0/20 | 10.0.1.0/24 |
Test Instance Private IP | 172.31.30.22 | 10.0.1.94 |
注意:
- VPC 对等连接的2个VPC的CIDR块不能有重叠
- 使用具有接口 VPC 终端节点的私有 DNS (AWS PrivateLink),则必须将enableDnsHostnames 和enableDnsSupport 属性设置为 true
- 在两个VPC对等连接中都需要启用DNS解析
- 接口终端节点的安全组必须允许入站 HTTPS(端口 443)流量
4. 演示环境搭建步骤
4.1 创建演示VPC环境
在每个区域中通过VPC Console的向导创建一个带有公有子网和私有子网的VPC, 同时在cn-northwest-1区域创建S3桶(具体步骤略)。下面是我的演示环境中的截图:
在两个VPC中都启用DNS hostnames 和 DNS resolution:
4.2 搭建跨区域VPC对等连接
把两个区域中的VPC创建对等连接,更新路由表(具体步骤略),下面是我的演示环境中的截图:
4.3 验证跨区域VPC对等连接
在cn-north-1公有子网和私有子网各创建一台EC2实例,公有子网的EC2作为跳板机连接到私有子网的EC2。 同时在cn-northwest-1的私有子网创建一台EC2实例。
借助于公有子网的EC2跳板机, 验证从cn-north-1私有子网的EC2(IP:172.31.30.22) 成功SSH到cn-northwest-1的EC2实例(IP:10.10.1.94 )。
4.4 创建S3接口终端节点
首先为确保AWS 命令行工具(例如 AWS CLI)可以通过 HTTPS 从 VPC 中的资源向 AWS 服务发出请求,接口终端节点的安全组必须允许入站 HTTPS(端口 443)流量,所以在cn-northwest-1区域创建一个安全组,入站规则如下:
在cn-northwest-1区域的VPC创建S3的接口终端节点,关联对应的VPC和子网,来实现跨区域私有访问S3。
接下来给接口终端节点关联之前创建的安全组,然后创建S3的接口终端节点。
创建完成后,会生成两种类型的S3接口终端节点的DNS:
- Regional DNS – 包括唯一的VPC端点ID、服务标识符、AWS区域和amazonaws.com, 本实例中为vpce-0257c85882d96cc95-vj9syim9.s3.cn-northwest-1.vpce.amazonaws.com.cn
- Zone DNS – 包括可用区,如vpce-0257c85882d96cc95-vj9syim9-cn-northwest-1a.s3.cn-northwest-1.vpce.amazonaws.com.cn,客户用这种类型的DNS来指定可用区,降低跨可用区数据传输成本
S3接口终端节点在选择的子网中,使用分配私有IP的ENI创建S3接口终端节点,从而实现与S3的安全连接。
4.5 测试验证
首先在cn-north-1创建EC2 服务的role, 赋予S3 读写权限。
把创建的EC2 服务的role赋予cn-north-1私有子网的EC2(IP:172.31.30.22)。
验证从EC2不能直接访问cn-northwest-1的s3桶,因为EC2在私有子网,不能访问public网络访问S3 Endpoint,命令会一直hung住直到超时。
验证通过VPC对等连接和S3接口终端节点DNS,cn-north-1的私有子网的EC2可以成功访问位于cn-northwest-1的s3桶并上传文件。
5. 使用建议
S3接口终端节点和之前的网关终端节点是可以共存的,建议本区域的VPC内应用程序通过网关终端节点私有安全S3,这种方式不会产生额外的费用。对于其它区域和客户数据中心用接口终端节点, 通过AWS PrivateLink以安全和私密的方式连接到S3。推荐的架构如下:
对于本地数据中心访问S3接口终端节点DNS, AWS Global区域可以结合Route53 Resolver(参考文档1);AWS中国区可以搭建DNS Proxy来实现DNS解析(参考文档2)。
6. 总结
本文介绍了利用Amazon S3 的接口终端节点和跨区域间的VPC对等连接,来实现跨区域私有访问S3,网络流量通过AWS PrivateLink全部保持在Amazon网络上。客户可以根据自己的需要,可以通过AWS Direct Connect或AWS VPN提供的安全连接从本地应用程序私有访问S3。从本地应用程序向S3发出的 API 请求和 HTTPS 请求会自动通过接口终端节点进行定向,这些终端节点通过PrivateLink以安全和私密的方式连接到S3。
7. 参考文档
-
- https://docs.thinkwithwp.com/zh_cn/Route53/latest/DeveloperGuide/resolver.html
- https://thinkwithwp.com/blogs/security/how-to-set-up-dns-resolution-between-on-premises-networks-and-aws-by-using-unbound/
- https://thinkwithwp.com/cn/blogs/china/aws-privatelink-for-amazon-s3-now-available/
- https://docs.thinkwithwp.com/zh_cn/vpc/latest/peering/working-with-vpc-peering.html
- https://docs.thinkwithwp.com/zh_cn/AmazonS3/latest/userguide/privatelink-interface-endpoints.html