AWS PrivateLinkを利用してVMware Cloud on AWSからIPアドレス重複している別VPC環境にアクセスしてみる #1 (プライベートIPはAWS自動採番)

# 1. はじめに

VMware Cloud on AWS環境とネイティブAWS VPCのIPアドレス帯(CIDR)が重複している場合でも、AWS PrivateLinkを活用すればアクセスできるということ試せたので備忘録として残しておきます。

#### 今回セットアップ試してみた構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/45b32d0f-952b-53ab-553c-4f02d2f3a60e.png)

今回は基本的なHTTP(TCP:80)アクセスだけで試していますが、NLBが待受けやターゲットのTCPポートを変更することでほかの構成にも応用が効くかもしれません。

:::note

本手順では、アクセス先Web ServerのIPアドレス(192.168.15.241)は「AWSが自動的に採番したプライベートIP(=私が手動で採番していないIP)」を利用しています。
アクセス先のEC2のプライベートIPアドレスを手動で採番する場合、NLBの設定および挙動が若干異なりますので次の記事もあわせてご参考ください。

:::

https://qiita.com/sanjushi003/items/64c05cc9e6a634038ecf

# 2.  AWS PrivateLink is 何？
> データをインターネットに公開することなく、VPC と AWS のサービス間の接続を確立する

上記はAWS公式サイトのサービス概要ですが、今回はさらにVMware Cloud on AWS, Conntected VPC, ELB(NLB)などいくつかの条件や要素を組み合わせることで、上図のようにIPアドレス帯が重複するVMware Cloud on AWS環境からVPCへのアクセスを実現しています。

https://aws.amazon.com/jp/privatelink/

https://aws.amazon.com/jp/blogs/news/design-considerations-using-vpc-endpoints-for-amazon-s3-with-vmware-cloud-on-aws/

https://aws.amazon.com/jp/blogs/psa/aws-privatelink-saas-whi/

# 3. セットアップしてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/45b32d0f-952b-53ab-553c-4f02d2f3a60e.png)

## 登場人物の確認

次の３つの異なる環境をまたがる構成となっており、登場人物は次のとおりです。

#### アクセス元であるVMware Cloud on AWS環境(「VMC環境(192.168.0.0/20)」)
- 「アクセス元Windows Server(192.168.15.10)」

#### VMware Cloud on AWSのConnected VPC(「Connected VPC環境(10.0.0.0/16)」)
- 「VPC Endpoint Network Interface (10.0.3.181)」

#### アクセス先であるWeb Serverが稼働するVPC(「Web Server's VPC環境(192.168.0.0/20)」)
- 「アクセス先Web Server(192.168.15.241)」
- 「踏み台サーバー(192.168.11.40)」

## 初期セットアップの確認

###  「Web Server's VPC環境(192.168.0.0/20)」の確認

まず「踏み台サーバー(192.168.11.40)」から「アクセス先Web Server(192.168.15.241)」にHTTPアクセスし、Webページが表示されることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/114616b3-3a7b-9cdb-06b8-8984db1c2031.png)

「アクセス先Web Server(192.168.15.241)」のEC2インスタンス情報は次のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/fafe5e01-6794-6b00-d5ac-bed4b54435ef.png)

:::note
(再掲) 本手順では、アクセス先Web ServerのIPアドレス(192.168.15.241)は「AWSが自動的に採番したプライベートIP(=私が手動で採番していないIP)」を利用しています。アクセス先のEC2のプライベートIPアドレスを手動で採番する場合、NLBの設定および挙動が若干異なりますので次の記事もあわせてご参考ください。
:::

https://qiita.com/sanjushi003/items/64c05cc9e6a634038ecf

参考までに、「Web Server's VPC環境(192.168.0.0/20)」のサブネット情報は次のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/535e0842-5890-4912-808e-c33752e053a5.png)

####  「VMC環境(192.168.0.0/20)」)の確認

「VMC環境(192.168.0.0/20)」で稼働している「アクセス元Windows Server(192.168.15.10)」が、
現時点では「Web Server's VPC環境(192.168.0.0/20)」で稼働する「アクセス先Web Server(192.168.15.241)」にHTTPアクセスできていないことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/be8861e3-3a4c-44b3-77a4-b223e22db986.png)

 「VMC環境(192.168.0.0/20)」で作成したサブネットを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/25d8455b-2214-9ac0-ff25-6b6d8b0c3a0c.png)

デプロイ時に選択した「Connected VPC環境(10.0.0.0/16)」を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/f451bcc6-86e6-28fe-f680-e53cc2e59983.png)

 「VMC環境(192.168.0.0/20)」から「Connected VPC環境(10.0.0.0/16)」に向けてHTTP (TCP:80)のアクセスが許可されていることを確認します。
今回許可しているのはアウトバウンド通信だけであることにも着目ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/1d0ae93d-fcb5-78fe-fcd8-b9690af22e95.png)

#### 「Connected VPC環境(10.0.0.0/16)」の確認

ルートテーブルは次のとおりです。
 「VMC環境(192.168.0.0/20)」のコンピュートゲートウェイ配下のサブネット(192.168.0.0/20)へのルートが書き込まれています。
(また今回のブログ内容と関係ありませんが、マネジメントゲートウェイ配下のサブネット(172.16.0.0/16)へのルートも書き込まれています。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/d10f1794-0e9f-3b02-e4bb-93018184652c.png)

## Network Load Balancer(NLB)のセットアップ

初期セットアップが確認できたので、「アクセス先Web Server(192.168.15.241)」をターゲットとするNLBを構築していきます。
まずElastic Load Balancer (ELB)サービスからNLBを選択し、「作成」を進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/4ae5415c-811b-c641-8a39-4feca2ed3dda.png)

インターネットには公開しないので、スキームは「内部」を選択します。
ロードバランサーのプロトコルは今回はブラウザ経由でアクセス確認したいので、TCP:80(HTTP)を選択しています。
ロードバランサーは、「Web Server's VPC環境(192.168.0.0/20)」に作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/d3e79533-3928-6450-0e98-0a8ce6974228.png)

セキュリティ設定の構成はデフォルトのままで作成を進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/481df339-ee54-53be-614c-8e9fce0b687c.png)

ターゲットの種類は「インスタンス」を選択し、TCP:80(HTTP)を選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/63383764-272c-635e-b6f2-ce097010af36.png)

ターゲットの種類が「インスタンス」「IPアドレス」によってNLBの挙動が異なりますので、ご注意ください。
>(AWS公式ドキュメントから抜粋) ターゲットグループを作成するときは、そのターゲットの種類を指定します。ターゲットの種類は、ターゲットの登録方法を決定します。たとえば、インスタンス ID、IP アドレス、または Application Load Balancer を登録できます。ターゲットをインスタンス ID で登録すると、クライアントの送信元 IP アドレスが保持され、アプリケーションに提供されます。ターゲットを IP アドレスで登録する場合、送信元 IP アドレスはロードーバランサノードのプライベート IP アドレスとなります｡ ターゲットを Application Load Balancer として登録すると、クライアントの送信元 IP アドレスが保持され、アプリケーションに提供されます。詳細については、「クライアント IP の保存」を参照してください。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/network/introduction.html#network-load-balancer-overview

ターゲットには、「アクセス先Web Server(192.168.15.241)」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/6fe348ba-bf0f-cffa-b513-476adf2144d0.png)

最後に設定内容を確認し、NLBを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/a859d1f4-ead7-ef1a-0b58-fe3d6a6d268d.png)

## AWS PrivateLinkのセットアップ
今回のメインパートであるAWS PrivateLinkのセットアップをしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/f8ad0099-c13f-5ee9-852f-dcf2b7a681df.png)

#### エンドポイントサービスの作成

前ステップで作成したNLBを、エンドポイントサービスとして設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/3327bb21-b733-ffbb-0666-c88d41ed7846.png)

インターネット上では公開しないものの、念のため「エンドポイントの承認が必要」を選択しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/1cf43ffb-e102-537c-fa82-47c262452afa.png)

エンドポイントサービスが作成されたら、「サービス名」を後続ステップのためにメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/f0c09c6c-cf8e-01ee-282a-816955b9c162.png)

#### エンドポイント(「VPC Endpoint Network Interface (10.0.3.181)」)の作成

前ステップで作成したエンドポイントサービスを指定し、エンドポイント(「VPC Endpoint Network Interface (10.0.3.181)」)を「Connected VPC環境(10.0.0.0/16)に作成します。
セキュリティグループは事前に作成したものを指定しており、「アクセス元Windows Server(192.168.15.10)」からの通信を許可しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/2c9f9583-8ae9-ca0a-dc2d-9621c3fed99d.png)

> このタイミングでいったん作成したエンドポイントサービスに戻り、「エンドポイント接続リクエストの承諾」を選択しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/71553f2a-11ff-2fba-5d56-43bddc8347a8.png)

エンドポイント(「VPC Endpoint Network Interface (10.0.3.181)」)が作成されたら、IPアドレス(10.0.3.181)を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/3409810a-ceb6-cfab-5960-7f836bb41cca.png)

> 作成したエンドポイント(「VPC Endpoint Network Interface (10.0.3.181)」)のセキュリティグループが、「VMC環境(192.168.0.0/20)」で稼働する「アクセス元Windows Server(192.168.15.10)」からのアクセスを許可していることも念のため再度確認しておきます。
(今回の構成で必要なのは最低限TCP:80(HTTP)でのインバウンドアクセスとなります。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/9a95bf13-5544-3f42-0d1e-26733ad7e1d1.png)

## (成功！) IPアドレス帯が重複している環境へのアクセス確認

 「アクセス元Windows Server(192.168.15.10)」が「VPC Endpoint Network Interface (10.0.3.181)」を経由して、「アクセス先Web Server(192.168.15.241)」にHTTP(TCP:80)アクセスできたことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/9ce4e520-705c-c231-6d86-5d6416927af9.png)

# 4. さいごに

AWS PrivateLinkを利用したVMware Cloud on AWSからIPアドレス重複している別VPC環境への接続を試してみました。

今回は基本的なHTTP(TCP:80)アクセスだけでしたが、NLBが待受けやターゲットのTCPポートを変更することでほかの構成にも応用が効くかもしれませんのでご参考いただければ幸いです。

# 5. 参考にさせていただいた文献

今回のセットアップではいつも以上に色々な文献を参考にさせていただきました。（いつも有益な情報ありがとうございます！）
おそらく日本語で同じようなユースケースを調べる場合は下記ページに行き着くと思うので、備忘録としてまとめておきます。

https://aws.amazon.com/jp/blogs/psa/aws-privatelink-saas-whi/

https://aws.amazon.com/jp/blogs/news/design-considerations-using-vpc-endpoints-for-amazon-s3-with-vmware-cloud-on-aws/

https://blog.serverworks.co.jp/network-load-balancer/config-behavior

https://dev.classmethod.jp/articles/aws-vpcendpoint-privatelink-beginner/

https://dev.classmethod.jp/articles/load-balancing-private-ec2-rds-nlb/

https://dev.classmethod.jp/articles/usecases-about-privatelink-vpc-endpoint/

# 6. 参考記事

https://qiita.com/sanjushi003/items/64c05cc9e6a634038ecf