ServiceConnectとは
ECSサービス間通信を実現するソリューション
ECSサービスの間にALBを挟むなどといったケースが考えられるが、コストや運用を考えると余分にリソースを増やしたくない・・という時に良さそう
ServiceConnectを利用する際は、Cloud Mapで作成した名前空間にECSサービスを登録することで、同一の名前空間に属するECSサービスと通信できるようになります。
Memo
- Linuxコンテナのみがサポート対象
- ECSのスタンドアロンタスクでは利用できない
- 例えばEventBridgeのスケジューラーを用いた定期起動タスクで別サービスと疎通させたい!という要件がある場合、利用できない
- 異なるVPCでも利用可能 (VPCピアリング等の設定は必要)
- 同一リージョンである必要がある
- ServiceConnectエージェントコンテナがProxyとして通信する
- タスク定義に追加の記述は不要
- ServiceConnectの利用自体には料金はかからないが、エージェントコンテナのコンピューティングリソース分の料金はかかる。
使ってみた
CloudMapの名前空間・ECSサービスを作成して実際にサービス間の疎通を試してみます
※ VPCやIAM Roleの設定等は今回割愛します
CloudMapで名前空間の作成
(今回はtest-namespaceという名称で作成)
ECSリソースの作成
ECSクラスター・サービスを二つ用意します
クラスター1: service-connect-client
クラスター2: service-connect-server
それぞれのクラスターで利用するためのタスク定義も用意しておきます
コンテナイメージは、クライアント側は適当なコンテナイメージ (Amazon Linuxなどcurlが使えるコンテナイメージが望ましい)、サーバー側は httpd
を使うことにします。
サーバー側で作成するタスク定義はポートマッピングの設定が必須です。
それぞれのクラスターでECSサービスを作成
サービス1: service-connect-client
サービス2: service-connect-server
サービス作成の際、ServiceConnectの設定を済ましておく必要あり。
作成したCloudMapの名前空間をそれぞれのサービスに割り当てます。(同じ名前空間を使う必要あり)
サービス作成後、[作成したECSサービス] >「設定とネットワーク」からService Connectのエンドポイントを確認することができます
ECS Execでコンテナに入る
サービス間通信ができるかどうか、クライアント側のコンテナにECS Execを使って試してみます。
# ECS Execが有効になっていない場合は、有効化しておく
aws ecs update-service \\
--cluster service-connect-client \\
--service service-connect-client \\
--enable-execute-command
# ECS Execでコンテナ内に入る
aws ecs execute-command \\
--region ap-northeast-1 \\
--cluster service-connect-client \\
--task ${起動中のタスクID} \\
--container ${コンテナ名} \\
--interactive --command "/bin/sh"
ServiceConnectのエンドポイントに対してcurlしてみる
curl <http://https-tcp-80.test:80>
<html><body><h1>It works!</h1></body></html>
ApacheコンテナのHTMLが返ってくることが確認できたらOKです!
感想
ECSサービス間疎通においてALBを噛ませるケースが多かったので、わざわざALBを立てずに済むのは良さそうですね!
ECSタスクでも使えたらバッチ処理等でも使えてさらに良いだろうなと思います(アップデートを期待...)
参考
Service Connect を使用して Amazon ECS サービスを短縮名で接続する [AWS公式ドキュメント]
Amazon ECS Service Connect によるサービス間通信の管理 [AWS公式PDF]