Amazon ECS Service Connect の内部的な動作 [re:Invent 2022 セッション]

# 概要

* re:Invent 2022 のセッション動画が続々と投稿されている中で気になったサービスのセッション動画を見て超絶ざっくりまとめていくというのやっていきます。
* セッション動画自体は大体1時間くらいのものが多いので、まあそれくらいは許容できるって人はセッション動画を見ていただくことを推奨します。
* **忙しくて見れません！！！という方は、こちらでキャッチアップいただければ幸いです。**

※: 深夜テンションのノリと勢いで翻訳しているので、言い回しとか適当なのはご容赦ください。ww

# Amazon ECS Service Connect: Simplified interservice communication

* コンテナによるマイクロサービスが流行っている今、サービスは増え続け、増え続けるとそれらサービス間の通信はめっちゃ複雑になるよ。管理が大変だぁ。
* だってそのサービスは、例えば Dev / Stg /Prdのように環境が複数あったり、１環境内でもあるマイクロサービスの１つのサービスがバージョン管理されてるかもしれないし、コンテナのオートスケーリングとかまで考慮したらと思うと・・
* だから俺ら(aws)は良いソリューションを出してきたんだぜ


![スクリーンショット 2022-12-15 3.45.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/1c32a540-154e-579f-8199-8b87b40a9b18.png)

* サービス間通信を実現するための方法としては3つあるぜ。それがこれだ。
  * Amazon ECS Service Discovery
  * Elastic Load Balancing (ELB)
  * AWS App Mesh

![スクリーンショット 2022-12-15 3.45.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/005e59d9-46de-e8b2-6c03-a21719547f57.png)

* Amazon ECS Service Discoveryは、めっちゃシンプルになん。めっちゃシンプルになん！！！
* まあ要は、AWS Cloud Map でプライベート名前空間を作成すると、Route 53 ホストゾーンが自動的に作成されるので、ECS がスケールアップまたはスケールダウンすると自動的に更新してくれるってことですねぇ。

はーんなるほど。
これだと、トラフィックテレメトリは提供してくれないと言ってますね。なので、メトリクスとロギングに関する実装は自分らで考え出す必要があるよーと。

![スクリーンショット 2022-12-15 3.46.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/b608b42f-ee46-825d-a072-36b8b48c9598.png)

* Elastic Load Balancing は、よくサービス間の相互接続で使われるやつっす。
* ECS 前段に LB おいているだけだから分かりやすいー
* 使い方は、LB にECSタスクをターゲットとして登録しておくだけ。
* スケーリングしても見てくれるし、トラフィックテレメトリも提供してくれる。DDos保護とかも。
* だけどだけど、VPC内のサービスに関しては、これらの機能はっているっけ？と。
* やりすぎ感半端ないからイケてないよねと言ってます。
 
![スクリーンショット 2022-12-15 3.46.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/ca95a9da-27d0-9b80-42cb-aafcdd6227b7.png)

* AWS App Mesh は、マネージドなサービスメッシュソリューション。
* Envoy をサイドカーに配置してプロキシとして使うやつね。
* しかも、ユーザに代わってメトリクスを収集してくれる
* んで、きめ細かいトラフィック制御もできると、例えば暗号化とか認証とかも。
* だけど柔軟すぎてちょー複雑。

![スクリーンショット 2022-12-15 3.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/84ea77b4-7b4a-02ad-5343-a11bae57ec5a.png)


**そうだからこれらの良いところを組み合わせられんのかと考えた・・・**
**そして、生まれたのは「Amazon ECS Service Connect」**

ふーー！Yeahh

![スクリーンショット 2022-12-15 3.47.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/36ea64a5-cf36-bb72-5867-523a663074da.png)

* 使い方は、簡単よ。アプリケーションを作成した時にトラフィックが流れるエンドポイントを指定するだけよん
* 接続も簡単で、メトリクスもECSのマネコンかCloudWatchから見れるときた。

実際にやってみると
* まずは、サービスの名前を決めて、名前空間も定義する。
* クライアントは、サービス名と名前空間の組み合わせで接続するよん。
* ECSクラスターを跨いだ名前空間の指定もできるよん。
* VPCを跨いだ指定もできるよん。
* AWSアカウントを跨ぐのはできないよん。
* リージョン跨ぐのもできないよん。

![スクリーンショット 2022-12-15 3.47.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/3962ff03-3a0f-35cd-7081-27360504eba6.png)

* Reliablity も担保してるぜ！
* 例えば、トラフィックレベルのヘルスチェックをして異常検出の処理とかもやってる。
* エラーによる失敗が起きても再試行を自動でやってたりもする。

![スクリーンショット 2022-12-15 3.48.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/4c55ef63-ca40-2660-8941-bcc7df2d1c35.png)

* ECS Service Connect 使うとゼロダウンタイムのデプロイもできるぜ。
* connectionドレインをサポートしている。
* アプリケーションが正常なエンドポイントに接続できるようにヘルスチェックとかサポートしているので、デプロイ時にタスク置き換えが発生しても、トラフィックの制御が入るのでということを言いたいらしい。

![スクリーンショット 2022-12-15 3.48.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/c4802f88-c0c8-0bfb-7b24-0fd338297bb8.png)

こう動くをこれから話すぜ。あとは頼んだ。でSDEの人がいろいろ語り始める。

* 実際にサービスコネクトを設定するときは下記のような設定を書くらしい。

![スクリーンショット 2022-12-15 3.49.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/ed142131-be2a-a4df-bba7-c29217525f32.png)

* そして、基本的なECSでサービス作る時の動きを話してますねっ!(ケイスケホンダ風)
* ECSにリクエスト送ると、インスタンスが作成され、タスク定義をもとにタスクができると。
* んで、ECS Service Connect を有効にしているとこんな感じに、ECS Task に Service Connect Agent が追加されるらしい。

* そして、Service Connect Agent の中身は、Envoy と Agent の2つのコンポーネントがいる。
* Agent 側は、Envoy の正常性を監視し、常に稼働しているらしい。また、Envoyが提供するメトリクスをCloudWatch に 60秒間隔でPushしているらしい。

![スクリーンショット 2022-12-15 3.39.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/37d40e74-154a-1013-685a-04f9b9d79aa7.png)


* 次に Service Connect にリクエストを送るとどうに動くのかを説明しています。
* フロントエンドがいてバックエンドがいてというサービスを仮定してます。
* ユーザはフロントエンドにリクエストをくるために前段の LB に対してリクエストが送られてくると、LB はフロントエンドのサービスに、フロントからバックエンドは直接通信してます。
* リクエストを受けると、LB は フロントエンドサービスが実行されているポートに送信。
* リクエストは、Service Connect に送信されるか、Service Connect Agentにリダイレクトされるように設定
* 下記の図が分かりやすいですね。

![スクリーンショット 2022-12-15 3.57.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/d20034e8-67ae-baaf-0977-5386d1c84230.png)


* 次は Reliable についてですね。

![スクリーンショット 2022-12-15 3.58.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/ba3e90c2-eca0-db6a-d3ae-2a7ec34554f5.png)

* 例えばバックエンド側のタスクが何かしらの原因で落ちた時に、フロント側のService Connect agent は、通信したけど死んでるタスクを検知して、別のエンドポイントへ自動的に再試行する。

![スクリーンショット 2022-12-15 4.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/72d9c1da-8036-fcef-3a79-8b09ae9a611e.png)

* なるほど、バックエンド側のタスクがずっと例えば5XXを返す場合だと、Service Connect Agent が正常なルーティング先のリストから一時的にエンドポイントの情報を削除する動きとかもやってくれるらしい。

![スクリーンショット 2022-12-15 4.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/44dd4560-5583-0c14-4b21-0e5bdd224a9b.png)


* 最後に Deployについて語っています。

![スクリーンショット 2022-12-15 3.59.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/3eb31f43-5967-b778-a2ea-16ca1f3a7632.png)

* Deploy 時も Reliable で語っていた動作と一緒ですね。
* タスクの状況で例えばまだDepoly直後で正常稼働できないタスクがあった時も、検知して、接続を受け入れられないタスクのエンドポイントではなく、別のエンドポイントに対して再ルーティングするみたいですね。
* いやぁよくできている。

![スクリーンショット 2022-12-15 4.15.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/8b1861c8-9011-b0d6-b71c-9ff0905c716c.png)


* このあと、価格や対応リージョン、後日あったワークショップの案内とかの話だったので、割愛。


# まとめ

* Amazon ECS Service Connect は便利
* ワールドカップ期間中は寝れん。
* 以上！！


# 参考資料

https://www.youtube.com/watch?v=1_YUmq3MpYQ