PrivateLink实验 - I

AWS PrivateLink用于将VPC内的资源与其他服务(其他VPC、或AWS托管服务)以内网形式打通,并且不需要借助IGW、NAT、DX/VPN等连接方式。

有许多公司的服务都部署在AWS上面来提供服务,例如DataDog。用户在使用DataDog时,将数据/指标通过公网上传到DataDog的服务,然后在后台查看报表。

如果用户的服务器和DataDog在同一个region,这种方式有缺陷:

  • 数据走公网,带来额外的花费。
  • 数据走公网,带来不必要的延迟
  • 数据走公网,有被窃听的风险

如果双方能直接通过内网访问,那么上面的两个缺陷就可以解决。

很容易想到使用VPC peering,但这样一来DataDog需要:

  • 每来一个新客户就要建立一个VPC peering。需要建立大量的peering,维护起来非常复杂
  • 这么多的客户,很容易产生CIDR冲突

上面的问题可以借助AWS提供的endpoint service来解决:

  • Datadog只需要将自己的服务做成endpoint service,并使用NLB来暴露(图右侧)
  • 客户使用这个Endpoint service的ARN进行连接,中间走AWS PrivateLink,从而可以通过endpoint service访问对方的服务(图左侧)

image-20220928194053226

用户对接好endpoint service后会在自己的VPC下自动创建一个ENI,利用这个ENI来实现访问能力。

动手实验 ——创建Endpoint Services

本节我们将建立Endpoint Service, 使用NLB将HTTP服务暴露给Consumer访问:

image-20220929095619150

  • 图的右侧是provider VPC,使用internal NLB对外提供服务
  • 图的左侧是consumer,使用AWS PrivateLink技术访问到Provider的服务

VPC准备

这里我们复用上一章TGW实验 时创建的VPC。

  • 右侧的Provider VPC网段为10.0.0.0/16

  • 左侧的Consumer VPC网络为10.1.0.0/16

Provider VPC侧的搭建

Provider侧需要创建好Web Server、NLBEndpoint Service

创建EC2 Web server

Provider VPC创建一台EC2, 上面启动Web服务:

image-20220929100834343

注意要把机器部署在私有子网,这样它才能挂到Internal NLB后面:

image-20220929104029831

在高级设置部分,Userdata如下,这里使用python3启动一台Web服务器:

image-20220929104055130

#!/bin/bash
echo "Hello World from provider VPC" > index.html
python3 -m http.server 80 &

创建机器后如果SSH到公网机器执行curl,能够访问到页面:

image-20220929112634198

创建Target Group

在创建NLB之前,先创建一个target group:

image-20220929101254534

选择TCP协议类型,并选择Provider所在的VPC:

image-20220929112752615

将上面创建的EC2添加到目标里,然后点击创建。

image-20220929101455533

创建 Internal NLB

点击创建Network Load Balancer

image-20220929101226263

选择Internal类型:

image-20220929102640438

选择VPC及对应的私有子网:

image-20220929104424194

使用上一步创建的target group:

image-20220929104754058

最后点击创建

创建Endpoint Service

在VPC页面,点击Create Endpoint Service

image-20220929105055941

选择使用上一步创建的NLB:

image-20220929105819069

这里选择了Acceptance required, 这样每当接受用户的请求时,都需要进行验证(类似于vpc peering时的确认);如果把这个钩去掉,则对方只要知道了Service ARN,就能直接创建endpoint来访问它。

image-20220929105929224

点击创建。创建完成后,将这个Service ARN复制出来,供下一步consumer来使用:

image-20220929110031517