SREチームの安達(@adachin0817)です。今回WordPressサーバーであるEC2からECS/Fargateに移行しましたが、紆余曲折を得て、苦労したところ、技術的な部分、最終的には複数のリポジトリを一つにまとめたことなどを紹介したいと思います。まずはプロジェクトとサーバーの構成から説明していきましょう。
ランサーズのWordPressとECS時代のサーバー構成
- https://engineer.blog.lancers.jp
- https://info.lancers.jp
- https://l-ap.jp
- https://connect.lohai.jp
- https://lohai.jp
- https://tips.lancers.jp
- https://www.lancers.co.jp
- https://www.lancers.jp/assistant/cases
- https://www.lancers.jp/category/logo
- https://www.lancers.jp/magazine
- https://www.lancers.jp/sharebiz
- https://www.web-20.net
- EC2時代のサーバー構成
- デプロイリリースフローについて
ランサーズのWordPressは現在12個のプロジェクトがあり、リポジトリ単位で管理していました。また、AWSではEC2/Amazon Linux 2(Nginx,PHP-FPM)で運用しており、オートスケールは使用せずに二台で冗長化構成を保っていました。開発環境はDockerでできているものの、AnsibleでのNginxの設定ファイルを管理したり、自前のデプロイシステムの設定などをしなければならなく、工数が非常にかかっていました。
また、EC2でオートスケールを導入したとしても自前のデプロイシステムへの依存が発生してしまい、定期的にAMIの取り直しが必要となります。課題としてはデプロイシステムのメンテナンスも大変ですし、DockerベースとCircleCIのみに変更してデプロイサーバーを廃止することです。
ECS/Fargate + EFSのWordPressコンテナ構成
- 各リポジトリでのデプロイ
そこで、Amazon EFSのパフォーマンスが向上したということもあり、ECS/Fargate + EFSの構成に移行しました。開発環境で利用しているDockerfileを元に、Stg環境、本番環境のWordPressコンテナのデプロイをCircleCIで行い、WordPressのソースコードはCodeBuildを利用してEFS内でgit pullを実行するように実装しました。また、自前のデプロイサーバーを廃止することができました。また、オートスケールによる負荷分散も今回導入しました。技術的な部分は以下私の個人ブログを参考にしてください!
- サーバーレスポンス
- コスト
しかし、EFSだとサーバーレスポンスが平均で約3秒となってしまい、プロビジョニングドIOPのコストが高く、EC2と比べて6倍近く増加してしまいます。また、各リポジトリにCircleCIのデプロイも管理していることから、エラーが出てしまうと12個も修正をしなければなりません。CloudFrontも導入を考えましたが、一部対応していないドメインなどがあり、わざわざ複雑な構成にする必要にすべきなのかとチームと話し合った結果、この構成を諦めることにしました。以下SREチームの金澤(@yakitori009)が以前スペースマーケットさんと勉強会をした際に、LT資料を貼りますので、細かい技術的な部分は以下を参考にしてもらえばと!(ただオススメはしません。。)
現在の構成とデプロイについて
- ECS/サービス
- CircleCIでのデプロイ
- レイテンシー
- リポジトリの容量
[~/www/lancers_wordpress]
adachin@ > du -sh
1.8G .
結局のところ、複数のリポジトリを一つにまとめてlancers_wordpressというリポジトリに移行しました。リポジトリ/コンテナの容量は約2GBほどでした。ここではDev、Stg、本番のDockerfileを管理し、CircleCIでのStg環境デプロイはAPIを利用しシェルスクリプトでリリース、Masterマージでの本番環境のリリースを実装しました。自前のデプロイツールでは約1分ほどでデプロイ可能ですが、ソースコードをコンテナにコピーするとなると約7~8分はかかります。しかし、コストがEC2時代とほぼ同等であること、レイテンシーも約1秒まで改善できました。
振り返って
以前ECS/Fargate + EFSに移行したけども、やはりCodebuildやら複数プロジェクトのリポジトリを管理するにはなかなか大変だったので、結局全プロジェクトを一つまとめて、コンテナ内にコピーするようにした。デプロイの時間は7,8分と遅くなったけどもいいんじゃない〜
— adachin👾SRE (@adachin0817) April 30, 2021
思いっきりモノリス化だけど、なんで最初からこうしなかったんだろうと言うくらいすっきり解決した。 https://t.co/QJTIkK7erz
— やきとり (@yakitori009) May 6, 2021
Amazon EFSを導入するにはまだ早いと感じましたし、個人的には一つのリポジトリで全てのメディアを管理できたので分かりやすく、シンプルとなりました。今後新しいメディア等増えても工数をかけずに構築することも可能になりましたし、CodeBuidの経験もできたので結果的によかったと思います。ぜひWordPressの運用はECS/Fargateで参考にできればと思います!
SREも募集しておりますので、興味がある方はTwitterでDMいただければと思います!