はじめに
Globee Advent Calendar11日目の記事です。
abceedのサーバーサイドの開発及びインフラを担当している清水が、abceedが現在抱えている課題とその改善案についてご紹介します。
abceedインフラの現状
abceedのバックエンドには、APIサーバーが稼働しており、abceedの大半の機能が実装されています。
このAPIサーバーのインフラは、下図の通り、AWS API GatewayからLambdaを実行するシンプルな構成となっています。
解決したい問題
API GatewayとLambdaを組み合わせた構成は、フルマネージドのサーバーレス環境のため、コストを抑えて運用でき、規模が小さいWebサービスでは問題が起こりづらいですが、規模が大きくなるに従って、以下のような制約が次第に開発に影響を与える様になってきました。
- Lambdaクォーターが250MB上限であり、現状アプリケーションのサイズが上限近くになっているため、新しいレイヤーやライブラリの追加が容易にできない
- Lambda関数のタイムアウトなどの実行時間に関する制限があり、時間のかかる処理が行えない
- SQSなどを使用して、別の仕組みを用意する必要があります
- サーバーレスフレームワークとしてZappaを使用していることもあり、ファイルを直接ダウンロードするようなAPIを実現できない
- ファイルをダウンロードしたい場合は、対象のファイルをS3に保存して、別途S3からダウンロードするフローになります
- ファイルサイズが小さいことが想定される場合は、ファイルをBase64でエンコードしてテキストで返すことはできますが、レスポンスサイズが大きくなり、フロント側でデコード処理も必要になります
移行計画
これらの制約を解消するため、下図のようにAPIサーバーをECS Fargate環境に移行することを検討しています。
ECSは、用意したDockerコンテナでアプリケーションを実行できます。開発時のローカル環境ではDockerを使用しているため、ECSでAPIサーバーのインフラを構築することは難しくありませんでした。
ただ、現在abceedはMAU30万を超えるアクセスがあり、API Gateway+LambdaからECS Fargateに一気に切り替えるのはリスクが高すぎると考えました。
そこで、API Gateway+LambdaとECS Fargateを並行稼働させて、トラフィックの比率を徐々にECS Fargateに移していくことで、最小限のリスクで安全に移行させていきます。
上記を実現するために、API GatewayとECS Fargateにリクエストを分散させる必要があります。リクエストを分散させるために、最初ALBのルールでターゲットグループへの重みを振り分けることで実現しようと考えていました。
ところが、この方法では以下の問題が発生し、実現できないことがわかりました。
- ターゲットグループにAPI Gatewayのステージを直接指定することができない
- VPNエンドポイント経由することで、API GatewayにPrivate IPを割り当て、ターゲットグループに指定することは可能ですが、その場合URLのパスの接頭にAPI Gatewayのステージ名を指定する必要です
- 例) https://abceed.com/stage_name/hoge/fuga
- 今回はAPI GatewayとECSで同じURLからアクセスして、AWS Cloud内でリクエストを分散させたいので、パスが変わってしまうこの方法は採用できません
そこで、Route53の加重ルーティングを使用して、リクエストを分散させることにしました。
加重ルーティングは、同じレコード名のレコードに対して、個々に指定した重量(重み)に応じた比率でリクエストを分散させてくれます。
移行中のインフラ構成(Route53加重ルーティングによるリクエスト分散)
これで、API GatewayとECS Fargateを並行稼働させつつ、徐々にリクエストの比重をECS Fargageに移していく環境が構築することができました。
最終的には、API Gatewayの重量を0、ECS Fargateの重量を100に設定して、完全にECS Fargateに移行し、API Gateway+Lambdaの環境を廃止することができます。
終わりに
API Gateway+LambdaからECS Fargate並行する準備としては、更に以下のことを検討する必要がありますが、今回は割愛します。
- 本番環境の負荷状況を想定した負荷試験
- ECS Fargate環境で稼働させた場合のインフラコストの試算
本記事で紹介した移行計画は、現在開発環境で検証を行っている段階で、本番環境へのリリースは近日行う予定です。abceedのインフラ及びAPIサーバーは、多くの課題を抱えているので、今後もインフラ環境を改善して開発スピードを上げ続けていきます。
株式会社Globeeでは、バックエンドエンジニアを積極的に募集しております。カジュアル面談にて弊社の「教育」にかける思いや「ものづくり」の考え方についてお話できればと思いますので、お気軽にご応募ください。
採用サイト