Interface endpoint
是基于AWS PrivateLink
实现的技术,它在每个VPC的子网中创建一个ENI并给它分配一个私网IP。这个ENI是requester-managed
类型,可以查看它的信息,但不能做更改:
本部分我们将创建SQS服务的Interface endpoint
,并测试在私网的机器上往SQS里发送消息:
首先创建具有公网和私网的VPC(可以直接使用第二章创建的)
创建一个SQS队列:
记录下它的URL:
由于私网机器要向SQS里发送消息,所以要为它绑定一个Role:
创建Endpoint:
搜索并选择sqs的interface endpoint
:
这里先选择Interface Endpoint
所在的VPC,将公有子网和私有子网都钩选上:
和transit gateway
不一样,如果创建TGW时没有钩选某个子网,则该子网不具有和TGW通讯的能力;但是Interface Endpoint
只要选择一个子网,则VPC下的其他子网都可以跟它通讯。选择多个子网可以实现Interface Enpoint
的高可用
由于Interface Endpoint
要在VPC的子网里创建ENI,所以这个ENI上可以绑定安全组,这里我们先选择默认的安全组:
这个安全组用于控制Interface Endpoint
上的流量,由于它要与SQS进行通讯,所以要把443端口放开:
最后点击创建Interface Endpoint
默认EC2上装的是AWS CLI V1
,测试一定要使用V2版本的CLI!!否则执行sqs命令会失败
先为私网机器的路由表添加一条NAT Gateway
解析,让它具有访问公网的能力,然后更新CLI:
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
更新完成后,再把这条路由删除,此时私网机器访问不到公网。
创建完成后,登录到私网机器,然后执行sqs的命令往队列里发送消息:
aws sqs send-message --queue-url https://sqs.us-west-2.amazonaws.com/145197526627/interface-test --message-body="Hello via interface endpoint" --region=us-west-2
queue-url
和region
参数根据实际情况进行替换
可见,使用Interface Endpoint
后,即使在私网里(没有NAT)也能跟SQS服务通讯。
此时我们解析SQS的域名,发现正好是Interface Endpoint
两个ENI的IP:
上面我们把Interface Endpoint
的安全组上放通了443端口,我们测试下把这条规则去掉会如何:
此时执行sqs命令,会发现被卡住:
通过Interface Endpoint
的安全组,我们拥有了控制流量访问的能力