[AWS]ECS Service Connectとは

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/service-connect.html

ECSのサービス同士を、ALB を立てずにサービス名で通信させる仕組み。内部 ALBやCloud MapのService Discoveryの代わりになり、ALBの費用も相手のタスクIPの管理もなくなる。

仕組み

例としてアプリは backend:50051 に繋ぎにいくだけで、相手のタスク IPを把握する必要がない。デプロイ時に ECS が各タスクへ Envoyのプロキシを自動で足し、名前を解決する。タスク定義にプロキシは書かなくてOK。

名前の登録先はCloud MapのHTTP 名前空間。サーバー側がどのポートをどの名前で公開するかを宣言し、クライアント側は名前空間に参加するだけで引けるようになる。タスクが複数あればプロキシが振り分け、入れ替わっても追従する。

portNameタスク定義の portMappings に付けた名前と対応させる。

APIで確認するときは services[0].deployments[0].serviceConnectConfiguration を確認すること。この設定はサービスの属性ではなくデプロイに紐づくので、services[0].serviceConnectConfiguration は存在しない。

ドハマリしたところ

  • デフォルトで通信は暗号化されない

Service Connectのプロキシは平文で待ち受ける。TLSで接続するとClientHelloが平文として解釈され、ハンドシェイクに失敗する。

内部 ALB は TLS を終端するため、ALB 経由を前提にしたクライアントをそのまま Service Connect へ向けると止まる。環境名で TLS の有無を決めていると、同じ環境名のまま接続先だけが変わるケースで切り分けられない。別のフラグを用意するのが良い。

TLSを使うならAWS Private CAとの連携が必要で、証明書の発行と更新は ECS が行う。

  • 名前はタスクの外から引けない

HTTP名前空間はDNSレコードを作らないので、手元のPCからも踏み台からも同じVPCのEC2 からも引けない。内部 ALBなら踏み台から疎通確認できたが、その手段はなくなる。代わりにECS Execでタスクに入れば中から試せるので、enableExecuteCommandを有効にしやしょう。

まとめ

用意するものが名前空間とサービス定義だけで済むのはむちゃくちゃ便利。ALBを1台減らせるのも、タスクIPを気にしなくていいのも楽。魅力的なのはコスト削減になる。

その代わり、名前がタスクの中でしか引けなくなるのと、暗号化が無効な点や、ALBから移すときは忘れそうなので、接続側の設定を見直して注意するべしっ。

Was this helpful?

0 / 0

コメントを残す