【図解】ELB + ECSの動的ポートマッピング

2022.01.24

こんにちは、AWS事業本部コンサルティング部のたかくに(@takakuni_)です。

今回は、ECSの動的ポートマッピングについてご紹介したいと思います。

動的ポートマッピングとは

ELBのターゲットグループのデフォルト登録ポートを動的に上書き、ターゲットを登録する仕組みです。

ターゲットグループ作成時の設定項目として、ポートを指定しますがこちらはデフォルトポートとなっており、ターゲット登録時に上書き可能な設定となっております。

ポートの上書きは可能ですが、プロトコルは上書きできないためご注意ください。

動的ポートマッピングが必要なケース

公式ドキュメント

この動的なマッピングにより、同じコンテナインスタンスの単一のサービスから複数のタスクを持つことができます。

ロードバランサーの種類

図解すると以下のような構成になります。

DockerのBridgeネットワークモードでは、ホスト側とコンテナ側のポートを分けることができます。

しかし、ホスト側のポートは重複ができないためホスト側の受信ポートをタスク毎に変更する必要があります。

タスクの数が多くなればなるほどホストポートの管理が煩雑になりやすいです。

そこで使用するのが、動的ポートマッピングです。

ポートを決定しているのは誰?

動的ポートマッピングで使用されるホストポートは、コンテナインスタンスの一時ポート範囲とDockerのバージョンから動的に選択されます。

Docker バージョン 1.6.0 以降のデフォルトの一時ポート範囲は、インスタンスの/proc/sys/net/ipv4/ip_local_port_rangeに記載されています。

[ec2-user@ip-172-31-47-169 ~]$ cat /proc/sys/net/ipv4/ip_local_port_range
32768   60999
[ec2-user@ip-172-31-47-169 ~]$

Application Load Balancer

では、ポートを動的に決定し、ALBのターゲットグループへの登録は誰が行なっているのでしょうか。

CloudTrailから確認すると、ユーザー名:ecs-service-schedulerがターゲットグループに登録していることが確認できました。

また、ecs-service-schedulerは、アクセスキーがASIAから始まることからECS サービスに関連づけされたロールをAssume Roleしてターゲットに登録作業を行なっていることが確認できます。

ドキュメントでも確認ができました。

Amazon ECS タスクのスケジューリング

サービススケジューラはオプションで、タスクがElastic Load Balancingロードバランサーに登録されていることも確認します。サービススケジューラで維持されているサービスを更新できます。これには、新しいタスク定義のデプロイや、実行中のタスクの必要数の変更が含まれる場合があります。

動的ポートマッピングの注意点

動的ポートマッピングはとても便利な機能です。しかし実装には様々な制約があります。

  • ECSサービス作成時のみELBの設定ができる
  • 動的ポートマッピングは後から追加・削除などの変更ができない
  • サポートされてるロードバランサーはALB,NLB
  • awsvpc, hostネットワークモードは、動的ポートマッピングをサポートしていない

まとめ

動的ポートマッピングについて図を元にまとめてみましたが、奥が深い機能だなと思いました。

この記事がどなたかの参考になればとても嬉しいです。

以上、AWS事業本部コンサルティング部のたかくに(@takakuni_)でした!