VPC Latticeってどんなサービス？

### はじめに
今回はVPC Latticeについて調べた内容をまとめます。


## VPC Latticeとは
VPC Latticeは、サービス間の通信を一貫して接続、監視、保護するアプリケーションレイヤーサービスです。

公式ドキュメントには以下のように記載されているように、アプリケーション間の通信をターゲットにしたサービスとなります。
> 最新のアプリケーションは、マイクロサービスと呼ばれることが多い、複数の小規模でモジュール化されたサービスで構成されます。近代化には利点がありますが、レガシーサービスに関連するネットワーキングが複雑になり、課題が生じる可能性もあります。これは多くの場合、これらのアプリケーションを構築する開発者がさまざまなコンピューティングニーズを持つさまざまなチームに分散しているためです。その結果、複数のアカウント、VPC、あるいはその両方にまたがってマイクロサービスを構築してデプロイします。
Amazon VPC Lattice は、マイクロサービスとレガシーサービスを論理的な境界内で相互接続するのに役立ち、より効率的に検出して管理できます

サポートされているプロトコルは現在（2023年5月30日）以下の3つとなります。
* HTTP
* HTTPS
* gRPC


VPC Latticeは、異なるVPC、異なるAWSアカウントをまたがって設定可能です。
そのため、異なるVPC及びAWSアカウントにまたがるサービス間のネットワーク接続と、アプリケーションレイヤーのルーティングを自動的に管理することができます。



## コンポーネント
VPC Latticeのコンポーネントについて紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/498dcde0-d339-b580-0542-d68e12892586.png)

### サービスネットワーク
* サービスとVPCを関連付けるためのコンポーネント
* サービスネットワークに関連付けられたVPCは、そのサービスネットワークに関連付けられているサービスにリクエストを送信することができます。

### サービス
* クライアントアプリケーションからのリクエストを認証・承認し、ターゲットにルーティングします。
* ほとんどALBのようなもので、以下の項目を設定できます。
    * リスナー：1つまたは複数のリスナーを任意のポート番号とプロトコルで構成
    * ルール：複数のターゲットグループに対して、パスベースルーティングやウェイトルーティングを構成
    * ドメイン：クライアントアプリケーションが送信先に指定するドメイン。カスタムドメインの設定も可能
    * サービスアクセス：クライアントアプリケーションをIAMおよび認証ポリシーで認証する。（※省略可能）

### ターゲットグループ
* サービスのルーティングで設定された、宛先となるアプリケーションインスタンスや、その前段のALB等
* 指定可能なものは以下となります。
    * EC2インスタンス
    * IPアドレス
    * Lambda関数
    * Kubernetes Pod（Gateway Controller for Kubernetes経由で指定可能）

公式ドキュメントでは、各コンポーネントについて、以下のように図示されています。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/20ed3e1b-5813-23b1-a22f-67b778b1f78d.png)


### 構成
全体構成としては、このようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/517c66cf-50c0-b51e-b6bf-1a6203e78b11.png)

ポイント
* VPCをサービスネットワークに関連付けると、ルートテーブルに、サービスネットワーク向けのルートが自動で設定されます
* ターゲットグループがあるVPCはサービスネットワークとは関連付けしません
* サービスネットワーク、ターゲットグループどちらのセキュリティグループでも許可をしないと、関連付けられたVPCから接続できません
* クライアントのリクエスト送信先は、サービスのドメインとなります
* サービスにて設定したリスナールールに従い、ターゲットグループにリクエストをルーティングします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/957c8a93-9602-5b6e-2e2c-f7bef647f5e5.png)

## VPC Latticeの注意点

* Private Linkとの違い
    * Private Link：サブネット内に Elastic Network Interface を配置することで機能し、クライアントはネットワークトラフィックを宛先サービスにトンネリングするためにヒットさせます
    * VPC Lattice：サービスネットワーク内のエンドポイントをリンクローカルアドレスとして公開することで機能します
→ 送信元VPCと宛先VPCのCIDRが重複していても通信が可能

* 管理/運用通信をターゲットにしたサービスではない
    * VPC Latticeはアプリケーション間の通信をサポートするサービスのため、踏み台サーバから各サーバへのSSH/RDPログインや、監視サーバからの監視通信などを目的に利用するサービスではありません。


## VPC Latticeのユースケース
公式ドキュメントでは以下のユースケースが示されています。
> ・サービスを大規模に接続する
ネットワーク構成はシンプルなままに、VPCやアカウント全体で数千のサービスが接続可能です。

インフラをあまり気にせずにVPCやアカウントを接続できるのは便利ですね。

> ・きめ細かいアクセス許可を適用する
サービス間のセキュリティを強化し、一元化されたアクセスコントロール、認証、およびコンテキスト固有の承認により、ゼロトラストアーキテクチャをサポートします。

サービスネットワークとサービスにそれぞれ、IAMまたは認証ポリシーによる認証を行うことができます。

>・高度なトラフィックコントロールを実装する 
リクエストレベルのルーティングや、ブルー/グリーンおよび canary デプロイ向けの重み付けされたターゲットなど、きめ細かなトラフィックコントロールを適用します。

サービスの設定における、ルールにて細かいトラフィックコントロールを実現できます。

> ・サービス間のインタラクションを観察する
リクエストタイプ、トラフィック量、エラー、応答時間などについて、サービス間の通信をモニタリングおよびトラブルシューティングします。

モニタリング設定において、VPC Lattice Service に対するすべてのリクエストと、レスポンスのアクセスログを取得できます。


# おわりに

今回は、以下の記事を参考に調査しました。

https://dev.classmethod.jp/articles/amazon-vpc-lattice/

https://qiita.com/minorun365/items/7f73aa1fe1ef2ca0c2c7

https://blog.serverworks.co.jp/vpc-lattice/summary