🎶

なるほど!AWS App Meshはこのように動くのか!

2023/07/25に公開

なるほど!AWS App Meshはこのように動くのか!


App Meshについては、本日時点で私が確認したサイトの中には題材として扱っているのはありましたが、レベルが高過ぎて何言ってるのわからない。
テックハードル高くない?!と素直に思ったのでチャレンジしてみました。

アプリケーションが作れないと最終的には仕事や作品にはなりませんが、今回の記事でこのサービスのハードルが下がるといいなを込めて記事にしていきます。

本記事では、AWS App Meshの公式sampleを利用して、非公式初心者チュートリアルとして紹介します。ぜひ参考にしてください。

対象はこれ!!

はじめに


今回の内容をいつも通りMermaidで記載します。

結論文

結論このページに書いているやつで確認できます!

※これ探すの結構大変でしたよ。
公式ページをよく見ている方はすぐ見つかったのだろうか、、、、中身とかは後で何とか理解するのでまず動くものが欲しいをかなえてくれるやつです。

https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-ecs-basics
https://docs.aws.amazon.com/ja_jp/app-mesh/latest/userguide/examples.html

※これを知ってから検索するとBlackbeltのGetting startedとかのページでURL紹介されていましたので、紹介だけしときます。
https://pages.awscloud.com/rs/112-TZM-766/images/202112_AWS_Black_Belt_Containers332_AppMesh.pdf

ちなみに今回の記事ではAWS App Mesh + ECS を対象にします。
EKSは私が全然できないので本記事では一旦省きます。
別途EKS覚える会をしてから実際にやってみたいと思います。

出鼻をくじかれる


最初に公式のチュートリアルがインフラ人からすると難しい。
※正直読むのすら諦めました。
https://docs.aws.amazon.com/ja_jp/app-mesh/latest/userguide/getting-started-ecs.html
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-service-discovery.html

単語が理解できないなー。
よし、BlackBelt読めばいいってことですね。

とりあえず、これを読んだ。
https://pages.awscloud.com/rs/112-TZM-766/images/20201014_Black_Belt_AWS_App_Mesh_Deep_Dive.pdf

※読むの面倒な人は以下

AWS App meshは何者なのか?結論はとても簡単でした。

ただし、やらないといけないことはこちら!

1. Virtual node の作成
2. Virtual router の作成
3. Route の作成
4. Virtual service の作成
5. Virtual node の更新
6. タスク定義の更新
7. サービスの更新

これはワードの理解が難しい系なので、
いつも通りざっくり理解を記載します。
細かく調べたら間違ってる気もしますが、大枠をとらえたと思います。

Virtual node → サービスポート情報やDNS情報&nodeとserviceの紐づけ
Virtual router → ロードバランサー/加重ルーティングのみ
Virtual service → サービスが受信したあとどこにルーティングするかを指定

実際のところ動かすだけならrouterは不要ということですね。

実際にサンプルを実行する


では、実際にサンプルを使って実行します。

Prerequisites 事前準備

このサンプル読んで実行だと詰まる部分を補足しますね。
コマンドはAWS CLI,git,dockerが実行できる必要があります。

  1. Install Docker. It is needed to build the demo application images.
    → Cloud 9環境を準備するのがベストです。 git docker コマンドがすぐに実行できます。
    ※ごめん。Cloud 9が新規で作れなくなった EC2でお願いします。

  2. 利用するIAMでアクセスキーとシークレットキーを設定して準備しましょう。
    → 当たり前だろってことだと思うのですが、書いてません。
    CLIコマンドで実行するスクリプトになっているので対象の環境にアクセスできるIAMユーザと権限が必要ですので準備しましょう。

2を実施していないとこのエラーが出ますのでご注意を!

An error occurred (UnrecognizedClientException) when calling the CreateRepository operation: The security token included in the request is invalid

検証してみた


Bootstrapの内容に沿って実施します。

https://github.com/aws/aws-app-mesh-examples/blob/main/walkthroughs/howto-ecs-basics/README.md#bootstrap

  1. Clone this repository and navigate to the walkthrough/howto-ecs-basics folder, all commands will be ran from this location
    →対象のレポジトリのcloneを取得します。
git clone https://github.com/aws/aws-app-mesh-examples.git
  1. Your account id:export
export AWS_ACCOUNT_ID=<your_account_id>

→アカウント ID は、アカウント名にあるドロップダウンメニューで確認できます。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/FindingYourAWSId.html
3. Region e.g. us-west-2

export AWS_DEFAULT_REGION=us-west-2

→AWS App meshが使えるリージョンを選択します。
https://docs.aws.amazon.com/ja_jp/general/latest/gr/appmesh.html

  1. ENVOY_IMAGE environment variable should be set to App Mesh Envoy, see https://docs.aws.amazon.com/app-mesh/latest/userguide/envoy.html
    export ENVOY_IMAGE=...
    →リージョンが近いところとか何かしらの要件があれば指定してください。
    特になければpublicが簡単でおすすめです。
export ENVOY_IMAGE=public.ecr.aws/appmesh/aws-appmesh-envoy:v1.25.4.0-prod

Deploy デプロイ

exampleに関しては、各個人で各Chapter毎に実行したいことをやってもらえればと思いますが、
今回はChapter 2: Meshify!の内容がメインです。
実際にどのようなのができていて、動いていることを実際に確認することも忘れずに実施します。

./deploy.sh deploy 2-meshify
※実行Stepなどが実施されます。
.
.
.
Successfully created/updated stack - appmesh-howto-ecs-basics
Public endpoint:
http://xxx.xxx.elb.amazonaws.com/color
※URLが実際に動作チェックするときに必要

Test テスト

リソース作成時にOUTPUTされたURLがテストでアクセスする対象ですので、以下のコードにコピーして実行しましょう。

FRONT_ENDPOINT=http://xxx.xxx.elb.amazonaws.com/color
while true; do
    curl $FRONT_ENDPOINT;
    sleep 0.5;
    echo;
done

実施中、、、

{"color":"green", "stats": {"green":1}}
{"color":"green", "stats": {"green":1}}
{"color":"green", "stats": {"green":1}}
{"color":"green", "stats": {"green":1}}

コマンドはCtrl+Cで止めれます。
これを実行したあとCloudwatchにX-Rayが統合されているのでその画面を見に行きます。


X-Rayトレースのサービスマップを確認いただくことで動作していることがチェックできます。
デフォルトは5m間隔でのマップ化なのでその期間動いているコンテナ情報はマップ化されます。

あれ?でもこれFrontに行ってなくない??
※すぐに疑問に思ったやつ。

私はこれを見て納得した

明らかにFrontへの通信がないということはFrontを経由してないのでは?がよぎりました。
よく考えてみるとこの絵を出しているのはX-RayだからFrontが乗ってるコンテナでX-Rayが通信受けるタイミングいつやろ?、、、Front → Envoy+X-Ray かだから表示されないのか??

最終納得したのはトレースでした。
以下を実行することでトレースを確認することができます。
自身の通信がどれなのか?は必須として検証しました。

1. curl -v http://xxx
→コマンド結果に表示される。
トレースIDX-Rayトレースのトレースで同じIDを見つけて確認します。

 x-amzn-trace-id: Root=<...5ba189435e99f7633fb2cd05>
 

1で確認したtrace-idをもとに対象を絞ります。

確認した対象を選択すると以下のようなトレースが表示されます。
確認頂いた通り、ちゃんと通ってますね。
...5ba189435e99f7633fb2cd05が対象です!

Frontしっかり使ってるな。なるほど!!こういう動きなのかー
と納得できたのでこの検証は終了とします。

## Teardown お片付け

When you are done with the example you can delete everything we created by running:
片付けはこちらでお願いします。

./deploy.sh delete

はい。終了です。お疲れさまでした。

まとめ


振り返り

App Meshはアプリケーション間の通信をプロキシして、通信制御を⾏うプロセス

Virtual node → サービスポート情報やDNS情報&nodeとserviceの紐づけ
Virtual router → ロードバランサー/加重ルーティングのみ
Virtual service → サービスが受信したあとどこにルーティングするかを指定

最後に動きはトレースで確認しましょう。


さいごに

今回、"やはり verboseは偉大"だなとしみじみ思いました。
-v, –verbose 処理の細かい情報(進捗情報等..)を出力する

今回のsampleで触れていない内容としてcloudwatchのdashboardがあります。

./deploy-cw-dashboards.sh

ただロードマップから画面の統合が進んでいるので上記のようなダッシュボードは今後いらなくなると予想してます。なので今後も私は検証しない予定です。

さて、今回はAWS App Meshについて触れました。
コンテナ周りをやり始めると中の動きが見えずらく難しくなってきます。
今回のような内容もインフラ屋は押させておきたいですね。

クラウド利用でインフラ屋の作業対象範囲も広がってますので、そんな悩めるインフラ屋の一助になれば幸いです。

以上


Discussion