fbpx

AWS App MeshとIstioの比較

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

サービスメッシュとは

なんのために?なにを解決する?:

サービスメッシュは、大規模な組織でのマイクロサービスの適用によって顕在する開発・運用上の問題に対処するためのツールです:

  • オブザーバビリティ: システム全体がネットワークをまたいでしまい複雑になり開発時のトラブルシューティング・運用時の障害解決までの時間が増加する問題
  • 障害分離: 分散ネットワークでのベストプラクティスであるリトライやタイムアウト等の実装が必要な問題
  • セキュリティ: ネットワーク通信増加によるセキュリティリスクの増加。アプリケーション間の通信のアクセス管理の問題。

この3領域の問題に対処するために導入・利用されます。

ネットワーク通信に関わる問題への対処をアプリケーションから切り離してインフラ層で実装するため、プロダクト開発者はよりプロダクト開発に集中でき、またシステム全体で一貫性のある実装・設定を維持しやすいため運用の効率化が図れます。

概要動画としてはAWS Japan原さんの https://www.youtube.com/watch?v=ZwfdLAClzsc がおすすめです。

サービスメッシュのOSS実装としてはIstio等があります。

サービスメッシュの概念図

サービスメッシュ概念図

プロキシー(Proxy)がアプリケーションから出入りする通信を管理し、プロキシー群をコントロールプレーン(Control Plane)と呼ばれる中央の管理サーバーが管理します。

App Meshとは

App MeshとはAWSが提供するサービスメッシュのマネージドサービスです。マネージドな部分は、上述のコントロールプレーンという「プロキシー群を管理する中央のサーバー」の部分です。プロキシーにはEnvoyを利用することを想定されています。

端的には「Envoy群を動かすためのコントロールプレーンを提供してくれるマネージドサービス」です。Istioで例えると「Istioのコントロールプレーンを自分でデプロイせずにAWSが提供してくれている」に近い状態です(App MeshはIstioではないし、Istio互換でもないです、念の為)。EKS以外の場合(ECSやEC2の場合)は、プロキシーであるEnvoyをデプロイする部分はほぼユーザーの責務になっている点を理解するとApp Meshのドキュメントを読み進めて行きやすいかもしれません。

App Meshを導入していない次の構成のシステムがあると仮定します。

AppMesh導入前構成図

https://www.appmeshworkshop.com/introduction/how_it_works/ より

App Meshを導入する場合には、

  1. 各サービス(アプリケーション)でサイドカーとして、EnvoyプロキシーをApp Meshが求める適切な設定で実行します。具体的には、ECS、EC2の場合ではユーザーがタスク定義やVMイメージを変更する必要があります。EKSの場合はKubernetesの機能を利用した自動挿入の仕組みがあります。
  2. AWS CLI等を利用してApp Mesh内の設定リソースを作成・更新します。App Mesh内の設定リソースとしてMesh、Virtual NodeやVirtual Router等があります。各リソースについてはApp Meshのドキュメントへ。
  3. 上2つを完了すると、各サービスで実行しているEnvoyがApp Meshのコントロールプレーンと通信し自身を適切に設定することで、サービスへ出入りする通信を管理できるようになります。

AppMesh導入後構成図

https://www.appmeshworkshop.com/introduction/how_it_works/ より

App Meshで実現できること

オブザーバビリティ

ロギング

Envoy標準のアクセスログを出力できます。おおよそApacheとかnginxのアクセスログに近い情報を取得できるイメージです。アクセスログ自体は非構造化データなので、標準出力に吐いて、awslog driverでAWSのCloudwatch Logsに飛ばす等して保存・活用します。

メトリクス

こちらもEnvoy標準のメトリクス機能を利用して、構造化されたデータを取得・保存できます。例えば、HTTP 2xx/5xxの数やTCPコネクションエラーの回数等です。AWSのCloudWatchにApp Mesh用の機能が追加されていて、そこに飛ばす選択肢が1つあります。他の選択肢としては自前のPrometheusサーバーに飛ばすことがあります。さらに他の選択肢としてDatadogに飛ばすこともできます。

トレーシング

AWSはX-Rayという分散トレーシングサービスを提供しています。そして、AWSが提供するEnvoyのコンテナイメージにはこのX-Ray用のEnvoy拡張が組み込まれていて、各サービスで実行されるEnvoyからX-Rayへトレーシングデータを送信できるようになっています。

https://docs.aws.amazon.com/app-mesh/latest/userguide/observability.html

障害分離

Envoyが提供する障害分離関連の機能はほぼ(おそらく全て)利用できます。

2020年7月以降に作成されたApp Meshの “Mesh” では、さらにこの障害分離関連機能のデフォルト値が設定されるようになりました。つまりApp Meshを利用すると「デフォルトで障害分離機能が有効になる」状態になりました。ちなみにEnvoyはデフォルトだと障害分離関連機能は有効にならないです(勝手にリトライとかが走ると困るケースも多いので)。

https://docs.aws.amazon.com/app-mesh/latest/userguide/envoy-defaults.html

セキュリティ

サーバーサイドTLS関連の機能は充実していますが、クライアントサイドTLSの機能がマネージドではないので、Istioだと自動でできるmTLS関連の機能がApp Meshだと自動では現在できないです。

https://docs.aws.amazon.com/app-mesh/latest/userguide/security.html

App MeshとIstioの比較

ECS環境での利用

App Meshは利用できます。Istioはそのままでは使えない(はず)です。

トラフィックルーティング

IstioとApp Meshは(ほぼ)同じ機能セットが使えます。

障害分離(タイムアウト、リトライ、サーキットブレーカー)

IstioとApp Meshは同じ機能セットが使える。

Ingress

istio-ingress-gateway相当のことは、App MeshのVirtual Gateway機能を利用することで実現可能です。

セキュリティ機能

外部からの通信(Ingress)のTLS終端

これはIstioと同じことがApp Meshでもできます。App Meshの場合は、AWSが提供する証明書管理のマネージドサービスであるCertificate Managerで証明書を発行して使用する連携機能が用意されています。自前で管理している証明書を使うことも可能です。

mTLS

Istioは自動で証明書を発行・管理して、クラスタ内部の通信をmTLS化できますが、App Meshのみでは自動で証明書を発行・管理し内部の通信をmTLS化することはできなさそうです。他の仕組みで証明書を発行・管理し、ファイルシステム経由やEnvoyのSecret Discovery Service経由で証明書を各プロキシーに配布することでmTLSを実現することはできます。

AWS Certificate Manager Private Certificate Authority (ACM PCA)というAWSが提供するプライベートCA運用のマネージドサービスが用意されていて、そこで手動で証明書を発行・管理して、それをApp Meshの各Envoyに紐つけることが可能です。ただし紐付けはサーバー側(Listenする側)のみで、クライアント側(HTTPリクエストを送信する側)への紐付けはできなさそうです。

またSPIFFEの実装であるSPIREを用意して使うことも可能です。

接続元サービス(クライアント)の認証認可

IstioはPeer Authenticationというリソースで「各サービス同士が通信できるか」のポリシーを設定できるが、そのような機能はApp Meshにはなさそうです。

SAN (Subject Alternative Name)ベースの認証を利用して同様の認可機能を実現できますが、証明書を作成してSANを各サービスに割り振ったりする管理の手間があります。

オブザーバビリティ関連の機能

メトリクス

Istioと同程度の機能があります。App Meshはメトリクスの保存先として、Prometheus、CloudWatch、またはDatadogが選べます。

分散トレーシング

Istioと同程度の機能があります。AWSではX-Rayという分散トレーシングシステムのマネージドサービスが提供されています。

ロギング

Istioと同程度の機能があります。同じようにアクセスログが取得できる。

まとめ

(2021年8月現在) App Meshは主要な機能についてIstioとほとんど同じ機能セットはありますが、主要な機能の中でmTLS周りの機能が一歩足りてないと思われます。ですので、EKS環境ならIstioの検討から始めるほうがよさそうです。ECS環境やEKS/ECS/EC2ハイブリッド環境であれば、マネージドかつAWSの他製品との連携が取れる利点が活きるApp Meshの利用の検討から始めるのが良さそうです。App Meshはリリース当時と比較して現在様々な機能が追加されていますので、今後も機能拡張が期待できそうです。

新規CTA