AppMeshを知るためにAmazonの奥地へと(ry
AppMeshに入門していく
わからんポイント
- なぜAppMesh(サービスメッシュ)が必要なのか?
- AppMesh嬉しいポイント
- AppMesh辛いポイント
- いい感じのハンズオン
- バーチャルルーター
- バーチャルサービス
- バーチャルノード
- バーチャルゲートウェイ
- TLS or mTLS設定
- サーキットブレーカー
- ヘルスチェック
- スロットリング
- サービスディスカバリー
- タイムアウト
- リトライ
なぜAppMesh(サービスメッシュ)が必要なのか?
まずはサービスメッシュは本当に必要なのか、何を解決するのか | AWS Summit Tokyo 2019を正座して見る。
サービスメッシュはマイクロサービス間通信における↓みたいな課題をオフロードする目的。
AppMeshはEnvoyのコントロールプレーン([AWS Black Belt Online Seminar]AWS App Mesh Deep Dive)
(マイクロサービスの開発言語が統一されているレベルのシステムではあまりメリットを感じない。。。)
いい感じのハンズオン
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を見ることでよく理解できた。
-
ALBを使ったECSサービス間通信
-
Cloud Mapのサービスディスカバリを使ったECSサービス間通信
-
AppMeshを使ったECSサービス間通信(Virtual Routerなし)
-
AppMeshを使ったECSサービス間通信(Virtual Routerあり)
-
- ALBを使ったECSサービス間通信の通信経路
Client --> ALB(front用)--> Fargate(タスク名:howto-ecs-basics-front*)--> ALB(back用)--> Fargate(appmesh-howto-ecs-basics-color*)
- ALBを使ったECSサービス間通信の通信経路
Fargate(タスク名:howto-ecs-basics-front*)では、↓みたいな感じで環境変数COLOR_HOSTにALB(back用)のホスト名を渡している。
-
- Cloud Mapのサービスディスカバリを使ったECSサービス間通信
Client --> ALB(front用)--> Fargate(タスク名:howto-ecs-basics-front*)--> Fargate(appmesh-howto-ecs-basics*)
- Cloud Mapのサービスディスカバリを使ったECSサービス間通信
1.
の時と比べて front --> backの通信をCloudMapがよしなにやってくれている。
具体的には↓の設定が追加されている。
Cloud Map追加
↓に加えてRoute53のホストゾーンが作成される
サービス
Fargate(appmesh-howto-ecs-basics-color*)のServiceにサービス検知設定追加
color.howto-ecs-basics.pvtdns
に変更
Fargate(タスク名:howto-ecs-basics-front*)の環境変数COLOR_HOSTをCloud Mapのサービス:colorの-
- 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*)
- AppMeshを使ったECSサービス間通信(Virtual Routerなし)
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*)が登録されている。
-
- 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*)
- AppMeshを使ったECSサービス間通信(Virtual Routerあり)
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設定