【アップデート】AWS PrivateLinkでNLBを介さずにVPC内リソースにアクセスできるようになりました! #AWSreInvent
お疲れさまです。とーちです。
AWS re:Invent 2024 もうすぐ始まりますね。
re:Invent前ということもあり大量のアップデートが発表されています。
今日はその中から、「AWS announces access to VPC resources over AWS PrivateLink」というアップデートを詳解します。
とりあえずまとめ
- AWS PrivateLink(以下PrivateLink)が進化し、NLBやGateway Load Balancerなしで、VPCリソースへの直接的なプライベートアクセスが可能に
- PrivateLink経由で通信させるには
Resource configuration
とResource gateway
が必要
何が変わったのか
従来のAWS PrivateLinkで、他VPCからEC2などのVPC内リソースにアクセスさせるためには宛先VPC側のアクセスさせたいリソースの前段にNLBなどを置きそれを経由させる必要がありました。絵にすると以下のような形です。
今回のアップデートにより以下のようにNLBなしで直接、通信が実現出来るようになりました。
私が思いつく嬉しいユースケースとしてはRDS接続でしょうか?従来、別VPCのRDSに接続するためにはVPCピアリングやTransitGatewayを使ってVPC間で通信が出来る状態にする必要がありました。
今回のアップデートでNLB等を置かずに直接別VPCのRDSに接続できるようになったのでVPC間でIPアドレスレンジが重複しているようなケースでもシンプルにアクセスできるようになったのが嬉しいですね。
試してみた
それではさっそく試してみようと思います。
今回はシンプルに1つのAWSアカウント内に2つのVPCを立てて通信をさせる以下の構成で試してみます。
まず、VPCを2つ用意します。あえてVPC CIDRを被らせてみました。
PrivateLink作成前のネットワークはシンプルに以下のような形です。両方のVPCはまったく同じ構成にしています。
次にそれぞれのVPCのPrivateSubnetにEC2を立てます。EC2にはnginxをインストールし80番ポートでアクセスするとページを返すようにしておきました。
EC2はそれぞれ、各VPCのPrivateSubnetに立てています。
この状態で、VPCリソースエンドポイント用のPrivateLinkを作成してみます。
前段として Resource configuration
を作る必要があります。自分はここでしばらく悩みました。またResource configurationを作成するには Resource gateway
という設定も作成する必要があります。
Resource gatewayは文字通りResource configurationで指定したリソースのGatewayとしての役割を持っており、PrivateLinkを通ってきた通信はまず、Resource gatewayで受信され、Resource gatewayから最終的な通信先リソース(今回の例でいうと、送信先のEC2)へ送信されます。
絵で表すと以下のような形です。
それでは設定していきましょう。
- まずはVPC Endpoint用のセキュリティグループとResource gateway用のセキュリティグループを作成しておきます。今回はそれぞれ以下のような設定にしました。
- VPC Endpoint用のセキュリティグループ
- VPC1のCIDRからの80番ポートの通信を許可
- Resource gateway用のセキュリティグループ
- VPC1のCIDRからの80番ポートの通信を許可
- EC2_Bのセキュリティグループ
- Resource gateway用のセキュリティグループからの80番ポートの通信を許可
- VPC Endpoint用のセキュリティグループ
- マネージメントコンソールからVPCの画面にいき、PrivateLink and Latticeの
Resource gateways
を選択しCreate resource gateway
を押す - Resource gatewayの設定を行う。今回は以下のようにしてみました
- Resource gateway name: privatelink-dev2-vpc-rscgw
- IPアドレスタイプ:ipv4
- vpc: VPC2
- subnet: VPC2の各AZのPrivateサブネットを選択
- セキュリティグループ: 事前に作成したResource gateway用のセキュリティグループ
- VPC画面のPrivateLink and Latticeの
Resource configurations
を選択しCreate resource configuration
を押す - Resouce confugurationの設定を行う。今回は以下のようにしてみました
- 名前: privatelink-dev2-vpc-cfg
- Configuration type: Resource
- Type: Single
- プロトコル: TCP
- Resource gateway: 上記で作成したもの
- Resource type: IP resource
- IPアドレス: EC2_BのプライベートIPを指定
- ポートレンジ:1~65535
- Association settings: Allow
- ※最初、DNS resourceとしてEC2に割り振られるプライベートIP DNS名(ip-172-18-0-***.ap-northeast-1.compute.internal)を入れたのですがこれはエラーとなったのでDNS名で登録する場合はもう少し何か設定が必要なようです
- VPC画面のPrivateLink and Latticeの
エンドポイント
を選択しエンドポイントを作成
を押す - エンドポイントの設定を行う。以下のような設定にしました
- 名前タグ: privatelink-rsc-vpcendpoint
- タイプ: リソース
- リソース設定: 上記で作成したResouce confugurationを指定
- ネットワーク設定:
- VPC:VPC1
- DNS名を有効化: 有効
- サブネット: VPC1の各AZのPrivateサブネットを選択
- セキュリティグループ:事前に作成したVPC Endpoint用のセキュリティグループ
- VPC:VPC1
以上で設定は完了です。それではアクセスしてみます。
EC2_Aに接続しEC2_AからVPCエンドポイントの各ネットワークインターフェースのプライベートIP(172.18.1.70,172.18.0.247)に対してcurlを実行しています
root@ip-172-18-0-108:~# curl 172.18.1.70
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@ip-172-18-0-108:~#
root@ip-172-18-0-108:~# curl 172.18.0.247
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@ip-172-18-0-108:~#
なお、VPCエンドポイントに対してAWSがデフォルトでプライベートDNS名を振ってくれるわけではないようです。このあたりは、Resouce confugurationにてDNS resourceとして登録することでDNS名によるアクセスをさせるのかもしれません。機会があったら試そうと思います。
まとめ
AWS PrivateLinkでNLBを介さずにVPC内リソースにアクセスできるようになったというアップデートの紹介でした。
正直もう少しシンプルに設定できると思っていたので、Resource configuration等が必要だと分かったときは面食らいましたが、NLBが不要になることによるコストメリットやRDSへの接続がしやすくなったという点は見逃せないと思います。気になる方はぜひお試し頂ければと思います。
以上、とーちでした。