安全に Classic Load Balancer から Application Load Balancer に移行する

Posted on

8 月に発表された新しい ELB の Application Load Balancer (ALB) をいろいろと検証しています。特に HTTP/2 をサポートしてくれたのはとても嬉しいです。

すぐにでもプロダクション環境で使いたい ALB ですが、これまで ELB と呼ばれていた既存の Classic Load Balancer (CLB) から移行するにはそれなりの手間とリスクが伴います。

できるだけ楽をしつつ、安全に CLB から ALB に移行する方法を検証してみました(移行そのものはユーザーに本質的な価値を生まないので楽をするのは大切)。

elastic-load-balancing-tools でマイグレーションする

手作業だと必ずミスが起きるので、AWS が GitHub で公開している elastic-load-balancing-tools というマイグレーションスクリプトを使います。既存の CLB を指定すると、移行できるかチェックした上で ALB と Target Group を作成してくれます。

このツールは Python で書かれており Boto 3 に依存しています。自分は virtualenv で環境を作りました。

$ git clone git@github.com:aws/elastic-load-balancing-tools.git
$ cd elastic-load-balancing-tools
$ virtualenv .
$ . bin/activate
$ pip install boto3

今回は web という名前の CLB を ALB に移行してみます。 dry run すると移行できるかチェックしてくれます。

$ ./copy_classic_load_balancer.py --name web --region ap-northeast-1 --dry-run
Your load balancer configuration is supported by this migration utility

問題なさそうなので --dry-run オプションを外して実行します。

$ ./copy_classic_load_balancer.py --name web --region ap-northeast-1 --register-targets
Your Application Load Balancer is ready!
Application Load Balancer ARN:
arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxxxxxxx:loadbalancer/app/web/1f02ff9c1df5d94e
Target group ARNs:
arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxxxxxxx:targetgroup/web-tg-80/cd44efeaf733f809
Considerations:
1. If your Classic load balancer is attached to an Auto Scaling group, attach the target groups to the Auto Scaling group.
2. All HTTPS listeners use the predefined security policy.
3. To use Amazon EC2 Container Service (Amazon ECS), register your containers as targets.

ALB と Target Group が一緒に作成されていますね。 --register-targets オプションを付けると Target Group に EC2 インスタンスの登録までやってくれます。

ちなみに、AWS CLI で ALB を扱うときは elbv2 というサブコマンドを使います。

$ aws elbv2 describe-load-balancers --query 'LoadBalancers[].LoadBalancerArn'
[
    "arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxxxxxxx:loadbalancer/app/web/1f02ff9c1df5d94e"
]

もともとあった elb コマンドは CLB しか操作できません。

Route 53 の Weighted Routing Policy を使う

新しい ALB のエンドポイントに DNS を向ければ作業完了ですが、プロダクション環境で一気に切り替えるのはリスクが大きすぎます。特定のクライアントだけで起きる問題は QA では防ぎきれません。

そこで活用したいのが Route 53 の Weighted Routing Policy (加重ルーティングポリシー)です。

トラフィックを指定した比率でラウンドロビンしてくれるので、段階的に移行していくことができます。最初はごくごく小さい割合のユーザーを ALB に向けるのが良いでしょう。

ALB にすべてのトラフィックを向けたら、CloudWatch でリクエストがないことを確認した上で CLB を削除します。

まとめ

マイグレーションスクリプトと Route 53 の Weighted Routing Policy を使えば、安全に Classic Load Balancer から Application Load Balancer に移行できることがわかりました。

ALB の HTTP/2 や WebSocket サポートも気になるのですが、ALB は CLB に比べて 10% 安くなっているのでコスト面でも移行するメリットがあります。 freee ではそれなりの数の ELB を利用しているので、塵も積もれば山となりそうです。