ランサーズ Advent Calendar 2020 7日目の記事でございます。
皆様お久しぶりでございます。SREチームの@adachin0817です。タイトルの通り、SREチームではランサーズ内の各サービスをECS/Fargateへ移行する取り組みを行っています。その中でコンテナにしてよかったこと、課題等含めて振り返ってみたいと思います。
2020/4〜
去年にシクロマーケティング社がランサーズのグループにジョインされました。現Lancers Creativeという月額定額制のクリエイティブサービスをAWSに移行することになり、初の試みであるECS/Fargateにチャレンジすることになりました。新技術への挑戦に対してかなり時間をかけてしまいましたが、この経験を元に他のグループ会社のインフラやランサーズをコンテナへ移行する計画を整うことができました。次に今年4月に移行してから半年ほど経ちましたが、移行して良かったことや、課題をまとめていきたいと思います。
・開発メンバーだけでRuby/Railsを最新にバージョンアップができた
EC2と比較すると、ランサーズではAnsibleを運用しており、我々SREチームへの工数がなんとしてもかかってしまいます。逆に開発メンバーにAnsibleを修正してもらうというのも学習コストもかかってしまいます。コンテナの場合はDockerfileで完結し、テスト等は開発環境やStg環境へCircleCIでデプロイすればいいので、バージョンアップ対応まで1ヶ月で対応することができました。基本的にはインフラやアプリ面、全て開発チームに任せることができ、インフラでのちょっとした相談で済むようになりました。これは凄い…
・本番環境にSSHでログインすることがない
Fargateというマネージドサービスにしたこともあり、ログの確認はすべてCloudWatch Logsで確認することができました。またログの転送はAmazon KinesisでリアルタイムでS3にシンクしています。なので調査するために不要なSSHのportを開ける必要がないので、セキュアな環境が実現できたと思います。
・コンテナ台数を増やすためにはタスク起動数を変更するだけで良い
こちらもEC2と比較すると、AMIを取得、もしくはAnsibleで構築してアプリをデプロイするまでの工数がかかりますが、コンテナの場合はサービスのタスク起動数をTerraformで変更するだけなので、あっという間に構築が終わります。
・開発環境が重い
Docker for MacのファイルシステムがLinuxと違うため、ページ遷移が遅いという課題があります。ここらへんはdocker syncの検証や不要なファイルやディレクトリはmountしないなど改善していこうと思いましたが、以下の記事によりgRPC FUSE
をOFFにすることで、ページ遷移が5秒から1秒まで高速化しました。開発環境が遅いことがあれば試してみてください。
https://blog.hanhans.net/2020/11/28/docker-for-mac-slow-again/
・コンテナデプロイまでに10分以上かかる
CircleCIでのコンテナデプロイでネックなのはbundle installに時間がかかってしまうことです。ここはマージ後に走らせるのではなく、commitしてpushするタイミングでコンテナデプロイするのが時間削減になるので修正していこうと思います。
・コンテナでのオートスケールを経験していない
まだまだ小さいサービスということもあり、負荷対策としてコンテナでのオートスケールを経験したことがないので、ランサーズ本家移行の時にテストをする方向でいきたいと思います。
あとはTryでやっていきましょう!以下技術的な内容はブログ書いているので参考にしてください。
グループ会社のインフラをECS/Fargateに移行して振り返る
2020/5~
一段落して、5月からはグループ会社である「Lancers Agency株式会社」のサービスをECS/Fargate移行計画が始まりました。このサービスはCakePHPで動いているので、ランサーズに近い環境となっております。ようやくPostifixからSendgridに移行、アップロード系の処理をS3へ移行が完了したところで、あとはStg環境で一通りテストができれば今月12月には移行できる予定です。コーポレートサイトはWordPressで動いており、こちらはコンテナに既に移行済みとなっています。移行後にやることは以下になります。
・PHP/CakePHPのバージョンアップ
現在PHPは5.5、CakePHPは2.5.4を利用しています。先月PHP8もリリースしたということもあって、SREチームと開発メンバー含めて対応していきたいと考えています。
また、9月にアソビューさん、コネヒトさんで合同LT大会も行ったのでコンテナ活用について登壇させていただきました。技術的な部分は以下参考にできればと思います。
【アソビュー×ランサーズ】AWSでのオーケストレーションツールの活用事例(EKS vs ECS)を開催しました!
【コネヒト×ランサーズ】コネヒトマルシェ「事業を支えるWeb開発」vol.2を開催しました。
2020/10~現在
10月からはMENTAがグループジョインされました。個人なお話になるのですが、副業でMENTAを使っているということもあり、一緒に仕事ができる!ということもあって、なかなか感慨深いところもありました。また、業務委託でMENTAのサーバーを全て管理していたということもあり、アクセス数も伸びているので、こちらもさくらのクラウドからECS/Fargateに移行することになりました。現状のインフラ移行について進捗を共有しましょう。
https://signal.diamond.jp/articles/-/325
・開発環境
開発環境はランサーズと同様の環境にするため、作り直しからプロジェクトが始まりました。今回は機能ごとに8つのコンテナで実装することにしました。AppコンテナはAlpine Linuxで構築しています。LancersAgencyの開発環境を参考にしたということもあり、1日で実装することができました。MENTAではPHP7.2、Laravel5.4を利用していますが、今後バージョンアップをする予定です。
・Stg環境
・本番環境
Stg環境は今までの構成とは少し違って、Redashやランサーズと同様に分析基盤/Embulk,Digdag,BigQuery(BI)を運用したいとのことで、コストダウンのためEC2で構築することにしました。それ以外はLancersAgencyと環境は同等です。現在は一部S3への画像アップロードが対応していないため、コンテナ内に画像がアップロードされてしまい、デプロイ時に消えるという現象が発生しています。こちらも早急に対応しているところです。Stg環境とは別に、本番のデータも見れるようにテスト環境を作りたいということで、もう一つAppコンテナを用意することになりました。こちらはランサーズと同じ運用でPrivate環境となります。
・デプロイ
CIは現在GitHub Actionsを利用しているので、CircleCIに寄せようとしています。それ以外にもTerraform CIも動いているので、。コンテナデプロイはAPI経由でStg、Privateにリリース、Masterマージで本番リリースするように実装しています。Slackでもリリースを実装中です。
MENTAは移行後に詳しく技術的な部分を書きますのでまたの機会に!
ランサーズ本家の移行は?
・現状の構成
現在ランサーズ本家はEC2でオートスケールを利用して運用しているので、まずはAmazon Linux 1から2に移行を取り組んでいます。またSRE/QAの金澤さん、QAのまみーさんが主体となって、CakePHP4にバージョンアップを行っています。その後管理画面をCake4とPHP8にしてからECS/Fargateに移行し、本体のバージョンアップが完了後、実施となる見込みになっています。なので長い時間をかけて取り組むという認識でございます。
まとめ
直近の課題としてはまずは今月中にLancersAgencyの各サービスを移行することと、MENTAの移行をやりきることですね!そしてSREチームが今どんな課題に向けて取り組んでいるのか雰囲気が伝わったかと思います。もちろんコンテナ移行以外にも改善するところはたくさんあります。なので….
SREが足りません!
気になる方はぜひ応募待ってます!
明日はつっちーさんです!