複数アカウントのエンドポイントを１つに集約してコスト削減したい

## :wrench:課題
AWSを使うにあたって、コスト削減は永遠の課題です。
現在のプロジェクトでエンドポイントの料金が高すぎて非常に困っていました。
しかも複数アカウントを使っての開発のためさらに料金がかさみます。
この状況を打開すべくエンドポイントの集約を行いました:bangbang:

## やること
最初に全体の流れを説明します。
ここでは便宜的に、エンドポイントの存在するVPCを「EP-VPC」・エンドポイントを利用したいVPCを「Target-VPC」と記載します。


① EP-VPCに利用したいエンドポイントを作成
② EP-VPCとTarget-VPCをピアリング接続(TransitGatewayでも可能ですが、今回はピアリングで行います)
③ 各VPCのルートテーブルにピアリング先との通信を許可
④ エンドポイントのセキュリティグループにてTarget-VPCからのインバウントを許可
⑤ EP-VPCにプライベートホストゾーンを作成
⑥ エンドポイントのDNSを指すAレコードを作成
⑦ プライベートホストゾーンをTarget-VPCに関連付けを行う

![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/be5e9ab4-0a0d-ff74-c264-022331d7b9a4.png)


手順はこのようなかんじです。
では順にやっていきます！:fist:

### 1.EP-VPCに利用したいエンドポイントを作成する
今回はX-Ray用のエンドポイントを作っていきます。
![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/1cb28cf9-644a-38aa-0f8d-ce0f1b31a92b.png)

:warning: 注意点としては、追加設定タブ内の「DNS名の有効化」のチェックを外すようにしてください。
ここが有効になっていると、AWS側で自動的にプライベートホストゾーンをVPCに関連付けるようで、手順5が実施できなくなります。
![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/99b4ac1c-3437-d07f-9a12-91c08d9ba492.png)


後は任意のVPC・サブネット・セキュリティグループを指定すればOKです

### 2.EP-VPCとTarget-VPCをピアリング接続する
次にVPCをピアリング接続します。
リクエスタとアクセプタがありますが、どっちのVPCでも構いません。とにかく２つのVPCが繋がればOKです！
![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/1ec7cd38-cbb0-a28a-4fd9-b57bbe15b782.png)


作成後、アクセプタ側で「リクエストの承諾」をお忘れなく・・・

### 3.各VPCのルートテーブルにピアリング先との通信を許可
ここでは、エンドポイントへの通信がちゃんとルーティングされるようにルートテーブルを設定します。
例えば、各VPCのCidrが以下の場合
- `EP-VPC：10.0.0.0/16`
- `Target-VPC：172.16.0.0/16`

**EP-VPC側**
![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/42e7401a-a227-33df-28e6-34962acd08c3.png)


**Target-VPC側**
![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/e4aecf97-74da-793d-2faf-a6a9a7263744.png)


このようにお互いのCidr範囲を指定してあげます。

### 4.エンドポイントのセキュリティグループにてTarget-VPCからのインバウントを許可
手順1でエンドポイントに設定したセキュリティグループに、Target-VPCからの通信を許可するインバウントルールを追加してあげます。
さっきと同様で、Target-VPCのCidrが「172.16.0.0/16」の場合こうなります。
![image-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/b4b16fa4-e9f7-fdeb-222e-01444c64e7e7.png)


### 5.EP-VPCにプライベートホストゾーンを作成する
ここでは、エンドポイントに名前解決されるようプライベートホストゾーンを作っていきます。
`X-Ray`・`東京リージョン`の場合だと以下のようになります。
ドメイン名：xray.ap-northeast-1.amazonaws.com
![image-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/8557ef5c-9df0-6ca2-5400-0f864cc1af75.png)


※別サービス・別リージョンの場合はこちらを参考に
>サービスエンドポイントとクォータ
https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-service-information.html


### 6.エンドポイントのDNSを指すAレコードを作成する
続いてAレコードを作成します。
VPCエンドポイントへのエイリアスを選択してxrayで検索すると複数ヒットします。
これは、VPC・サブネット単位でエイリアスが作成されているためです。
AZ名の含まれていない方を選択すればOKです。
![image-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/4d82730b-4f8c-00e1-7791-22fa3cfd80d9.png)


### 7.プライベートホストゾーンをTarget-VPCに関連付けを行う
最後にプライベートホストゾーンの関連付けを行います。
手順6までで、EP-VPC内のエンドポイントに名前解決される状態になっているため、このホストゾーンを関連付けることでエンドポイントを使用できるようになります。
同一アカウントであれば、マネジメントコンソールでホストゾーンの編集画面でVPCを追加するだけでOKです。
別アカウントの場合CLIで行う必要があります。

**EP-VPC所有アカウント側**
```
aws route53 create-vpc-association-authorization --hosted-zone-id { 手順5で作成したホストゾーンID } --vpc VPCRegion=ap-northeast-1,VPCId={ TargetVPCのID }
```

**Target-VPC所有アカウント側**
```
aws route53 associate-vpc-with-hosted-zone --hosted-zone-id { 手順5で作成したホストゾーンID } --vpc VPCRegion=ap-northeast-1,VPCId={ Target-VPCのID }
```

### :bell:補足
ピアリングorTransitGatewayで繋がっている必要があるのでCidrが重複しないよう注意が必要です。

## :page_with_curl:まとめ
この方法を使えば１つのエンドポイントで複数アカウントのリソース達がサービスを使えるようになります。
この方法を実践して、CostExplorerでVPCの料金が半分近くになっているのを見た時は感動ものでした:joy:
エンドポイントのコストで困っている人の手助けになれば嬉しいです！