AWS ECS ServiceConnectを試してみた - ありログ

ありログ

ITに関するテーマや日常に関してゆるく発信します

AWS ECS ServiceConnectを試してみた

ServiceConnectとは

ECSサービス間通信を実現するソリューション

ECSサービスの間にALBを挟むなどといったケースが考えられるが、コストや運用を考えると余分にリソースを増やしたくない・・という時に良さそう

 

構成図の例 (同一VPC内でECSサービス間通信)



ServiceConnectを利用する際は、Cloud Mapで作成した名前空間にECSサービスを登録することで、同一の名前空間に属するECSサービスと通信できるようになります。

Memo

  • Linuxコンテナのみがサポート対象
  • ECSのスタンドアロンタスクでは利用できない
    • 例えばEventBridgeのスケジューラーを用いた定期起動タスクで別サービスと疎通させたい!という要件がある場合、利用できない
  • 異なるVPCでも利用可能 (VPCピアリング等の設定は必要)
  • 同一リージョンである必要がある
  • ServiceConnectエージェントコンテナがProxyとして通信する
    • タスク定義に追加の記述は不要
  • ServiceConnectの利用自体には料金はかからないが、エージェントコンテナのコンピューティングリソース分の料金はかかる。

使ってみた

CloudMapの名前空間・ECSサービスを作成して実際にサービス間の疎通を試してみます

VPCやIAM Roleの設定等は今回割愛します

CloudMapで名前空間の作成

AWS Cloud Mapから名前空間を作成します

(今回はtest-namespaceという名称で作成)

インスタンスの検出は「API呼び出し」にしておく



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のエンドポイントを確認することができます

 

エンドポイントは「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]