Open7

AppMeshを知るためにAmazonの奥地へと(ry

Yuki TsumitaYuki Tsumita

AppMeshに入門していく

わからんポイント

  • なぜAppMesh(サービスメッシュ)が必要なのか?
  • AppMesh嬉しいポイント
  • AppMesh辛いポイント
  • いい感じのハンズオン
  • バーチャルルーター
  • バーチャルサービス
  • バーチャルノード
  • バーチャルゲートウェイ
  • TLS or mTLS設定
  • サーキットブレーカー
  • ヘルスチェック
  • スロットリング
  • サービスディスカバリー
  • タイムアウト
  • リトライ
Yuki TsumitaYuki Tsumita

なぜAppMesh(サービスメッシュ)が必要なのか?

まずはサービスメッシュは本当に必要なのか、何を解決するのか | AWS Summit Tokyo 2019を正座して見る。

サービスメッシュはマイクロサービス間通信における↓みたいな課題をオフロードする目的。

AppMeshはEnvoyのコントロールプレーン([AWS Black Belt Online Seminar]AWS App Mesh Deep Dive

(マイクロサービスの開発言語が統一されているレベルのシステムではあまりメリットを感じない。。。)

Yuki TsumitaYuki Tsumita

いい感じのハンズオン

aws/aws-app-mesh-examplesに全てが載っている。
M1macなど、x86以外のCPU搭載PCでハンズオンする際にはexport DOCKER_DEFAULT_PLATFORM=linux/amd64を実行して明示的にプラットフォーム指定必要。
指定しない場合↓みたいなエラーが出る。

 => ERROR [builder  7/10] RUN go env -w GOPROXY=https://proxy.golang.org                                                                                                  0.1s 
------                                                                                                                                                                         
 > [builder  7/10] RUN go env -w GOPROXY=https://proxy.golang.org:                                                                                                             
#12 0.131 qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory
------
executor failed running [/bin/sh -c go env -w GOPROXY=${GO_PROXY}]: exit code: 255

特にhowto-ecs-basicsは↓の流れでECSのサービス間通信を変化させながら解説してくれるので神
ハンズオンする時にはClouf FormationのDiffを見ることでよく理解できた。

  1. ALBを使ったECSサービス間通信

  2. Cloud Mapのサービスディスカバリを使ったECSサービス間通信

  1. AppMeshを使ったECSサービス間通信(Virtual Routerなし)

  2. AppMeshを使ったECSサービス間通信(Virtual Routerあり)

Yuki TsumitaYuki Tsumita
    1. ALBを使ったECSサービス間通信の通信経路
      Client --> ALB(front用)--> Fargate(タスク名:howto-ecs-basics-front*)--> ALB(back用)--> Fargate(appmesh-howto-ecs-basics-color*)

Fargate(タスク名:howto-ecs-basics-front*)では、↓みたいな感じで環境変数COLOR_HOSTにALB(back用)のホスト名を渡している。

Yuki TsumitaYuki Tsumita
    1. Cloud Mapのサービスディスカバリを使ったECSサービス間通信
      Client --> ALB(front用)--> Fargate(タスク名:howto-ecs-basics-front*)--> Fargate(appmesh-howto-ecs-basics*)

1.の時と比べて front --> backの通信をCloudMapがよしなにやってくれている。
具体的には↓の設定が追加されている。

Cloud Map追加

↓に加えてRoute53のホストゾーンが作成される

サービス

Fargate(appmesh-howto-ecs-basics-color*)のServiceにサービス検知設定追加

Fargate(タスク名:howto-ecs-basics-front*)の環境変数COLOR_HOSTをCloud Mapのサービス:colorのcolor.howto-ecs-basics.pvtdnsに変更

Yuki TsumitaYuki Tsumita
    1. AppMeshを使ったECSサービス間通信(Virtual Routerなし)
      Client --> ALB(front用)--> Fargate(タスク名:howto-ecs-basics-front*)--> App Mesh(Virtual Service) --> App Mesh(Virtual Node) --> Cloud Map(color.howto-ecs-basics.pvtdns)--> Fargate(appmesh-howto-ecs-basics*)

Fargate(タスク名:howto-ecs-basics-front*)タスク定義

Fargate(タスク名:howto-ecs-basics-front*)にappmesh(Envoy)コンテナ追加

Fargate(タスク名:howto-ecs-basics-front*)の環境変数COLOR_HOSTをApp Mesh Virtual Serviceのcolor.howto-ecs-basics.mesh.local:8080に変更

App Mesh(howto-ecs-basics)

App MeshにVirtual Service追加。Virtual ServiceにVirtual Node(howto-ecs-basics-color-node)を追加

Virtual ServiceにはVirtual Router or Virtual Nodeが紐付け可能。

Virtual Nodeに紐づいているcolorアプリはCloud Mapによるサービスディスカバリが行われている。

Cloud Mapには↓みたいな感じでFargate(appmesh-howto-ecs-basics*)が登録されている。

Yuki TsumitaYuki Tsumita
    1. AppMeshを使ったECSサービス間通信(Virtual Routerあり)
      Client --> ALB(front用)--> Fargate(タスク名:howto-ecs-basics-front*)--> App Mesh(Virtual Service) --> App Mesh(Virtual Router) --> App Mesh(Virtual Node) --> Cloud Map(color.howto-ecs-basics.pvtdns)--> Fargate(appmesh-howto-ecs-basics-color*)

Fargate(タスク名:howto-ecs-basics-front*)は変更なし。
App MeshがEnvoyのコントロールプレーンなので、App Mesh側の設定を変更 + color V2のFargateを追加している。

CloudFormationの差分を見ると、Virtual Serviceのプロバイダ(Virtual Serviceトラフィックの送信先)をVirtual Node --> Virtual Routerに変更している。
それに伴い、Virtual Router作成およびRoute追加(color, color V2に半分ずつ振り分け)されている。

Virtual RouterのRoute設定