背景
前段时间上线了新的大数据系统,它会频繁访问 AWS S3。由于之前我们 vpc 上服务访问 S3 是走的默认配置通过互联网访问。这样就会产生很大的 NAT 流量费用。
其实可以使用 AWS PrivateLink ,将 VPC 私密地连接到 AWS 服务,如同这些服务就在您自己的 VPC 中一样。下面来介绍下它和如何配置。
AWS PrivateLink
AWS PrivateLink 是一项高度可用的可扩展技术,可用于将 VPC 私密地连接到服务,如同这些服务就在您自己的 VPC 中一样。您无需使用互联网网关、NAT 设备、公有 IP 地址、AWS Direct Connect 连接或 AWS Site-to-Site VPN 连接来允许与私有子网中的服务进行通信。因此,您可以控制可从 VPC 访问的特定 API 端点、站点和服务。
您可以创建 VPC 端点,将 VPC 中的资源连接到与 AWS PrivateLink 集成的服务比如 S3。您也可以创建自己的 VPC 端点服务,并面向其他 AWS 客户提供。详情可参考 什么是 AWS PrivateLink? - Amazon Virtual Private Cloud
创建 Amazon S3 网关端点
下面介绍在 aws 上创建 Amazon S3 网关端点,将其关联到 vpc 中子网路由表,使访问 S3 的流量可以通过网关 endpoint 经 private link 访问到 S3。使用网关端点不会发生任何额外费用。
创建网关端点
Amazon VPC console -> Endpoints(终端端点) -> Create endpoint(创建端点)
Service category(服务类别),选择 AWS 服务。
在 Services(服务)中,添加筛选条件 Type = Gateway(类型 = 网关)并选择 com.amazonaws.{$region}.s3。
在 VPC 选项中,选择要创建端点的 VPC。
对于 Route tables(路由表),选择网关端点要使用的路由表。选中的路由表 AWS 将自动添加一个路由,将以服务为目的地的流量(这里就是 S3 流量)指向端点网络接口。
对于 Policy(策略),选择 Full access(完全访问权限)以允许所有主体通过 VPC 端点对所有资源执行所有操作。否则,选择 Custom(自定义)以附加 VPC 端点策略,该策略控制主体通过 VPC 端点对资源执行操作的权限。
(可选)若要添加标签,请选择 Add new tag(添加新标签),然后输入该标签的键和值。
选择 Create endpoint(创建端点)。
等待创建网关端点成功后,可以在路由表看到多了一条这样的路由。
测试验证
变更前后,s3 域名解析前后没有变化。traceroute 路径偶尔会不同,创建 endpoint 后 trace 有时会看不到ec2-99-150-19-51.eu-central-1 这条路径,有时能看到,可能是 aws 屏蔽 trace 返回。
原先mtr
更改后
从 Cloudwatch 上查看 AWS/NATGateway 命名空间的 BytesOutToDestination 指标,可以看到 NAT 流量已经明显下降(绝大部分是访问 S3)。