こんにちは、ディーネットの山田です。
VPCエンドポイントサービスを使って独自のエンドポイントサービスを作成して、他のアカウントとAWS PrivateLinkで接続してみました。
目次
はじめに
AWS PrivateLinkとは
お客様のVPCとサービスの間でトラフィックをインターネットに公開することなく、プライベート接続を実現するサービスになります。
簡単に言えば、VPC内に作成したEC2インスタンス等からAPIサービス等への接続が、パブリックなインターネットトラフィックを経由することなく、AWSサービス内で留めることが可能になります。
これによって、通信内容が第三者に暴露される可能性を下げることが出来ますし、APIサービス側はDDoS攻撃等から守ることが出来ます。
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エンドポイントサービスを作成します
追加設定はお好みで設定します
- エンドポイントの承諾機能は、コンシューマー側でエンドポイントを設定後にプロバイダー側の承認によって利用可否を判断することが出来ます。
- プライベートDNS名機能は、プロバイダー側で設定したカスタムのDNS名を使ってコンシューマーにアクセスさせることが出来ます。(設定が複雑なので、今回の検証作業では使っていません)
VPCエンドポイントサービスの作成が行えたら、プリシンパルの許可を設定します
最後にVPCエンドポイントサービスのサービス名を確認します
(アカウントB)VPCエンドポイントを作成
プロバイダー側で表示されたサービス名を入力して、検証を行います
(余談)検証失敗例
- 検証に失敗する場合は、サービス名の入力誤りがないか、プリシンパルでアカウントが許可されているか等確認をお願いします。
VPCエンドポイントを設置するVPCとサブネットを選択します
セキュリティグループを選択します
VPCエンドポイントを作成します
承諾の保留中になるので、プロバイダー側に連絡して承諾の依頼を行います
(アカウントA)VPCエンドポイントの承諾作業
承諾待ち(Pending acceptance)のエンドポイントを選択して、承諾を行います
(アカウントB)プロバイダー側での承諾結果確認
無事に承諾されると、コンシューマー側で利用可能になります
利用可能になると晴れてDNS名を使ってPrivateLinkにアクセスすることが出来ます
感想
パブリック公開系のシステムでは中々、PrivateLinkを使うことは少ないですが、基幹系システムであれば、秘匿な通信のために使われることが多いのではないでしょうか。
今回は、独自のエンドポイントサービスを作成して接続しましたが、VPCエンドポイントだけであれば使われるケースは多いと思いますので、設定の参考になれば幸いです。
参考サイト
- https://www.slideshare.net/AmazonWebServicesJapan/20190417-aws-black-belt-online-seminar-amazon-vpc-advanced
- https://d1.awsstatic.com/webinars/jp/pdf/services/20201021_AWS-BlackBelt-VPC.pdf
おまけ
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"
プロフィール
テクニカルサポートは卒業して、フロントサイドでお客様環境の構築をさせていただいております。
たまに、テクニカルサポートでご対応させていただくことがあるかもしれませんが、その際はよろしくお願いいたします。
インフラ系のエンジニアですが、時々休日プログラマー(Python、PHP)をやっております。
LINK
クラウドベリージャム:プロフィールページ