ちょっと話題の記事

Amazon ECSのELB構成パターンまとめ(ALB対応)

2016.08.18

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

ども、大瀧です。
DockerクラスタリングのマネージドサービスであるAmazon ECSにここ数週間で大きなアップデートがあり、AWSのロードバランササービスであるELB(Elastic Load Balancing)との組み合わせ方が大幅に増えました。この記事ではパターンとその使い分けについて解説してみます。

ECSとELBのアップデート概要

ECSでは、ここ数日で以下のアップデートがアナウンスされています。

日本語の情報としては、AWS公式ブログが詳しいです。

今回のELBとの組み合わせとしては、動的ポートとホストネットワークのサポートが関わってくるところです。

一方で、ELBには新しいロードバランサとしてALB(Application Load Balancer)がローンチされました(従来のELBはClassic Load Balancerと呼びます)。

こちらの日本語情報は、手前味噌ですが弊社大栗の記事が参考になります。

ECSのELB構成

ELBからのトラフィック転送にはオーバーレイネットワークなどDocker向けネットワーク構成ではなく、ロードバランサのノードとECSホスト間のネットワークがそのまま利用されます。そのため、ECSのELB構成パターンとしては、ELBの種類ECSホストのポート構成の組み合わせになります。では、パターンごとに見ていきましょう。

パターン1 : 動的ポート&ALB

今回のECS/ELBのアップデートで新たに利用できるようになった組み合わせで、docker runコマンドの-Pオプションに相当する設定です。ECSエージェントはタスク(Dockerコンテナ)の実行時にコンテナのポートをホストの空いている動的ポートにバインドし、ECSはALBのターゲットグループにホストとその動的ポート番号をセットで登録します。

ECSのタスク定義では、ホストポートを0に設定します。

ecs-elb01

ロードバランサにはインスタンス毎に異なるポート番号を設定するため、インスタンスのポート番号を揃える必要のあるClassic Load Balancerには使えません。

以下にメリット/デメリットをまとめます。

  • メリット
    • 複数のECSタスクを同一ホストで実行できる
    • ECSクラスタのインスタンス数よりも多数のECSタスクをECSサービスで実行できる
  • デメリット :
    • パターン2,3に比べトラブルシューティングの難易度が高い
    • Classic Load Balancerが使えない
    • ECSタスクを実行するインスタンスが偏ると、ECSクラスタ内でインスタンスのリソース不均衡が起きる

パターン2 : ホストネットワーク

こちらも、今回のECSのアップデートで新たに利用できるようになったものです。docker runコマンドの--network hostオプションに相当します。ホストのネットワークスタックに直接コンテナのネットワークインターフェースをバインドするため、コンテナでListen/Exportするポートとホストのポートは同一になり、ロードバランサにはホストとコンテナのポート番号が登録されます。

ホストネットワークを利用するためには、ECSのタスク定義で[Network Mode]をHostに設定します。

ecs-elb02

ポートの設定では、ホストポートが表示されずコンテナポートのみの入力になります。

ecs-elb03

では、こちらもメリット/デメリットを。

  • メリット :
    • パターン3よりもネットワークパフォーマンス上有利
    • ELBは、ALBとClassic Load Balancerのどちらも可能
    • パターン1よりもトラブルシューティングの難易度は低い
  • デメリット :
    • 同一のECSタスクは1ホストにつき1タスクまで
    • ホストのポート番号が変更できない

パターン3 : 固定ポート

docker runコマンドの-pオプションに相当する、従来の構成です。

ホスト側でiptablesによるNAPT処理が入るため、パターン2と比べるとネットワークパフォーマンスの面で不利です。メリット/デメリットは以下のようになります。

  • メリット
    • コンテナのポート番号とは別にホストのポート番号が指定できる
    • ELBは、ALBとClassic Load Balancerのどちらも可能
    • パターン1よりもトラブルシューティングの難易度は低い
  • デメリット :
    • 同一のECSタスクは1ホストにつき1タスクまで
    • パターン2よりもネットワークパフォーマンス上不利

まとめ

ECSでのELB構成について、3つのパターンをご紹介しました。 ECSタスク配置の柔軟性から、今後は動的ポート&ALBが主流になっていくと思います。Classic Load Balancerを使う場合はパターン2と3のどちらかの選択になりますが、公開されるポートはELB側で任意に設定出来るため、ホストポートの変更が要件になることはあまりないと考えられます。そのため、パターン2を積極的に利用するのが良いでしょう。

なお、3パターンそれぞれでタスク定義が異なるので、パターン間でタスク定義の流用ができない点に注意しましょう。

参考URL