[AWS]ECSとALBを使ったパスに従ったルーティング

コンニチハ、千葉です。

ALBのパスベースルーティングを利用すると、URLに従ったターゲットグループ(インスタンスのグループ)へルーティングできます。ECSも、こちらのパスベースルーティングに対応しているため試して見ました。

【新機能】新しいロードバランサー Application Load Balancer(ALB)が発表されました

メリット

振り分けのイメージです。

20170806-ecs-alb-path-rules-0-1

このように1つのALB、1つのECSクラスター上で、ECSサービス(コンテナ群)に対しパスルーティングを行えます。これの応用ですが、以下のような構成も可能です。

20170806-ecs-alb-path-rules-0-4

Classicロードバランサー時代アプリケーションを分けるには、アプリケーションごとにロードバランサーを用意する、または1つのロードバランサーとアプリケーションごとにポートを用意するという構成しかありませんでした。 大きなメリットしてALBでは、ロードバランサー1つで、EC2やECSサービスなど柔軟にパスで振り分けることができます。一部のアプリケーションを切り出し、ECSを利用しマイクロサービス化するということもできるようになります。

また、ALBひとつで済むのでコスト面や、管理面でもメリットがあります。

やってみた

ECSのサービスごとにALBを使ったパスベースでの振り分けをやってみました。

20170806-ecs-alb-path-rules-0-3

まずはECS環境が必要ですが、チュートリアルでALB指定の環境を構成しました。この環境に新しくサービスを追加していきます。チュートリアルでなくてもいいですが今回の作業はECSとALBが作成されていることを前提にします。

20170806-ecs-alb-path-rules-1

サービスの追加

サービス2を追加します。「/app2/*」へのアクセスはサービスBへルーティングするような構成を設定していきます。

それではサービスを作成していきます。

20170806-ecs-alb-path-rules-2

アプリケーションなどは任意に指定します。(アプリケーション2と分かりやすいように、サンプルとは別に事前にタスク定義を作成しています)

20170806-ecs-alb-path-rules-3

「ELBの設定」を選択します。

20170806-ecs-alb-path-rules-4

任意のECSサービスロールを選択し、ELBへの追加をクリックします。

20170806-ecs-alb-path-rules-5

20170806-ecs-alb-path-rules-6

これで、パスルールよるコンテナ振り分けができるようになりました。

「http://xxxx/index.html」へのアクセス

20170806-ecs-alb-path-rules-7

「http://xxx/app2/index.html」へのアクセス

20170806-ecs-alb-path-rules-8

理解を深める

設定自体はこれでできましたが、ECSとALB側の連携がどうなっているか不思議になったので確認してみました。

基本的には以下のようになります。

ECSサービスとALBとの関係

EC2の場合、ターゲットグループに対してターゲット(EC2)を手動で登録解除します。また、EC2のAutoScaling利用時には、AutoScalingに対してターゲットグループを指定します。ECSの場合どのような挙動になるか確認しました。

ターゲットグループに対するECSサービスの登録

ECSの場合は手動でやらなくても、ECSが自動で登録・解除してくれます。ECS側でポート番号とEC2インスタンスの情報を持っているので、ECS側で登録してくれるんですね。この機能を利用するにはECSのサービス作成時にターゲットグループを指定します。

ALBターゲットグループのターゲットを確認すると、ポートとインスタンスが登録されていますがこれはECS側で登録したもになります。

20170806-ecs-alb-path-rules-9

また、ECSサービス数を変更(起動するコンテナ数を変更)した場合も、自動でALBのターゲットグループに追加されます。なのでALBのターゲットグループは意識しなくても大丈夫そうです。

ALBのパスルールの追加

ECS側でALBターゲットグループを作成したタイミングで、ALBのリスナーにルールが追加されます。

20170806-ecs-alb-path-rules-10

ALBを利用して、HTTP/HTTPS両方受けたい場合は、ALBのリスナーを追加し、パスルールを設定することで対応できました。

20170806-ecs-alb-path-rules-11

ルールはHTTP/HTTPS同じに設定しておきましょう。

さいごに

パスルールに従い、コンテナへの振り分けを試して見ました。かなり柔軟性が高い構成にできそうです。

参考

http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/service-load-balancing.html