VPC間でVPCエンドポイントを共有する

# はじめに
プライベートサブネットでAWSサービスに気軽に接続できるVPCエンドポイント。便利でも、維持が面倒くさい。エンドポイント自体の管理・セキュリティグループの管理、ENIの管理･･･色々管理の面倒くささもあるが、時間単位で料金がかかる（0.01USD/hなので月7.2USDも）のも何か腑に落ちない。

### 見積もり
この手法ではTransit Gatewayを使ってVPC間でVPCエンドポイントを共有する。Transit Gateway自体の値段はアタッチメントごとに0.05USD/hかかるので、2つのVPCでも、VPCエンドポイントの数が10以上ある場合はコスト優位になる。プライベートVPCにおけるFargateでは、最低4つVPCエンドポイントが必要（過去記事参照）なので、色んなサービスを閉域VPCで使い倒す場合は平気でエンドポイント数が10を超えるのではないかと思う。

>過去記事：https://qiita.com/bd8z/items/daa1d08980c0c9c65c46

## 今回やること
2つのVPC間でVPCエンドポイントを共有する。図中の番号は以降の手順の番号と同じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/5d0aaaf8-f274-a44f-8f99-59c48919ca9d.png)



## 前提
- 2つのVPCと各VPCにプライベートサブネットが存在
- VPCエンドポイントは片方のプライベートサブネットに存在
- 今回の例ではSQSへのVPCエンドポイントとする

## 手順
### Step1 VPCの準備
対象となるVPCにて「DNSホスト名が有効」であること、「DNS解決が有効」であることを確認する。この設定がないとRoute53プライベートホストゾーンがうまく働かないので注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/e9eb42b3-9a81-5e6a-fb1a-a08f7f2adc78.png)

### Step2 VPCエンドポイントを作成する
Interface型のVPCエンドポイントを作成する。DNSはRoute53により設定するため、エンドポイントの設定で「DNS 名を有効」を**設定しない**。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/75aeaec5-65c5-6716-045b-92b8a7b583cf.png)


### Step3 TransitGatewayを作成する
各種設定はマネコンデフォルトのままで問題ない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/004d5157-69a5-6b10-d9fc-0e0b7b2ab714.png)

### Step4 TransitGatewayアタッチメントを作成する
設定するVPCのサブネットごとにTrangit Gateawayを紐づけるため、VPCごとにアタッチメントを作成する。「アプライアンスモードサポート」を有効にしておくと、後のルートテーブルの設定で手順が減る。アタッチメントモードはVPC間の接続なので「VPC」でよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/fda7a30a-0726-28ba-a043-4ccbed0d2e01.png)

作成後のようす：VPCごとにアタッチメントがある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/f0ee27bf-9a74-65e7-e839-20e2579faaca.png)

### Step5 TransitGatewayルートテーブルを作成する
作成したTrangit Gateawayルートテーブルを見ると、各VPCへのルートテーブルが作成されている。NATゲートウェイなどを共有する場合は、`0.0.0.0/0`ヘのルートの設定が必要になるが、今回の場合では、ルートが正しく設定されていれば特に作業はない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/bdea8be5-09b0-b77c-f1ae-3563451e86e7.png)

### Step6 VPCとサブネットのルートテーブルを編集
Transit GatewayのルートテーブルはTrangit Gateawayの中でのルートテーブルでしかない。各VPCの通信がお互いのVPCのCIDR範囲に向くように、Trangit Gateawayをターゲットにルートテーブルを設定する。ここでサブネットの関連付けを行っておくと、サブネットにてVPCと別にルートテーブルを設定する作業が必要がなくなるので、関連付けておくと良い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/f0ec8dd3-7d4e-c0aa-e43d-bcc1e9ba7543.png)

### Step7 Route53にてプライベートホストゾーンを作成
作成したDNSエンドポイント名を確認し、DNSエンドポイント名に応じたドメイン名でプライベートホストゾーンを作成する。

参考：VCPエンドポイントの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/b1f9db87-bc4f-e725-8ab7-dbab08cd2b46.png)


- エンドポイントのDNS名：`vpce-0e70fb14223b3f28d-hxl4u56c.sqs.ap-northeast-1.vpce.amazonaws.com`
- **設定するドメイン名**：`sqs.ap-northeast-1.amazonaws.com`
※`vpce.`部分は必要ない。エンドポイントからコピペする時注意。

ホストゾーンには対象のVPCに関連付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/ce32f14a-d478-e3be-f615-0172a41010f5.png)



Aレコードを作成する。エイリアスを選ぶとVPCエンドポイントを選択できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/7cecb737-36fc-7797-89d0-700dd7ca2538.png)


### 最後の確認
ここまでの手順でVPCエンドポイントの共有が終わっているはずなので、EC2からエンドポイントの名前解決ができるか、AWS CLIコマンドが通るか確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54100/b3bd44d1-803c-737f-8538-5121382dd6ae.png)
無事名前解決とAWS CLIコマンドが通っている。OK！

## 最後に
VPCエンドポイントの名前を明示的に指定する必要があるサービスといえば、プライベートAPIぐらいか。作った関数、アプリなどそのまま使えるのは非常にうれしいが、Trangit Gateawayは通信が無料なVPCピアリングと比べてしまうと割高に感じる。でも企業アカウントなどVPCを多く運用するようなパターンにおいては有用かな･･･。