DX越しにインターフェイスエンドポイントを利用する際のターゲット指定方法

Direct Connect経由でVPCエンドポイントのインターフェイスエンドポイントを利用する際のターゲット指定方法を紹介しています。2種類あり、用途に合わせて使い分けることが可能です。
2019.05.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

VPCエンドポイントのうちのインターフェイスエンドポイント(PrivateLink)をDirect Connect(DX)越しに利用する際に、どのようにターゲットを選択するか調べる機会があったので共有します。

大きく2種類の手法があるので、環境に合わせて選択できます。

Route53リゾルバを利用する方法

下記で解説があるのでこちらを参照いただくと手っ取り早いです。

[アップデート] Amazon SQS が VPC エンドポイントに対応!VPN 経由でオンプレミスからアクセスしてみた

画像を引用すると下記の構成になります。

これはオンプレミス側から名前解決する先をRoute53リゾルバにする方法です。この場合アプリケーションコードに対して手を加えることなく(AWSサービスへのアクセスが既存で作られている場合ですが)ホストのresolve.confか、オンプレミス側のDNSサーバのフォワード設定により対応ができます。

ただ、これらのDNS設定の操作を行いたくない場合もあると思うので他の方法を探してみました。

endpoint-urlを変更する方法

逆にアプリケーションのコードレベルでの解決方法としてendpoint-urlを利用する方法があります。

インターフェイス VPC エンドポイント (AWS PrivateLink) - Amazon Virtual Private Cloud

こちらはインターフェイスエンドポイント作成時に作成される固有のURL(例: vpce-0fe5b17a0707d6abc-29p5708s.ec2.us-east-1.vpce.amazonaws.com)を利用してターゲットを指定する形です。

上記のURLはパブリックに名前解決を行ってもプライベートIPが返ってくるため、DNSの設定を変更できない場合に役に立ちます。

早速やってみます。

今回はDXが用意できないため代わりにVPCピアリング越しに検証します。

細かい説明は省略しますが、2つのVPCを作成して片側にVPCエンドポイントを作成、ピアリングした後もう片方のVPCにEC2を立てます。セキュリティグループやルーティングは適切に設定しておきます。

EC2から一般的なエンドポイントとVPCエンドポイントを名前解決すると下記のようになります。

[ec2-user@ip-10-0-2-129 ~]$ nslookup sqs.ap-northeast-1.amazonaws.com
Server:		10.0.2.2
Address:	10.0.2.2#53

Non-authoritative answer:
sqs.ap-northeast-1.amazonaws.com	canonical name = ap-northeast-1.queue.amazonaws.com.
Name:	ap-northeast-1.queue.amazonaws.com
Address: 54.240.225.139

[ec2-user@ip-10-0-2-129 ~]$ nslookup vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.sqs.ap-northeast-1.vpce.amazonaws.com
Server:		10.0.2.2
Address:	10.0.2.2#53

Non-authoritative answer:
Name:	vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.sqs.ap-northeast-1.vpce.amazonaws.com
Address: 10.0.1.185

[ec2-user@ip-10-0-2-129 ~]$ nslookup vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.sqs.ap-northeast-1.vpce.amazonaws.com 8.8.8.8
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
Name:	vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.sqs.ap-northeast-1.vpce.amazonaws.com
Address: 10.0.1.185

念の為8.8.8.8でも解決しましたが、先述の通りパブリックDNSでもプライベートIPが返ってきました。

次にawscliからそれぞれのエンドポイントを利用してみます。オプションは--endpoint-urlです。

[ec2-user@ip-10-0-2-129 ~]$ aws sqs list-queues --region ap-northeast-1
{
    "QueueUrls": [
        "https://ap-northeast-1.queue.amazonaws.com/000000000000/test_queue"
    ]
}
[ec2-user@ip-10-0-2-129 ~]$ aws sqs list-queues --region ap-northeast-1 --endpoint-url https://vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.sqs.ap-northeast-1.vpce.amazonaws.com
{
    "QueueUrls": [
        "https://vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.sqs.ap-northeast-1.vpce.amazonaws.com/000000000000/test_queue"
    ]
}

それぞれ適切にレスポンスがありました。SQSの場合にはキューのURLもVPCエンドポイント越しのURLになっていて問題なく利用できるようです。

awscli以外でもendpoint-urlを変更することが出来るので、boto3でやってみます。

[ec2-user@ip-10-0-2-129 ~]$ python3
Python 3.7.3 (default, Apr 30 2019, 22:50:54)
>>> import boto3
>>> sqs = boto3.resource('sqs', region_name="ap-northeast-1")
>>> sqs_vpce = boto3.resource('sqs', endpoint_url="https://vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.sqs.ap-northeast-1.vpce.amazonaws.com", region_name="ap-northeast-1")
>>> list(sqs.queues.all())
[sqs.Queue(url='https://ap-northeast-1.queue.amazonaws.com/000000000000/test_queue')]
>>> list(sqs_vpce.queues.all())
[sqs.Queue(url='https://vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.sqs.ap-northeast-1.vpce.amazonaws.com/000000000000/test_queue')]

boto3ではendpoint_urlと指定することにより問題なく利用できました。

まとめ

VPCエンドポイントをDirect Connect経由で利用する時のターゲット指定方法を紹介しました。

要件に応じて使いやすい方法を選択できます!

DNSを変更しなくても利用できるようになっていて、レスポンスの内容も問い合わせ元に合わせて設定してくれるのでありがたいですね。