「App Mesh」「Cloud Map」備忘録

# はじめに

AppMesh、CloudMapをよく聞きますがあまり実態を理解していなかったので簡単にまとめました。何かの参考になれば幸いです。



# サービスディスカバリとは？
- マイクロサービスアーキテクチャにおけるサービスディスカバリとは、「宛先マイクロサービスを検出し、送信元マイクロサービスが宛先と通信できるようにする」
- ※サービスディスカバリ = SD

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223559/f21e51be-46c8-3b3d-c606-87d440aa9972.png)

- 実装例
    - ELB利用
    - ECSのサービスディスカバリを利用
    - CloudMapを利用
    - AppMeshのサービスメッシュのサービスディスカバリ


# AWSにおけるサービスディスカバリサービス「Cloud Map」

- 概要
    - クラウドリソースに任意の名前をつけて、簡単かつ迅速にみつけるための仕組み
    - 多種多様なインフラを前提に構成されるマイクロサービスにおいて、それぞれのサービス間連携を簡単にする仕組みとして誕生したのが「AWS Cloud Map」
    - 例えばロードバランサーを作成した時はそのDNS名がAWSから払い出され、そのDNS名を利用してアクセス。これが、Cloud Mapを利用すると、IPアドレスがないAWSリソース（LambdaとかSQSとか）へのアクセスも管理できる
- 問い合わせ方式は2種類ある
    - DNSクエリ
        - IPアドレスでアクセスできるリソースに対して付与
    - APIコール
        - AWSのARN（Amazon Resource Name）などでアクセスするリソースに対して付与
- 用語
    - 名前空間
    - サービス
    - サービスインスタンス


https://dev.classmethod.jp/articles/cloud-map-perfect/



# サービスメッシュとは？

- 概要
    - サービス間通信の`信頼性`とか`可観測性`を確保する一貫性のある手段の一つ
    - マイクロサービスアーキテクチャの中で複数のマイクロサービス間の通信をインフラストラクチャ側で制御するための技術
    - アプリケーションから通信処理を分離する方法
        - HTTP通信のリトライやタイムアウト
        - 通信のトレーシングやログ、メトリクスの取得
        - TLSを使用した暗号化通信
    - プロキシコンテナと言われるもので、マイクロサービス間の通信を制御するのに特化したプロキシ
- 機能
    - `コントロールプレーン`：サービスメッシュの管理を担当し、サービスディスカバリなどの管理に必要な情報を保管したり、構成変更などの管理の命令を発行したりする
    - `データプレーン`：コントロールプレーンからの指示を受けてサービスの通信をコントロールしたり、管理に必要な情報をコントロールプレーンに送信したりする
- 有名なソフトウェア
    - Istio
        - Istioは、Google、IBM、Lyftの3社によって開発され、2017年5月に最初のパブリックリリースであるバージョン0.1が公開されました。現在も、オープンソースプロジェクトとして開発が進められています
        - Istioでは、コントロールプレーンとしてistiodが、データプレーンとしてEnvoyが稼働
        - コントロールプレーンのistiodは、大きくPilot、Citadel、Galleyの3つから構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223559/8a8e15cc-6355-65b8-0641-e4a5c793710b.png)

- 有名なプロキシに、envoy というオープンソースのソフトウェアがあります

https://dev.classmethod.jp/articles/servicemesh/

# App Meshとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223559/6e4da12c-8c3a-9b84-1a03-1a50bad25b00.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223559/89ed2285-ca77-e98d-625b-d00bde134ffa.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223559/6f747dd9-211b-0ae5-8ca9-f1aa657f329f.png)

- Mesh
    - サービス間の通信制御を行う論理的な境界
    - Meshの中にVirtual NodeやVirtual Serviceを組み合わせてネットワークモデルを構築
- Vitual Node
    - 実際のアプリケーションへの論理的なポインタ
        - (例)ECSサービス、k8sデプロイメント
    - Envoyの実行時パラメータ(環境変数など)でVirtual Node名を設定し、アプリ(Envoy)とVirtual Nodeを関連付ける
- Virtual Service
    - アプリケーションの通信先を表す
    - リクエストはVirtuak Routerまたは、Virtual Nodeにルーティングされ、実際のアプリケーションに通達される
- Virtual Router
    - リクエストのルーティングを管理するLB
    - 単一または複数のVirtual Nodeにルーティングされる

# AWSの監視サービス群

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223559/4ccf8939-e9a3-bb4a-9c51-883139191f8a.png)



# 終わりに

マイクロサービスでシステムアーキを組むのであれば必要になってくる技術だと感じましたが、マイクロサービスに触れる機会があるのか。そもそもマイクロサービスはテストが大変やらなんやら導入の障壁が高いイメージですが今後どうなるのかウォッチはしていきたいです。

# 参考資料

https://hiroki-hasegawa.hatenablog.jp/entry/2022/12/25/060000

https://dev.classmethod.jp/articles/ecs-service-discovery/

https://pages.awscloud.com/rs/112-TZM-766/images/202111_AWS_Black_Belt_Containers265_servicemesh.pdf

https://pages.awscloud.com/rs/112-TZM-766/images/202107_AWS_Black_Belt_Containers261-CloudMap.pdf