新しい "Service Connect" 機能と「サービス検出」の相違点

記事タイトルとURLをコピーする

こんにちは。😀
技術課の山本です。2023年1つ目の記事です。今年もよろしくお願いします。

以前、ECSサービスのサービス検出機能に関する記事を執筆しました。

blog.serverworks.co.jp

2022年11月27日に、 "Service Connect" という新機能が登場しました。
本記事では 「サービス検出」機能(Service Discovery)と比較しつつ、この "Service Connect" 機能について紹介していきます。

公式アナウンス:
aws.amazon.com

Amazon ECS の Service Connect を使用することで、サービスエンドポイントのフレンドリ名を設定し、これらのフレンドリ名をクライアントアプリケーションで使って依存関係に接続できるようになりました。Service Connect により、Amazon ECS コンソールと AWS CloudWatch で、正常なエンドポイントへのトラフィック送信がサポートされるとともに、豊富なトラフィックテレメトリが提供されます。Amazon ECS ネイティブのデプロイは、Service Connect を利用することでさらに堅牢になります。Service Connect では自動 Connection Draining がサポートされており、クライアントアプリケーションではトラフィックエラーを発生させずに、サービスエンドポイントを新バージョンに切り替えることができるためです。

公式ドキュメント:
Service Connect - Amazon Elastic Container Service

ECSサービスの名前解決を提供する機能の選択

ECSサービスの名前解決を提供する機能である "Service Connect" と「サービス検出」はどのように使い分けると良いのでしょうか。
他にも、"App Mesh" という AWSサービスを使って、名前解決する方法もあります。

公式ドキュメントに、機能を選択する際の指針が示されています。

Interconnecting services - Amazon Elastic Container Service

要点としては以下のようです。

要点

  • Service Connect
    • Amazon ECS サービス間のみで名前解決をする時
      • AWS Cloud Map にある同一の名前空間(例:service)に所属するECSサービス同士(例:a.service / b.service)のみで名前解決できる。
      • ECSサービスと同一の VPC 内にある他の AWSサービス (EC2、Lambda など) は、ECS サービスの名前解決ができない。サービス検出と異なり、「VPC内の DNS サーバー (Route 53 Resolver) 」と、「VPCに紐づいた Route 53 プライベートホストゾーン」に依存しない名前解決方式となるため。
    • 名前解決要求に関するメトリクスやログの出力が可能
  • サービス検出
    • Amazon ECS サービス間の他、Amazon ECS サービスに他のAWSサービスから名前解決する時
      • ECSサービスと同一の VPC 内にある他の AWSサービス (EC2、Lambda など) は、ECS サービスの名前解決をすることができる。サービス検出は、「VPC内の DNS サーバー (Route 53 Resolver) 」と、「VPCに紐づいた Route 53 プライベートホストゾーン」に依存した名前解決方式となるため。
        • 該当の Route 53 プライベートホストゾーン と関連付けた VPC の中にあるリソースから、名前解決ができる。
        • 制約として、既存のサービス検出の名前空間に ECS サービスを追加するには、同じVPC にある ECS サービス である必要がある。
    • 名前解決要求に関するメトリクスやログの出力は不可能
  • App Mesh
    • 名前解決のみならず、サービス間通信の監視や制御をする時。サービス間通信の標準化(TLSによる暗号化など)や通信ログ取得を図る時。
      • ECSサービスとは異なるAWSサービスとなり、ECSサービスと連携させるため、構成は複雑化する。

Service Connect の名前解決方式

以下の公式ブログを参考に作成しています。
aws.amazon.com
実際には、各タスクの中に proxy コンテナがあるそうです。
proxy コンテナが Service Connect の エンドポイントと通信して、名前解決をしているようです。
タスクに CPU と メモリを足しておく必要があるそうです。

We recommend adding 256 CPU units and at least 64 MiB of memory to your task CPU and memory for the Service Connect proxy container.

Service Connect - Amazon Elastic Container Service

サービス検出 の名前解決方式

App Mesh の名前解決方式

新しい "Service Connect" 機能と「サービス検出」の相違点をより深く

「サービス検出」では Cloud Map 、 Route 53 プライベートホストゾーンと連携した名前解決をしていました。
"Service Connect" では Cloud Map とは引き続き連携するものの、Route 53 プライベートホストゾーン とは連携しません。
そのため、「既存のサービス検出の名前空間に ECS サービスを追加するには、同じVPC にある ECS サービス である必要がある。」という制約から解放されます。
また、VPCが異なるECSサービスで名前解決する場合に、「VPC を Route 53 プライベートホストゾーンと紐づける」作業からも解放されます。
その代わりに、ECS サービスの名前解決に特化した機能となっており、同一VPC内の他のAWSサービス (EC2, Lambdaなど)からは名前解決できません。
以下に、異なるVPCのECSサービスを名前解決する構成図を示します。(VPC間のルーティングは別途必要です。構成図には書きません。)

サービス検出

異なるVPCにあるサービスCからサービスBの名前解決をします。

異なるVPCを Route 53 プライベートホストゾーン と紐づけます。(= 異なる名前空間に存在する ECS サービスからも名前解決できます。)
逆にサービスBからサービスCを名前解決する場合には、サービスBの VPCをサービスC の Route 53 プライベートホストゾーンと紐づけます。
異なるVPC内の EC2 や Lambda からも名前解決できます。

Service Connect

同じ名前空間に異なるVPCのECSサービスを所属させることができます。(= 異なる名前空間に存在する ECS サービスからは名前解決できません。)
異なるVPC内の EC2 や Lambda からは名前解決できません。

他の相違点 その1

「サービス検出」ではサービス検出名を変更することはできませんでした。
変更するには ECS サービスの再作成が必要でした。
一方で "Service Connect" の場合には、サービス名を変更することができます。
また、"Service Connect" でサービス名を変更した場合に、既存の他サービスから変更前のサービス名を用いて名前解決可能になっています。
他サービス(クライアント側)は自身のタイミングで接続先のサービス名を変更できます。

参考:

Existing tasks and other applications can continue to connect to existing endpoints, and external applications. If a client-server service adds tasks by scaling out, new connections from clients will be balanced between all of the tasks immediately. If a client-server service is updated, new connections from clients will be balanced between the tasks of the new version immediately.

Existing tasks can't resolve and connect to the new endpoint. Only new Amazon ECS tasks that have a Service Connect configuration in the same namespace and that start running after this deployment can resolve and connect to this endpoint. For example, an Amazon ECS service that runs a client application must start new tasks after the deployment completes of the server that it connects to.

他の相違点 その2

「サービス検出」では Blue/Green デプロイに対応していますが、"Service Connect"は、ローリングアップデートのみ対応しています。
「サービス検出」ではデプロイサーキットブレーカーを使用できますが、"Service Connect"は対応していません。
デプロイの柔軟性は、まだ「サービス検出」の方が有利ですね。

新しい "Service Connect" 機能と「サービス検出」の共通点

名前解決した際に返却されるIPアドレスには、偏りがなく、均一になるようです。

サービス検出に関しては以下のブログを参照ください。
ECSのサービス検出を理解する - サーバーワークスエンジニアブログ

ECSのサービス検出機能は ランダムに 最大8個の IPアドレスを返すという動きをする

"Service Connect"については、以下のドキュメント記述があります。

new connections from clients will be balanced between the tasks of the new version immediately.

"Service Connect" 機能 を使う際の制約

いくつか代表的なものを挙げますと、以下となります。

  • Amazon ECS 以外の他のアプリケーションは名前解決できません
  • Service Connect プロキシ コンテナ用に、タスク定義には 256 CPU ユニットと少なくとも 64 MiB のメモリを追加することを推奨
  • 各 Amazon ECS サービスは、1 つの名前空間にのみ属することができる。
  • 同じ AWS アカウントの同じ AWS リージョンにある AWS Cloud Map 名前空間のみ使用可能。別AWSアカウント、別リージョンは不可。
  • クラスターを削除しても、Amazon ECS Service Connect は名前空間を削除しない。名前空間を使い終わったら、AWS Cloud Map で名前空間を直接削除する必要がある

詳細は以下のドキュメントをご参照ください。

Service Connect - Amazon Elastic Container Service

追記 2023/9/26

以下ブログも書きました!
ECS の「サービス検出」と「Service Connect」を AWS マネジメントコンソールから作成してみる

余談

毎年、冬になると夏の景色に恋焦がれます。ないものねだりですね。
北アルプスの水晶岳や鷲羽岳には、次は残雪期に行こうと計画しています。

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、サウナ、音楽鑑賞(J-Pops)、お笑い鑑賞(ラランド)