https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/service-connect.html
ECSのサービス同士を、ALB を立てずにサービス名で通信させる仕組み。内部 ALBやCloud MapのService Discoveryの代わりになり、ALBの費用も相手のタスクIPの管理もなくなる。
仕組み
|
1 2 3 4 5 6 |
┌─ frontend のタスク ─────┐ ┌─ backend のタスク ──────┐ │ アプリ ──> SCプロキシ │ ───> │ SCプロキシ ──> アプリ │ │ backend:50051 │ │ localhost:50051 │ └────────────────────────┘ └─────────────────────────┘ ↕ 登録・名前解決 Cloud Map の HTTP 名前空間 |
例としてアプリは backend:50051 に繋ぎにいくだけで、相手のタスク IPを把握する必要がない。デプロイ時に ECS が各タスクへ Envoyのプロキシを自動で足し、名前を解決する。タスク定義にプロキシは書かなくてOK。
名前の登録先はCloud MapのHTTP 名前空間。サーバー側がどのポートをどの名前で公開するかを宣言し、クライアント側は名前空間に参加するだけで引けるようになる。タスクが複数あればプロキシが振り分け、入れ替わっても追従する。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
// ECS側 "serviceConnectConfiguration": { "enabled": true, "namespace": "arn:aws:servicediscovery:...:namespace/ns-xxxxx", "services": [{ "portName": "backend-8080-http", "discoveryName": "backend", "clientAliases": [{ "dnsName": "backend", "port": 8080 }] }] } // クライアント側はservicesを書かなくてヨシッ |
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
1989年生まれのSRE 。ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。 現在はサービスの信頼性向上、DevOps、可用性、レイテンシ、パフォーマンス、モニタリング、オブザーバビリティ、 緊急対応、AWSでのインフラ構築、Docker開発環境の提供、IaC、新技術の検証、リファクタリング、セキュリティ強化を担当している。
個人事業主では数社サーバー保守とベンチャー企業のインフラコンサルティングを行うほか、TechBullを創業し、ジュニアエンジニアのコミュニティを運営している。さらに、エンジニア向けYouTubeメディア「TECH WORLD」ではSRE関連の動画に出演し、過去には脆弱性スキャナ「Vuls」のOSS活動にも貢献。 ガジェット系エンジニアYouTuberとしても発信。