AWS-PrivateLink

VPCエンドポイントサービスを作成してみた

こんにちは、ディーネットの山田です。

VPCエンドポイントサービスを使って独自のエンドポイントサービスを作成して、他のアカウントとAWS PrivateLinkで接続してみました。

はじめに

AWS PrivateLinkとは

お客様のVPCとサービスの間でトラフィックをインターネットに公開することなく、プライベート接続を実現するサービスになります。
簡単に言えば、VPC内に作成したEC2インスタンス等からAPIサービス等への接続が、パブリックなインターネットトラフィックを経由することなく、AWSサービス内で留めることが可能になります。
これによって、通信内容が第三者に暴露される可能性を下げることが出来ますし、APIサービス側はDDoS攻撃等から守ることが出来ます。

AWS PrivateLinkとは

VPCピアリングと何が違うの?

大きく違う部分としては、VPCピアリングは、VPC間を接続するためVPCのネットワーク(CIDR)の重複を気にする必要がありますが、独自のエンドポイントサービスを作成してAWS PrivateLink接続する場合、CIDRの重複を気にする必要はありません。
VPC間を接続しない代わりに、AWS PrivateLinkでVPCからのトラフィックを処理するためのElastic Network Interface(ENI)がVPC内にあるサブネット上で作成されます。

利用するサービス

AWS PrivateLinkと言ってもそういうサービスが存在する訳ではありません。
VPCエンドポイントを使って、インターフェースタイプのエンドポイントと接続した際に利用できるようになります。

作業内容

全体構成図


※簡素にするために冗長化は省いておりますが、本番サービス系で利用される場合は必ず冗長化を検討してください。

構成の説明

前提情報

VPC、サブネット、ロードバランサー配下のEC2は作成済みとします。

アカウントA(プロバイダー)

  • Elastic Load Balancing(Network Load Balancer)を作成
  • VPCエンドポイントサービスを作成

アカウントB(コンシューマー)

  • VPCエンドポイントを作成

設定方法

(アカウントA)Elastic Load Balancing(Network Load Balancer)を作成

ロードバランサータイプでは、"Network Load Balancer"を選択します

Network Load Balancerを作成していきます

  • 今回は、インターネットに公開するつもりはないので、内部向けで作成してみました。

VPCやサブネットは環境に応じて適切なものを選択します


リスナーには適切なターゲットグループを選択します

最終的に選択した概要はこんな感じで確認したら作成を行います

作成出来たらロードバランサー属性でクロスゾーン負荷分散を有効にしておきます

  • 必須ではありませんので、環境に合わせて有効/無効を判断してください。

Network Load BalancerのステータスがActiveになったら次のステップに進みます

(アカウントA)VPCエンドポイントサービスを作成

VPCエンドポイントサービスを作成します

  • 先ほど作成したNetwork Load Balancerを選択します。

追加設定はお好みで設定します

  • エンドポイントの承諾機能は、コンシューマー側でエンドポイントを設定後にプロバイダー側の承認によって利用可否を判断することが出来ます。
  • プライベートDNS名機能は、プロバイダー側で設定したカスタムのDNS名を使ってコンシューマーにアクセスさせることが出来ます。(設定が複雑なので、今回の検証作業では使っていません)

VPCエンドポイントサービスの作成が行えたら、プリシンパルの許可を設定します

  • これは、どのアカウントにVPCエンドポイントサービスを利用させるか設定するものになります。

最後にVPCエンドポイントサービスのサービス名を確認します

  • コンシューマー側で設定するためのサービス名を確認する形になります。

(アカウントB)VPCエンドポイントを作成

プロバイダー側で表示されたサービス名を入力して、検証を行います

(余談)検証失敗例

  • 検証に失敗する場合は、サービス名の入力誤りがないか、プリシンパルでアカウントが許可されているか等確認をお願いします。

VPCエンドポイントを設置するVPCとサブネットを選択します

セキュリティグループを選択します

VPCエンドポイントを作成します

承諾の保留中になるので、プロバイダー側に連絡して承諾の依頼を行います

(アカウントA)VPCエンドポイントの承諾作業

承諾待ち(Pending acceptance)のエンドポイントを選択して、承諾を行います


(アカウントB)プロバイダー側での承諾結果確認

無事に承諾されると、コンシューマー側で利用可能になります

利用可能になると晴れてDNS名を使ってPrivateLinkにアクセスすることが出来ます

感想

パブリック公開系のシステムでは中々、PrivateLinkを使うことは少ないですが、基幹系システムであれば、秘匿な通信のために使われることが多いのではないでしょうか。
今回は、独自のエンドポイントサービスを作成して接続しましたが、VPCエンドポイントだけであれば使われるケースは多いと思いますので、設定の参考になれば幸いです。

参考サイト

おまけ

PrivateLink経由でアクセスされた場合、ターゲットに記録されるIPアドレスは、Elastic Load Balancing(Network Load Balancer)のIPアドレスになります。
単一のアカウントと接続する際は、さほど気にならないと思いますが、複数のアカウントだとどの環境から接続されたものかIPアドレスだけでは判断出来ませんので注意が必要です。

VPCエンドポイント側からVPCエンドポイントのDNSを名前解決するとこんな感じ

[root@ip-10-24-20-251 ~]# dig vpce-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.vpce-svc-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.ap-northeast-1.vpce.amazonaws.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> vpce-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.vpce-svc-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.ap-northeast-1.vpce.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1035
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;vpce-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.vpce-svc-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.ap-northeast-1.vpce.amazonaws.com. IN A

;; ANSWER SECTION:
vpce-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.vpce-svc-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.ap-northeast-1.vpce.amazonaws.com. 60 IN A 10.24.20.69
vpce-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.vpce-svc-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.ap-northeast-1.vpce.amazonaws.com. 60 IN A 10.24.120.86

;; Query time: 1 msec
;; SERVER: 10.24.0.2#53(10.24.0.2)
;; WHEN: Sun Dec 05 14:36:05 UTC 2021
;; MSG SIZE  rcvd: 153

(エンドポイントサービス側ではHTTPサービスを提供しているので)curlコマンドでリクエストしてみるとこんな感じ

[root@ip-10-24-20-251 ~]# curl vpce-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.vpce-svc-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.ap-northeast-1.vpce.amazonaws.com
AWS PrivateLink Connect Success.

Elastic Load Balancing(Network Load Balancer)配下のターゲット上ではこのようなアクセスログが記録されていた

[root@ip-10-0-128-142 ~]# cat /var/log/httpd/access_log
10.0.128.6 - - [05/Dec/2021:14:36:00 +0000] "GET / HTTP/1.1" 200 33 "-" "curl/7.76.1"
10.0.128.6 - - [05/Dec/2021:14:37:03 +0000] "GET / HTTP/1.1" 200 33 "-" "curl/7.76.1"

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA