下記で、VPC内からCodeCommitにプライベートアクセスできるようになりました。

次は、VPCにVPN接続(Client VPN)した端末からのCodeCommitへのプライベートアクセスです。
“Client VPN”とは?
詳しくは「AWS Client VPN とは? – AWS クライアント VPN」に記載されていますが、概要は下記の引用となります。
AWS Client VPN は、AWS リソースやオンプレミスネットワーク内のリソースに安全にアクセスできるようにする、クライアントベースのマネージド VPN サービスです。クライアント VPN を使用すると、OpenVPN ベースの VPN クライアントを使用して、どこからでもリソースにアクセスできます。
AWS Client VPN とは? – AWS クライアント VPN
ここでは上記のドキュメントに従い、”Client VPN”の環境が構築されていることを前提とします。
通常のDNSの名前解決
上述の記事よりCodeCommitにプライベートアクセスするためには、CodeCommitのDNSでの名前解決でPrivateIPが返却される必要があります。しかしVPN接続を行っていても、端末で上記の名前解決をすると下記のようにPublicIPが返却されてしまいます。
% nslookup git-codecommit.ap-southeast-1.amazonaws.com
...
Non-authoritative answer:
Name: git-codecommit.ap-southeast-1.amazonaws.com
Address: 54.240.226.221Code language: CSS (css)
これは、VPN接続をしていても端末が名前解決に使うDNSが、通常の(AWSでない)ものになっており、そのDNSは当然VPCエンドポイントのことは知らず、CodeCommitの名前解決も通常のPublicIPが返却されているためです。

“Route 53 Resolver”を利用したDNS名前解決
なので、CodeCommitのDNSによる名前解決でPrivateIPを取得するには、VPNで接続している端末がAWS(VPC)内のDNSで名前解決ができるようにする必要があります。
そこで”Route 53 Resolver”です。詳しくは「Resolving DNS queries between VPCs and your network – Amazon Route 53」に書かれていますが、概要は下記の引用となります。
When you create a VPC using Amazon VPC, Route 53 Resolver automatically answers DNS queries for local VPC domain names for EC2 instances (ec2-192-0-2-44.compute-1.amazonaws.com) and records in private hosted zones (acme.example.com). For all other domain names, Resolver performs recursive lookups against public name servers.
Amazon VPC を使用して VPC を作成すると、Route 53 Resolver は EC2 インスタンスのローカル VPC ドメイン名 (ec2-192-0-2-44.compute-1.amazonaws.com) およびプライベートホストゾーン (acme.example.com) のレコードに対する DNS クエリに自動的に応答します。リゾルバー は、他のすべてのドメイン名については、公開ネームサーバーに対して再帰的ルックアップを実行します。
Resolving DNS queries between VPCs and your network – Amazon Route 53
VPC内に”Route 53 Resolver”を作成し、そのPrivateIPを”Client VPN”のDNSサーバの設定に記載します。すると下記のように、VPNに接続した端末が”Route 53 Resolver”でDNSの名前解決をするようになり、結果としてCodeCommitの名前解決でPrivateIPが返却されるようになります。

“Route 53 Resolver”の作成
AWSコンソール(Route 53)から作成します。

まずは全般の設定を行います。

上記で設定しているセキュリティグループ(resolver)は、下記のルールとしています。

次にIPアドレスの設定ですが、”Route 53 Resolver”が属するサブネットを指定します。
“Route 53 Resolver”を作成したら、下記の手順で”Client VPN”のDNSサーバの設定に記載する、IPアドレスを確認します。


“Client VPN”のDNSサーバの”Route 53 Resolver”のIPアドレスを設定
AWSコンソール(VPC)から設定します。

「DNSサーバの有効にする」にチェックを入れ、先ほど作成した”Route 53 Resolver”のIPアドレスを設定します。

VPNへの再接続とDNSの名前解決の確認
最後に、再びVPNを接続し直して、CodeCommitのDNSによる名前解決を行うと、今度は下記のようにPrivateIPが返却されていることが確認できます。
% nslookup git-codecommit.ap-southeast-1.amazonaws.com
Server: 10.0.2.20
Address: 10.0.2.20#53
Non-authoritative answer:
Name: git-codecommit.ap-southeast-1.amazonaws.com
Address: 10.0.a.a
Name: git-codecommit.ap-southeast-1.amazonaws.com
Address: 10.0.b.bCode language: CSS (css)
最後に
ということで、VPNに接続した端末からCodeCommit(Git)にプライベートアクセスできるようになりました。このやり方は、CodeCommitだけでなく、さまざまなAWSサービスにも適用できるはずなので、積極的に使っていきたいと思います!



