コデアルでエンジニアやってます高際です。AWSへの移行をリードしてやっていました。移行が無事に終了したものでその報告をさせていただきます。
5月14日にコデアルのメインのインフラがさくらインターネットから、AWSに移行されました。移行前後でのアーキテクチャの図をまずは御覧ください。
旧アーキテクチャ
新アーキテクチャ
あら、なんということでしょう。劇○ビフォー・アフターのBGMが流れてきます。
サービスの成長に伴い、より安定して、早くユーザの皆様にサービスを提供するためにAWS化を行いました。今回は、AWSの大枠の方針を書き、技術的な細かいところは別途記事にさせていただきます。
今回の主な特徴としては下記が挙げられます。
- AWSの環境の構築はTerraformを使用
- ECSを中心としたアーキテクチャ
Terraform
Terraformの使用はとても賢い選択でした。属人性を排除したコードによるインフラ管理。PRベースのコードレビューによるインフラ変更のダブルチェック。本番環境と開発環境の共通化ができ、インフラ構築の時間が短縮され安定化しました。
運用面ですが、terraform applyを実行するPRには、terraform planの実行結果を添付するようにしています。これにより、実行する前になにが新しく追加され、削除されるかを再確認することができるからです。Terraformで些細の変更のはずが、リソースを削除する変更になってしまう場合もあります。その際はPRで一度冷静になって見直しましょう。
Terraformの難点をあげるとすれば、最初の取っ掛かりにくさです。HCLという独自フォーマットなので慣れるまで少し時間がかかります。ただドキュメントは整理されてきているので、だんだん敷居は低くなってきています。Terraformを習得するのに一番の近道は、まずはWeb Consoleで自分のやりたいこと一度行う。その後、Terraformのコードに落とし込むという手順です。先にTerraformから入ると、どのパラメータがどれに当たるかが検討がつきづらいので、まずはマニュアル運用、後にコード化という方針が良いです。
なお、TerraformはCircle CIで実行されております。
ECS
ECSに関してもこちらも良い選択でした。Containerとしてアプリケーションを閉じ込めることができるので、独立性が高く、変更が用意になりました。今までは Ansibleでインフラの構築の自動化を行っておりましたが、Dockerのほうが手軽に変更が加えられます。デプロイもECSにまかせ、グリーン・ブルーデプロイメントができるのでデプロイも用意になりました。今回は、ECSは2つのクラスターを構成しました。Frontend と Backendです。Frontend に関してはコンパイルされたJSなどのアセットをs3にあげて、AngularJSがクライアントで動くため、Frontendのアプリケーションサーバには多くのリクエストは来ません。一方、Backendに関してはREST APIを提供しているため、マシンのリソースをFrontendに比べ多く消費します。これらの特性から、Frontendは弱いインスタンス、Backendは強いインスタンスのクラスターにしました。
ECSにしたことにより、問題点も出てきました。
- バッチ処理
コデアルのBackendはRailsで動いており、Batch処理も同じRailsが担当しています。Cointainer 化して複数のAZで立てると重複なくBatch処理を実行するには、別途ロジックを書かないといけないので、Batchに関してはEC2のBatchサーバが動かしております。AWS BatchがTokyo Regionにきたら置き換えることを検討しています。
- デプロイの手順が多い
Docker イメージのビルド、ECRへのアップロード、TaskDefinitionの作成、更新、サービスの更新とやることが多いです。これらをShellで全て書くのは辛かったので、Deploy用のユーティリティを自作しました。こちらはOSSとして公開してありますが、まだまだ習熟度は低いので今後アップデートしていきます。
https://github.com/giwa/ecs-deploytool
- いつデプロイされたかわからない
グリーン・ブルーデプロイメントでダウンタイムなく、デプロイされるのはいいのですが、いつ切り替わったかがわかりにくくなりました。デプロイ後、テストのために見たいがいつ見ればいいかがわからないという問題がおきました。こちらは、lambdaでECSのイベントをSubscribeし、Containerの状態をSlackに通知が来るようにしました。
- ログの集約
複数台でアプリケーションを運用することになったので、ログを集約する必要がありました。アプリケーションはFluentdでログ集約し、Docker HostのEC2はカスタムメトリックスでCloudWatchにログを集めています。
AWS移行が終わったのでチームで引っ越しそばを食べに行きました!移行の際は、チームや、外部の青木さまにも助言いただきき、今回は無事移行を終えました。あらためてお礼申し上げます。今後共コデアルをよろしくお願いします。