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

2022.01.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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

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

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

動的ポートマッピングとは ELB ターゲットグループで利用するポート番号を動的に上書き、ターゲットと疎通する仕組みです。ターゲットグループ作成時の設定項目の1つにポートを指定しますが、この設定値はデフォルトポートとなっており、ターゲット登録時に上書き可能な設定となっております。

その仕組みを利用して、 1 つの ENI で複数の ECS タスクを起動できるようにした機能が、動的ポートマッピングです。

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

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

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

ただし、同じホストポートを重複して利用することはできません。そのため、複数の ECS タスク(コンテナ)を同じ EC2 上で起動したい場合は、動的ポートマッピングを利用する必要があります。

動的ポートマッピングでは、ホストポートおよび、ターゲットグループのポート番号を動的に採番、紐付けを行います。

動的ポートマッピングを利用することで、複数タスクを 1 つの EC2 上で起動できるため、リソースを効率的に利用できます。

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

動的ポートマッピングで使用されるホストポートは、コンテナインスタンスの一時ポート範囲と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 サービス作成時のみ設定ができる
  • 動的ポートマッピングは後から追加・削除などの変更ができない
  • サポートされてるロードバランサーは ALB,NLB
  • awsvpc, host ネットワークモードは、動的ポートマッピングをサポートしていない

まとめ

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

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

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