この記事は公開されてから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 ~]$
では、ポートを動的に決定し、ALBのターゲットグループへの登録は誰が行なっているのでしょうか。
CloudTrailから確認すると、ユーザー名:ecs-service-schedulerがターゲットグループに登録していることが確認できました。
また、 ecs-service-scheduler は、アクセスキーがASIAから始まることから ECS サービスに関連づけされたロールを Assume Role してターゲットに登録作業を行なっていることが確認できます。
ドキュメントでも確認ができました。
サービススケジューラはオプションで、タスクがElastic Load Balancingロードバランサーに登録されていることも確認します。サービススケジューラで維持されているサービスを更新できます。これには、新しいタスク定義のデプロイや、実行中のタスクの必要数の変更が含まれる場合があります。
動的ポートマッピングの注意点
動的ポートマッピングはとても便利な機能です。しかし実装には様々な制約があります。
- ECS サービス作成時のみ設定ができる
- 動的ポートマッピングは後から追加・削除などの変更ができない
- サポートされてるロードバランサーは ALB,NLB
- awsvpc, host ネットワークモードは、動的ポートマッピングをサポートしていない
まとめ
動的ポートマッピングについて図を元にまとめてみましたが、奥が深い機能だなと思いました。
この記事がどなたかの参考になればとても嬉しいです。
以上、AWS事業本部コンサルティング部のたかくに(@takakuni_)でした!