AWS App Mesh

AWS App Meshについて概要をまとめて講義する場があったので、
簡単にAWS Black Beltを参考にまとめました。

AWS App Meshのリリース日:2019/3/27

1. 目次

2. サービスメッシュとは

アプリケーションレベルの通信を、アプリケーション自身が制御するのではなくて、インフラストラクチャーで制御できるようにする技術

2.1. サービスメッシュがない場合

2.2. サービスメッシュがある場合

サービスメッシュ基盤 = AWS App Mesh

2.3. サービスメッシュが必要となった背景

  • 1つのシステム内の各サービスで、いろんな言語(Java, Go, Ruby)やアーキテクチャ(コンテナ, VM)を使うようになってきた。
  • サービス間のネットワークが信頼できない。
    • ネットワーク遅延
    • 帯域幅が狭くなっているかもしれない。
    • セキュアではないかもしれない。
    • ネットワーク先のアプリケーションが障害中かもしれない。

すべてをアプリで実装するとなると、、、

  • 上記のようなネットワークの信頼性を高めるには、以下が必要。
    • 通信エラー時のリトライ処理
    • 遅延時のタイムアウト処理
    • 暗号化処理
  • 通信の可観測性を考えると、以下が必要。
    • メトリクスの取得
      • 通信の状況が時間でどう変化してきたか
    • トレース
      • ある時間帯の通信がどのようになっていたか
    • ログの収集
      • 通信に関する詳細な情報(アクセスログなど)

通信の可観測性 :
どのサービスに問題があるのかを一目瞭然にするため。どのチームのサービスに問題があったのかってすぐに分かるほうがいいですよね。

2.4. 解決策

  • 共通機能チームが、ネットワークの信頼性/通信の可観測性のための共通ライブラリを作成しても良いが、以下の問題が発生するんです。

    • VMだと動かない/コンテナだと動かない
    • 共通ライブラリを入れると、依存関係が衝突してしまう
    • 〜環境だと動かない
    • 共通機能チームが、多言語(java, Go, Ruby)を習得する必要がある。
    • 言語ごと、チームごとに配布方法を考える必要がある。
  • 通信の処理を、別プロセスに切り離す

    • Proxy : サービス間の通信をプロキシして、通信制御を行うプロセス
    • プロキシには以下の機能が必要。(Envoyを使うとこれらができる。)
      • 信頼性
        • リトライ
        • タイムアウト
        • 暗号化処理
      • 可観測性
        • メトリクスやトレース、ログの出力
    • サービスメッシュの仕組みは以下。
      • ピンクのところにEnvoyが使える。

3. AWS App Meshとはどのようなサービスか

3.1. 概要

App Meshは、簡単な設定でEnvoy Proxyを作ってくれるマネージドサービス。

3.1.1. 設定方法

3.1.2. ネットワークモデルとは

3.1.3. Envoyプロキシの生成

4. AWS App Meshの使いどころや具体的な機能

4.1. AWS App Meshが使えるインフラ

  • Amazon ECS
  • Amazon EC2
  • Amazon Fargate
  • Kubernetes on EC2
  • Amazon EKS

4.2. App Meshのセキュリティ面

4.3. App Meshの機能面

一言で言うと、高機能なL7LBです。

4.4. 利用性

通信の可観測性を担保するために、

  • メトリクス
    • Amazon CloudWatch
    • 異常やアラームが発生したことを把握する。
  • トレース
    • Amazon X-Ray
    • アラームが発生したとき、どのような通信状況だったか把握する。
  • ログ
    • Amazon CloudWatch Logs
    • トレースで特定したコンポーネントの処理を確認する。

CW: Cloud Watch Agent
X-Ray: X-Ray デーモン

4.5. 利用料金

  • App Meshの利用による追加料金はない
  • Envoy Proxyを稼働するためのリソースに対して料金が発生
  • AWS X-Ray, Amazon CloudWatch Logsなど連携先のサービスの料金が発生

5. まとめ

6. リファレンス